如何得到目标进程中加载的DLL的函数地址并远程调用
百折不挠
2011-04-02, 10:43:15
进行DLL注入时发现,注入的DLL中的函数只能调用预先放在DLLMAIN中的函数,这样注入的DLL编写很不灵活,能不能注入目标进程后,根据不同的需要在目标进程中远程调用DLL中的不同函数?
比如:
DLL中导出三个函数
a()
b()
c()
如果要注射后调用a函数,就要把a放在dllmain中,而且只是一次性的,注入完成后要再让目标进程调用b函数的话,要怎么办??
问题在于,要调用函数b,就要在目标进程中找到函数b的地址,要怎么动态的取得函数b在目标进程中的地址?e枚举出目标进程中加载的DLL模块句柄,再用GetProcAddress好象不行。
比如:
DLL中导出三个函数
a()
b()
c()
如果要注射后调用a函数,就要把a放在dllmain中,而且只是一次性的,注入完成后要再让目标进程调用b函数的话,要怎么办??
问题在于,要调用函数b,就要在目标进程中找到函数b的地址,要怎么动态的取得函数b在目标进程中的地址?e枚举出目标进程中加载的DLL模块句柄,再用GetProcAddress好象不行。
-
CamelLu
2011-04-02, 12:41:29
http://hi.baidu.com/89419883/blog/item/97dfbf9aa2c6db036f068cb5.html
可以参考下这个
可以参考下这个
-
百折不挠
2011-04-02, 17:06:29
感谢CamelLu,确实,要在目标进程中找到DLL的函数地址,就要在目标进程中调用GetModuleHandle和GetProcAddress函数,要把以下代码放到目标进程中执行。
Pushad
pushfd
Mov EBX ,ls //ls是注入的模块路径在目标进程中的指针
Push EBX
Mov ECX ,GetModuleHandle //这两个函数地址可以在本地进程中得到。
Call ECX
Mov EBX,ls2 //要调用函数的导出名在目标进程中的地址
Push EBX
Push EAX
Mov ECX,GetProcAddress
Call ECX
Call EAX //GetProcAddress返回的地址在eax中,这里只是调用无参数的函数,如果有参数就很麻烦了。
popfd
Popad
Ret
这样处理了以后,DLL中要执行的无参数函数就可以不用放在DLLMAIN中了,DLL中可以做很多函数进去,放便在不同的目标进程中注入,可以让DLL更具有灵活性。
Pushad
pushfd
Mov EBX ,ls //ls是注入的模块路径在目标进程中的指针
Push EBX
Mov ECX ,GetModuleHandle //这两个函数地址可以在本地进程中得到。
Call ECX
Mov EBX,ls2 //要调用函数的导出名在目标进程中的地址
Push EBX
Push EAX
Mov ECX,GetProcAddress
Call ECX
Call EAX //GetProcAddress返回的地址在eax中,这里只是调用无参数的函数,如果有参数就很麻烦了。
popfd
Popad
Ret
这样处理了以后,DLL中要执行的无参数函数就可以不用放在DLLMAIN中了,DLL中可以做很多函数进去,放便在不同的目标进程中注入,可以让DLL更具有灵活性。
来自:http://bbs.pediy.com/archive/index.php?t-131746.html //dll注入成功后,如何执行dll里面的函数。