我们要Hook shell32.dll的SHCreateProcess这个函数,苦于他没有被导出,也无从知道地址。
其实我们还是有办法的。windbg有功能叫做栈回朔技术,可以看到函数的调用者,函数的调用者的调用者,函数的调用者的调用者的调用者。。。。。。。。。。。。。。。。。。(略过1000字)
原理是什么呢?我们知道函数的调用是靠栈来完成的,每当调用一个函数,都会把函数的返回地址存入栈中。
windbg就是看栈中的返回地址来确定调用者的。
好,铺叙完毕。看看SHCreateProcess这个函数,他的地址我们虽然不知道,但是我们知道他会调用CreateProcessW,那我们Hook了CreateProcessW后,假装调用ShellExecute(内部会使用SHCreateProcess函数),回朔调用者,就能得到SHCreateProcess的大致地址了(因为得到的是CreateProcessW返回到SHCreateProcess内部的地址,而不是SHCreateProcess的首地址,所以我说是“大致地址”)。
(2016-8-3更新:有朋友私信问我SHCreateProcess的原型,我当时在网上搜得到,现在看了看好像找不到了,还好我的工程里还有,定义如下:
typedef int (__stdcall *PSHCreateProcess)(int p1,HANDLE hToken,wchar_t *lpApplicationName,wchar_t * lpCommandLine,DWORD dwCreationFlags,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,int p2,char p3,int p4);
)
<