怎么调用远程注入后DLL中的函数

xdf008 2009-10-23 11:05:09
dll里写了个Add函数,也导出了,直接在exe里调用dll没问题,然后我把这个Dll注入到其他进程后不会调用Dll里的Add函数(注入是成功的),网上找了N久也不知道怎么搞,都说像LoadLibraryA一样调用,但是这个LoadLibraryA是全局的,所以进程里都有加载这个kernel32,而且网上说这个在每个进程里的地址一样,我自己注入的可不是全部进程注入的

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("遠程執行成功");
}
}


typedef int (*lpAdd)(int a,int b);


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问一下
...全文
948 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
战狼之羊 2012-10-18
  • 打赏
  • 举报
回复
18搂的大大,好犀利。
Dr.Yao 2009-11-01
  • 打赏
  • 举报
回复
首先是对远程执行概念上的理解有错误

1.用CreateRemoteThread在目标进程创建远程线程执行LoadLibraryA,实现注入,这个没有错。
2.同理的,你想要远程执行你DLL的Add函数,也必须使用远程线程调用,参考上一条。
3.你通过GetExitCodeThread取得的HMODULE是目标进程(远程)的模块基址,而你却在本地使用(GetProcAddress),当然是不存在的模块。


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; //hDll是目标进程的Your.dll的HMODULE,在这里可并不存在
if(hDll!=NULL)
{
AddFunc=GetProcAddress(hmdll,"Add"); //这样是错误的,应该让GetProcAddress和上面的LoadLibraryA一样在目标进程里执行(它有两个参数,所以不好直接用CreateRemoteThread,再议)
DWORD aa= GetLastError();//这每次都是126(找不到模块)
if(AddFunc!=NULL)
{
AddFunc(2,3); //假设上面的GetProcAddress已解决,这样也是错误的,依然需要在目标进程调用,道理和上面一样
AfxMessageBox("遠程執行成功");
}
}




如果非要使用远程线程来实现远程调用,有点麻烦:
首先你要写一个过程,包括以下操作(大意):
void CallAddThread(LPVOID arg)
{
hModule = LoadLibary(YourDll);
pFun = GetProcAddress(hModule,"add");
((Add)pFun)(arg.a,arg.b);
}
///这么写是完全不行的,只是一个大概意思

先在目标进程申请一块可执行的内存,然后把这个过程的代码WriteProcessMemory到目标进程的内存里(申请为可执行的),然后在CreateRemoteThread这个CallAddThread。

虽然就这么几步,实际上会涉及更多的问题。
首先CallAddThread要在远程执行,所以里面调用的任何函数都需要真实的函数地址,而不是本地使用的那种API使用方法,"add"这个变量也不能直接使用等等一系列问题。不多说了,我自己都晕了

最简单的办法,还是使用进程间通信吧。
大意:注入的DLL启动一个线程,等待一个事件,事件触发则从共享内存中读取参数执行ADD。而你的程序则负责“发号施令”。

prodiving 2009-10-31
  • 打赏
  • 举报
回复

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("遠程執行成功");
}
}




GetExitCodeThread获得远程加载的dll HMODULE是可以的,
但是接下来你用这个HMODULE来给本进程的GetProcAddress就错了啊,哈哈,

你可以先在本进程LoadLibraryA加载后再GetProcAddress Add的地址,地址减去LoadLibraryA返回的那个得到一个偏移,根据这个偏移加上GetExitCodeThread获得的值,就可以算出所以被你注入的进程里面的dll的add函数地址咯
Lings 2009-10-29
  • 打赏
  • 举报
回复
用GetModuleHandle,另外

[Quote=引用 楼主 :]
LPVOID pFunc = LoadLibraryA;
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID )
[/Quote]

不能直接把LoadLibraryA传给CreateRemoteThread,而应该用:

PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
Fzergling 2009-10-29
  • 打赏
  • 举报
回复
hDLl = GetModuleHandle("YouDll.Dll");不行?
deping_chen 2009-10-25
  • 打赏
  • 举报
