1. 起因
某次卡饭hips浏览中,看到某高大上进程注入方式(主要是某人头发长),惊为天人,技术堪称猥琐之王(抬高了?),额。。。不捧了。由于没有样本,也没有搜索到资料,只能作罢。
某天,突然来了兴致,要分析个样本,随便在卡饭样本区下了个感觉挺啥啥的样本,一分析,你妹,咋这么熟悉呢,居然就是同类的进程注入,然后某人就有了下面的文章。
2. 分析与实现
2.1 PEID
壳信息:Microsoft Visual C++ v6.0,无壳
文件名:bbs.exe
既然无壳,直接ida先分析一下,遇到无法分析的OD继续调试。
2.2 分析
打开IDA,拖入文件,找到主函数:
1 | .text:0040A720 ; int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) |
没什么东西,继续sub_408929:
1 | .text:00408929 sub_408929 proc near ; CODE XREF: WinMain(x,x,x,x)+15 |
其他函数都没有什么重要的代码,接着看看myReleaseFile,代码太多,直接f5看看整体流程,结构:
1 | int __cdecl myReleaseFile() |
由于在myWork中太多混淆,IDA无力,转战OD,看到高大上的进程注入。由于代码混淆,太多PE操作,而且IDA没有有效识别内存拷贝函数,给分析带来了较大困难。
下面是主要的进程注入用到的函数表,myWork中调用这些关键函数,都是通过该函数表调用,里面通过loaddll+getprocaddress获取到函数地址,返回,然后调用:
1 | .data:004FB87F myLocalSize1 dd offset myLocalSize ; DATA XREF: .text:00402CAC r |
获取函数的代码结构:
1 | .text:004089B0 myLocalSize proc near ; CODE XREF: .text:00402CAC p |
最后基本总结了myWork的代码逻辑,也一窥了进程注入的猥琐:
1 | CreateProcessA(0, "svchost.exe", 0, 0, 0, 4/*CREATE_SUSPENDED*/, 0, 0, &sa, &pi );//按suspend创建进程,这样主线程就会挂起,等待后面的宰割 |
3. 总结
本来打算完整分析一下的,在分析到进程注入时,由于自己代码实现中,遇到了一些问题,调试无语,eop和基地址都改写了,那么就是映射section遇到问题,终于修改成
直接pe完整写入宿主进程,成功执行了注入进程的功能。
所以,后面也没时间具体分析样本的功能了。
测试了该方式,无法过掉主防,在WriteProcessMemory就会被拦截,所以该方式基本只是作为技术研究,直接使用,还需努力。
4. 参考
[1] http://www.cnblogs.com/lbq1221119/archive/2008/07/22/1248706.html
[2] http://blog.csdn.net/darthas/article/details/12569443