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语言写得很规范主要还是原理重要点,格式有垃圾请谅解! 并不是任何DLL在不同进程中加载时,地址都相同,只有特定的那么几个! gunxsword 发表于 2019-9-7 11:48
并不是任何DLL在不同进程中加载时,地址都相同,只有特定的那么几个!
那如果地址不同,怎么获取被注入进程的DLL模块地址呢? 注入用的这个LOAD他所在的DLL,是在不同进程中相同地址的,注入也是用的这个特性
他返回的句柄,就是你注入的DLL的模块地址
如果是别人的程序自己加载的,或是其它方式注入的,可以遍历对方进程模块信息,得到地址
还有其它方法,以上是相对常用的 这些是不是海域要pe的相关的知识呢?? A学习的小菜鸟 发表于 2019-10-13 21:49
这些是不是海域要pe的相关的知识呢??
要的可以了解一下pe,对逆向帮助很大{:1_901:}
页:
[1]