如何调用远程注入后DLL中的函数
怎么调用远程注入后DLL中的函数
dll里写了个Add函数,也导出了,直接在exe里调用dll没问题,然后我把这个Dll注入到其他进程后不会调用Dll里的Add函数(注入是成功的),网上找了N久也不知道怎么搞,都说像LoadLibraryA一样调用,但是这个LoadLibraryA是全局的,所以进程里都有加载这个kernel32,而且网上说这个在每个进程里的地址一样,我自己注入的可不是全部进程注入的
GetProcAddress 后GetLastError 每次都是126,确认dll是注入成功的,有用工具查看过
怀疑这个GetProcAddress 是进行注入的Exe执行的,所以系统就在这个exe的模块里去找那个dll了,所以找不到
最后,RT问一下
------解决方案--------------------
------解决方案--------------------
dll里写了个Add函数,也导出了,直接在exe里调用dll没问题,然后我把这个Dll注入到其他进程后不会调用Dll里的Add函数(注入是成功的),网上找了N久也不知道怎么搞,都说像LoadLibraryA一样调用,但是这个LoadLibraryA是全局的,所以进程里都有加载这个kernel32,而且网上说这个在每个进程里的地址一样,我自己注入的可不是全部进程注入的
- C/C++ code
DWORD dwID; LPVOID pFunc = LoadLibraryA; HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID ); WaitForSingleObject( hThread, INFINITE ); //do DWORD hDll; lpAdd AddFunc; GetExitCodeThread( hThread,&hDll ); HMODULE hmdll=(HMODULE)hDll; if(hDll!=NULL) { AddFunc=GetProcAddress(hmdll,"Add"); DWORD aa= GetLastError();//这每次都是126(找不到模块) if(AddFunc!=NULL) { AddFunc(2,3); AfxMessageBox("遠程執行成功"); } }
- C/C++ code
typedef int (*lpAdd)(int a,int b);
- C/C++ code
extern "C" __declspec(dllexport) int __stdcall Add(int a,int b) { return theApp.Add(a,b); }
GetProcAddress 后GetLastError 每次都是126,确认dll是注入成功的,有用工具查看过
怀疑这个GetProcAddress 是进行注入的Exe执行的,所以系统就在这个exe的模块里去找那个dll了,所以找不到
最后,RT问一下
------解决方案--------------------
------解决方案--------------------
- C/C++ code
DWORD dwID; LPVOID pFunc = LoadLibraryA; HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID ); WaitForSingleObject( hThread, INFINITE ); //do DWORD hDll; lpAdd AddFunc; GetExitCodeThread( hThread,&hDll ); HMODULE hmdll=(HMODULE)hDll; if(hDll!=NULL) { AddFunc=GetProcAddress(hmdll,"Add"); DWORD aa= GetLastError();//这每次都是126(找不到模块) if(AddFunc!=NULL) { AddFunc(2,3); AfxMessageBox("遠程執行成功"); } }
------解决方案--------------------
首先是对远程执行概念上的理解有错误
1.用CreateRemoteThread在目标进程创建远程线程执行LoadLibraryA,实现注入,这个没有错。
2.同理的,你想要远程执行你DLL的Add函数,也必须使用远程线程调用,参考上一条。
3.你通过GetExitCodeThread取得的HMODULE是目标进程(远程)的模块基址,而你却在本地使用(GetProcAddress),当然是不存在的模块。
- C/C++ code
DWORD dwID; LPVOID pFunc = LoadLibraryA; HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID ); WaitForSingleObject( hThread, INFINITE ); //do DWORD hDll; lpAdd AddFunc; GetExitCodeThread( hThread,&hDll ); HMODULE hmdll=(HMODULE)hDll; //[color=#FF0000]hDll是目标进程的Your.dll的HMODULE,在这里可并不存在[/color] if(hDll!=NULL) { AddFunc=GetProcAddress(hmdll,"Add"); //[color=#FF0000]这样是错误的,应该让GetProcAddress和上面的LoadLibraryA一样在目标进程里执行(它有两个参数,所以不好直接用CreateRemoteThread,再议)[/color] DWORD aa= GetLastError();//这每次都是126(找不到模块) if(AddFunc!=NULL) { AddFunc(2,3); //[color=#FF0000]假设上面的GetProcAddress已解决,这样也是错误的,依然需要在目标进程调用,道理和上面一样[/color] AfxMessageBox("遠程執行成功"); } }