【文章作者】: newjueqi
【作者邮箱】: zengjiansheng1@126.com
【作者QQ号】: 190678908(sdf)
【编写语言】: VC++6.0
【使用工具】: OD
【操作平台】: XP-SP2
【作者声明】: 昨天做了一个病毒的汇编源码分析(链接:http://bbs.pediy.com/showthread.php?t=74520或者看附件),分析完这个病毒后的感慨就是这个病毒一点都不像病毒,反而像一个U盘编程的示范代码(虽然金山毒霸每次遇到它都兴奋得叫起来 ^-^), 后来就干脆给病毒来一个PEDIY(直接修改汇编代码使病毒在运行时弹出一个对话框告诉用户中毒了),只是出于研究的目的,失误之处敬请大家赐教!
网页上有的图片不太清晰,清晰版请看附件
具体思路就是修改病毒注册的消息处理函数地址,通过提前处理WM_CREATE消息显示一个对话框,然后才返回到原来病毒的函数处理地址。
查看分析过程,可知病毒以载入MessageBoxA, 省下修改输入表的内容。
首先用LordPE查看区块信息,如下图所示
从上图可看到.text的节区空隙为7000-6B1A=4E6,即可放1000多字节,足够放入所需要的代码,另外从文件偏移8000的地方是数据区,可找空白的存放MessageBoxA函数所有的对话框标题和内容。
首先,用Winhex打开病毒文件,我选择在00008270的地方存放内容文本,00008280存放MessageBoxA需要的文本,完成后如下图所示
接着就开始修改代码,从http://bbs.pediy.com/showthread.php?t=74520或附件的病毒分析可知:
00401010 |. 897C24 28 mov dword ptr [esp+28], edi ; |
00401014 |. C74424 2C 00114>mov dword ptr [esp+2C], 00401100 ;窗口过程的地址|
0040101C |. 897C24 30 mov dword ptr [esp+30], edi ; |
00401020 |. 897C24 34 mov dword ptr [esp+34], edi ; |
00401024 |. 897424 38 mov dword ptr [esp+38], esi ; |
00401028 |. 897C24 3C mov dword ptr [esp+3C], edi ;
0040102C |. 897C24 40 mov dword ptr [esp+40], edi ; |
00401030 |. 897C24 44 mov dword ptr [esp+44], edi ; |
00401034 |. 897C24 48 mov dword ptr [esp+48], edi ; |
00401038 |. C74424 4C 4C804>mov dword ptr [esp+4C], 0040804C ; 00401040 |. FF15 18714000 call dword ptr [<&USER32.RegisterClassA>] ; \RegisterClassA
00401100就是病毒原来的消息处理地址,根据LordPE查看区块信息,在00406B1B处插入新增的代码,所以把跳转改为下图所示
接下来我们来分析一下函数的消息处理过程
00401100 . 8B4424 08 mov eax, dword ptr [esp+8]
00401104 . 3D 13010000 cmp eax, 113 ; Switch (cases 1..219)
00401109 . 0F87 9C000000 ja 004011AB
0040110F . 74 60 je short 00401171
00401111 . 8BC8 mov ecx, eax
00401113 . 49 dec ecx
00401114 . 74 21 je short 00401137 ;这里就跳到WM_CREATE消息
从上面可看到Switch语句里跳转到WM_CREATE的消息处理的过程,我们可以进行一定程度上的简化。
在地址00406B1B处开始输入我们DIY的代码
00406B1B 8B4C24 08 mov ecx, dword ptr [esp+8]
;注意里,这里必须执行完mov ecx, dword ptr [esp+8]后才能pushad, 因为如果执行了pushad操作,那么esp的值会发生变化,dword ptr [esp+8]的值就会受到影响
00406B1F 60 pushad ;保护寄存器现场
00406B20 49 dec ecx
00406B21 74 06 je short 00406B29 ;比较是否是WM_CREATE消息,如果不是的话就跳回病毒原来的消息处理函数
00406B23 61 popad ;恢复寄存器现场
00406B24 ^ E9 D7A5FFFF jmp 00401100 ;原来的消息处理函数
下面就是我们弹出对话框的部分
00406B29 6A 00 push 0 ;Style
00406B2B 68 80824000 push 00408280 ; Title, ASCII "ha ha"
00406B30 68 70824000 push 00408270 ; Text, ASCII "this is a virus"
00406B35 6A 00 push 0 ; Owner
输入MessageBoxA的地址时就要注意了,.MessageBoxA的地址千万不能用硬编码,因为随着操作系统的不同,.MessageBoxA的函数地址也不相同,所以必须要获得当前操作系统中.MessageBoxA的地址,据我所知方法有两个:
1. 在输入表添加MessageBoxA函数,使输入表里拥有MessageBoxA的函数地址
2. 用操作系统的特性先获取GetProcAddress函数的地址,再用GetProcAddress函数获取MessageBoxA的地址,方法在《Q版黑客缓冲区溢出教程》里有详细的介绍
由于病毒已有使用MessageBoxA的地方,所以只要获取MessageBoxA在输入表的地址就ok
病毒里使用的MessageBoxA如下图
40711c 就是输入表里MessageBoxA的地址
00406B37 FF15 1C714000 call dword ptr [<&USER32.MessageBoxA>] ; USER32.MessageBoxA
00406B3D 61 popad ;恢复寄存器现场
00406B3E ^ E9 BDA5FFFF jmp 00401100 ;跳到原来的消息处理处
完成的输入内容如下图红色所示
在OD的反汇编窗口点右键-->复制到可执行文件-->右键保存文件(全部)-->选择你要保存的文件名-->保存,ok,这样汇编代码部分就修改完成。
最后的工作就是修改区块表的信息。
原来.text区块头信息如下:
5B1A就是原来的区块大小,由于现在我们在原来的.text区块尾增加了代码,必须改掉原来的.text区块头信息,从增加的代码地址可看出,我们可以把.text区块尾增加到00406B44,转化成文件文件偏移就是5B44,修改的地方如下图所示:
哈哈,现在可以体现一下 PEDIY的快乐!!! ^-^
运行后效果如下图:
- 标 题:病毒也来PEDIY
- 作 者:newjueqi
- 时 间:2008-10-12 22:06
- 链 接:http://bbs.pediy.com/showthread.php?t=74527