回复
其实你可以让你注入的线程做间谍工作,然后,通过内存映射文件或其他适合你的要求的技术进行进程间通信,来达到你的母的.我的GDILeakDetector就是这么做的.直接调用函数是不可能的.
你只要达到你的目的就行了,而直接调用注入到别的进程的DLL函数显然不是你的目的.
jamseyang 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 deping_chen 的回复:]
GDILeakDetector大概是我2007年写的一个工具,用于检测程序里的GDI资源泄漏.如果有匹配的调试符文件和源代码文件,它能定位泄漏的位置.这是对我所学知识的一次大阅兵.呵呵.我最早发往www.codeproject.com,现在好像已经很流行了.
[/Quote]
牛人呀!
  • 打赏
  • 举报
回复
用这个吧 CreateRemoteThread

参考

DWORD dwID;
LPVOID pFunc = LoadLibraryA;
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
xdf008 2009-10-23
  • 打赏
  • 举报
回复
怎麼獲得LoadLibraryA的返回值?
xdf008 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
HMODULE hmdll=(HMODULE)hDll;??
[/Quote]
直接
AddFunc=GetProcAddress(hdll,"Add");?
“GetProcAddress”: 不能将参数 1 从“DWORD”转换为“HMODULE”
xbottle 2009-10-23
  • 打赏
  • 举报
回复
fandh兄真快
MoXiaoRab 2009-10-23
  • 打赏
  • 举报
回复
HMODULE hmdll=(HMODULE)hDll;??
xdf008 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 deping_chen 的回复:]
像你这样注入DLL我用过,在网上搜一下GDILeakDetector,你可以找到源代码.
但我认为一个进程调用另一个进程中的函数,必须要通过RPC,DCOM,CORBA这些类似地技术实现,直接调用是不可能的,因为不在一个地址空间.必须要打包,拆包,也就是marshal,unmarshal.中文词很混乱,我觉得就叫打包,拆包.

[/Quote]
大哥你的太深奧了,菜鳥只學點基礎的...
xdf008 2009-10-23
  • 打赏
  • 举报
回复
是網上找來的,只是中間加了點東西,網上的注入后都沒寫調dll函數的...
那個結構直接傳進去就可以了?不用管lpAdd怎麼接受的?
還有LPVOID pAddFunc=lpAdd;這個入口地址怎麼得到?再用GetProcAddress?這就繞回去了..
希望再指點一下,謝謝
deping_chen 2009-10-23
  • 打赏
  • 举报
回复
GDILeakDetector大概是我2007年写的一个工具,用于检测程序里的GDI资源泄漏.如果有匹配的调试符文件和源代码文件,它能定位泄漏的位置.这是对我所学知识的一次大阅兵.呵呵.我最早发往www.codeproject.com,现在好像已经很流行了.
deping_chen 2009-10-23
  • 打赏
  • 举报
回复
像你这样注入DLL我用过,在网上搜一下GDILeakDetector,你可以找到源代码.
但我认为一个进程调用另一个进程中的函数,必须要通过RPC,DCOM,CORBA这些类似地技术实现,直接调用是不可能的,因为不在一个地址空间.必须要打包,拆包,也就是marshal,unmarshal.中文词很混乱,我觉得就叫打包,拆包.
MoXiaoRab 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xdf008 的回复:]
LPVOID pAddFunc=lpAdd;
HANDLE hThreadAdd=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pAddFunc,??,0,&dwID);
參數位置用什麽?弄個結構?
lpAdd里可沒有解析結構的代碼
再一個參數還要用VirtualAllocEx在遠程進程里開內存?再WriteProcessMemory?
[/Quote]
对啊。就是这么注的啊
MoXiaoRab 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xdf008 的回复:]
引用 1 楼 tr0j4n 的回复:
HMODULE hmdll=(HMODULE)hDll;??

直接
AddFunc=GetProcAddress(hdll,"Add");?
“GetProcAddress”: 不能将参数 1 从“DWORD”转换为“HMODULE”
[/Quote]
这代码是你自己写的好吧?

xdf008 2009-10-23
  • 打赏
  • 举报
回复
LPVOID pAddFunc=lpAdd;
HANDLE hThreadAdd=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pAddFunc,??,0,&dwID);
參數位置用什麽?弄個結構?
lpAdd里可沒有解析結構的代碼
再一個參數還要用VirtualAllocEx在遠程進程里開內存?再WriteProcessMemory?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