首页
社区
课程
招聘
[原创]一招秒杀感染文件中的病毒代码
发表于: 2011-1-13 10:59 6473

[原创]一招秒杀感染文件中的病毒代码

2011-1-13 10:59
6473

几天前从朋友那得到一个被感染的文件,大致分析了一下,该病毒并没有修改被感染程序的入口点先执行自己的代码再跳回原程序,只是加了一个区段,然后在在程序正常执行的流程中添加了一个call指向病毒代码,完成后在jmp回原程序继续执行。
004128EA   .  E8 F1FEFFFF   call    004127E0
004128EF   .  59            pop     ecx
004128F0   >  E8 22350000   call    00415E17
004128F5   .  8975 FC       mov     dword ptr [ebp-4], esi
004128F8   .  E8 F3BA0200   call    0043E3F0        //指向病毒代码
004128FD   .  85C0          test    eax, eax
004128FF   .  7D 08         jge     short 00412909
00412901   .  6A 1B         push    1B
00412903   .  E8 B3FEFFFF   call    004127BB
00412908   .  59            pop     ecx
00412909   >  FF15 00414200 call    dword ptr [<&KERNEL32.GetCommand>; [GetCommandLineA

然后又是一个call到真正的病毒代码执行部分。
0043E3D2    E8 37000000     call    0043E40E     //指向真正病毒代码
0043E3D7  - E9 C3E2FDFF     jmp     0041C69F   //病毒代码执行完后跳回原地址继续执行
0043E3DC    E8 2D000000     call    0043E40E
0043E3E1  - E9 D488FCFF     jmp     00406CBA
0043E3E6    E8 23000000     call    0043E40E
0043E3EB  - E9 30D2FCFF     jmp     0040B620
0043E3F0    E8 19000000     call    0043E40E
0043E3F5  - E9 F9ACFDFF     jmp     004190F3
0043E3FA    E8 0F000000     call    0043E40E
0043E3FF  - E9 7C9FFDFF     jmp     00418380
0043E404    E8 05000000     call    0043E40E
0043E409  - E9 FBFCFDFF     jmp     0041E109

正好最近没什么事,所以打算写一个该程序的修复程序,练练手,原来的思路是遍历代码段,找E8,然后得到后面调用地址,比较是否是在病毒代码的区段,如果是再得到jmp 正常地址,用这条代码替换call 病毒代码。
但在写的过程中才发现,这样写是不行,因为E8也可能是数据或其他,不一定就是call。这一下我的思路就中断了,就在我思索有什么更好的办法修复程序的时候,突然想到病毒代码执行后会执行到jmp正常程序地址,我只要把病毒代码部分的第一句改成ret,就可以隔离病毒代码部分,完成修复了。
有了这个思路就好写代码了,只要找到感染代码入口的特征,然后把第一句代码改为ret就行了,具体代码怎么写就不说了,相信有点编程序基础的,这点小事是完全没问题的。
如果大家有更好的思路请告诉我,一起进步。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 397
活跃值: (402)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
2
多谢wumingpeng提供的样本,因为没有pps的环境,没测试lz说的修复是否完美。但思路觉对是很简洁可行的。

我顺便补充点,这个病毒做的是一个EPO方式感染,修改了宿主6个位置,没太细弄,不确定是否是随机位置感染,6个是为了增大病毒获得执行权的概率。

第1处
0040119B   /75 05                 jnz short 55794952.004011A2
0040119D   |E8 30D20300     call 55794952.0043E3D2     -------->调病毒代码
004011A2   \FF7424 04          push dword ptr ss:[esp+4]
004011A6    E8 9C1B0200     call 55794952.00422D47

第2处
00406D58    83C4 18           add esp,18
00406D5B    56                    push esi
00406D5C    8BCF                 mov ecx,edi
00406D5E    E8 79760300     call 55794952.0043E3DC   -------->调病毒代码
00406D63    8BCF                mov ecx,edi
00406D65    E8 DDFEFFFF     call 55794952.00406C47

第3处
0040CBF2    8B4424 30       mov eax,dword ptr ss:[esp+30]
0040CBF6    52                     push edx
0040CBF7    E8 EA170300    call 55794952.0043E3E6   -------->调病毒代码
0040CBFC    83C4 04           add esp,4

第4处
004128F5    8975 FC             mov dword ptr ss:[ebp-4],esi
004128F8    E8 F3BA0200     call 55794952.0043E3F0   -------->调病毒代码
004128FD    85C0                  test eax,eax

第5处
004185BF    55                           push ebp
004185C0    E8 355E0200          call 55794952.0043E3FA    -------->调病毒代码
004185C5    0FB705 3A2B4300 movzx eax,word ptr ds:[432B3A]
004185CC    0FB70D 342B4300 movzx ecx,word ptr ds:[432B34]

第6处
0041E2CF    8BCE                  mov ecx,esi
0041E2D1    E8 2E010200     call 55794952.0043E404      -------->调病毒代码
0041E2D6    8B06                 mov eax,dword ptr ds:[esi]

// 通过那些hook的位置,跳到不同的病毒跳转分支,分别调向宿主的不同位置 ,相当于一个stub
// 但这些分支都调向同一个位置0043E40E

0043E3D2    E8 37000000     call 55794952.0043E40E
0043E3D7  - E9 C3E2FDFF     jmp 55794952.0041C69F  -- 返回宿主
0043E3DC    E8 2D000000     call 55794952.0043E40E
0043E3E1  - E9 D488FCFF     jmp 55794952.00406CBA -- 返回宿主
0043E3E6    E8 23000000     call 55794952.0043E40E
0043E3EB  - E9 30D2FCFF     jmp 55794952.0040B620  -- 返回宿主
0043E3F0    E8 19000000     call 55794952.0043E40E
0043E3F5  - E9 F9ACFDFF     jmp 55794952.004190F3  -- 返回宿主
0043E3FA    E8 0F000000     call 55794952.0043E40E
0043E3FF  - E9 7C9FFDFF     jmp 55794952.00418380  -- 返回宿主
0043E404    E8 05000000     call 55794952.0043E40E
0043E409  - E9 FBFCFDFF     jmp 55794952.0041E109  -- 返回宿主

// 病毒开始代码
0043E40E    60                pushad  --》 把这里改成ret ,即可修复。
0043E40F    66:9C           pushfw
0043E411    66:9C           pushfw
0043E413    E8 04000000     call 55794952.0043E41C

写修复代码关键是找对修复位置,说个我们的修复方式,
通配匹配  e8 ???????? e9|6  60 66 9c
|6 表示反复6次,

修复60 为c3 即可。
2011-1-14 16:24
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
留着僵尸小心隐患~
2011-1-14 16:30
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
就修改几个代码啊,病毒数据没除去
2011-1-14 17:18
0
游客
登录 | 注册 方可回帖
返回
//