lgh520 发表于 2019-9-7 11:00

C语言实现远程注入原理

一、首先我们要了解一个再简单的demo程序,包括什么都没有的黑窗口程序,都会在程序加载的时候都会有如下两个dll载入所以我们根据此我们可以干很多事情了。

(如果要查看程序加载了哪些dll可以利用od附加目标程序)
(1)
(2)
二、如果dll被加载,我们可以随心所欲的使用另一个进程来使用dll中的函数,所以我们就想如果想办法把我们的dll加载到目标程序中,那么不就可以使用我们dll中的函数了吗?


三、那我们怎么实现在别人程序上加载我们的dll呢?二中我们说了只要dll被加载我们就可以使用dll中的函数(可以这么认为,我们两个进程同时使用一个dll时在你进程dll中的api地址相同,如果想执行别人api我们还要知道api的地址,所以dll这一特性,让我们调用api提供了便利),这里就不得不提到Windows的强大api了
HANDLE CreateRemoteThread(HANDLE hProcess,// handle to process
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
DWORD dwStackSize,                        // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
LPVOID lpParameter,                     // thread argument
DWORD dwCreationFlags,                  // creation option
LPDWORD lpThreadId                      // thread identifier);
这个函数就是为我们干坏事奠定的良好的基础,他不同于CreateThread()这个api就是远程创建线程api最重要的就是第四个参数和第五个参数,分别是api地址和传入参数,我们自己进程中的api地址和目标程序api地址完全相同,但条件是加载了相同的一份dll,每个程序都有kernel32.dll,期中我们需要的api是
HMODULE LoadLibrary(LPCTSTR lpFileName   // file name of module);
FARPROC GetProcAddress(HMODULE hModule,    // handle to DLL moduleLPCSTR lpProcName   // function name);
这两个函数功能在一起就是找到api的地址,我们要找到的api地址就是Loadlibrary
HMODULE LoadLibrary(LPCTSTR lpFileName   // file name of module);
然后使用CreateRemoteThread远程调用loadlibrary将dll加载即可,这就是神秘的远程注入原理
LPSTR dllpathname = "C:\\Users\\Administrator\\Desktop\\win32\\隐式链接\\Debug\\隐式链接.dll";
        DWORD PID = 0;
        SIZE_T dllnamelen = strlen(dllpathname) + 1;
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
        LPVOID virtualaddr = VirtualAllocEx(hProcess,NULL,dllnamelen,MEM_COMMIT,PAGE_READWRITE);
        if (!virtualaddr)
        {
                DWORD errorcode = GetLastError();
                switch(errorcode)
                {
                case ERROR_INVALID_HANDLE:
                        {
                                return FALSE;
                        }
                default:
                        {
                               
                        }
                }
        }
        BOOL reslut = WriteProcessMemory(hProcess,virtualaddr,dllpathname,dllnamelen,NULL);
        //将我们dll名字加载到目标程序中方便loadLibrary使用
        DWORD errorcode = GetLastError();
        printf("%d\n",errorcode);
        HMODULE hmodule = GetModuleHandle("kernel32.dll");
        if (hmodule)
        {
                printf("模块获取成功!\n");
        }
        lpLoadLibrary moduleloadlibrary = (lpLoadLibrary)GetProcAddress(hmodule,"LoadLibraryA");
        if (moduleloadlibrary)
        {
                printf("%x\n",moduleloadlibrary);
        }
        //创建远程线程
        HANDLE threadhandle = CreateRemoteThread(
                hProcess,
                NULL,
                0,
                (LPTHREAD_START_ROUTINE)moduleloadlibrary,
                virtualaddr,
                0,
                NULL);
        if (threadhandle)
        {
                printf("成功载入模块!\n");
        }

并没有把c语言写得很规范主要还是原理重要点,格式有垃圾请谅解!

gunxsword 发表于 2019-9-7 11:48

并不是任何DLL在不同进程中加载时,地址都相同,只有特定的那么几个!

bester 发表于 2019-9-7 12:00

gunxsword 发表于 2019-9-7 11:48
并不是任何DLL在不同进程中加载时,地址都相同,只有特定的那么几个!

那如果地址不同,怎么获取被注入进程的DLL模块地址呢?

gunxsword 发表于 2019-9-7 12:07

注入用的这个LOAD他所在的DLL,是在不同进程中相同地址的,注入也是用的这个特性
他返回的句柄,就是你注入的DLL的模块地址
如果是别人的程序自己加载的,或是其它方式注入的,可以遍历对方进程模块信息,得到地址
还有其它方法,以上是相对常用的

A学习的小菜鸟 发表于 2019-10-13 21:49

这些是不是海域要pe的相关的知识呢??

lgh520 发表于 2019-10-18 15:22

A学习的小菜鸟 发表于 2019-10-13 21:49
这些是不是海域要pe的相关的知识呢??

要的可以了解一下pe,对逆向帮助很大{:1_901:}
页: [1]
查看完整版本: C语言实现远程注入原理