【文章标题】: 手工脱“白日梦”
【文章作者】: 王猛
【作者邮箱】: 12985462@QQ.com
【作者主页】: www.81mil.cn
【作者QQ号】: 12985462
【软件名称】: 白日梦VIP 3.15
【软件大小】: 394 KB
【下载地址】: www.bairimeng.com
【加壳方式】: UPX
【保护方式】: 联网认证
【编写语言】: Delphi
【使用工具】: PEiD v0.94;OllyDBG v1.10;LordPE
【操作平台】: Windows XP SP2
【软件介绍】: 本软件为单纯模拟键盘鼠标的大话西游II辅助工具
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一、学习目的
在学习了weiyi75[Dfcg]兄编写的手工脱壳教程之后,尝试对一些UPX加壳的程序进行破解。正巧,我们部队战友平时喜欢玩的大话西游二这
款网络游戏的外挂是“白日梦”是使用这款软件保护的,所以就拿来联手了。嘿嘿!
一、检测外壳
首先使用PEiD进行检测,得到结果:
UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
说明此程序是使用UPX加壳。
二、脱壳过程
使用 0llyDBG 加载目标程序 fantasyv315.exe,OllyDBG提示程序加壳,选不继续分析。程序停在
0054C8B0 > 60 PUSHAD ; UPX壳一般都停在这里
0054C8B1 BE 00C04E00 MOV ESI,fantasyv.004EC000 ; 按F8一步一步继续跟
0054C8B6 8DBE 0050F1FF LEA EDI,DWORD PTR DS:[ESI+FFF15000]
0054C8BC 57 PUSH EDI
0054C8BD 83CD FF OR EBP,FFFFFFFF
0054C8C0 EB 10 JMP SHORT fantasyv.0054C8D2 ; 跳转,按F8继续。
……
0054C8D2 8B1E MOV EBX,DWORD PTR DS:[ESI] ; 由 0054C8C0 跳转过来
0054C8D4 83EE FC SUB ESI,-4
0054C8D7 11DB ADC EBX,EBX
0054C8D9 ^ 72 ED JB SHORT fantasyv.0054C8C8 ; 回跳,鼠标点下一行
0054C8DB B8 01000000 MOV EAX,1 ; 选中后,按F4直接到本行,继续F8调试。
0054C8E0 01DB ADD EBX,EBX
0054C8E2 75 07 JNZ SHORT fantasyv.0054C8EB ; 跳转 F8
……
0054C8EB 11C0 ADC EAX,EAX ; 由 0054C8E2 跳转过来
0054C8F1 75 28 JNZ SHORT fantasyv.0054C91B ; 跳转 F8
……
0054C91B 31C9 XOR ECX,ECX ; 由 0054C8F1 跳转过来
0054C920 72 11 JB SHORT fantasyv.0054C933 ; 跳转 F8
……
0054C933 01DB ADD EBX,EBX ; 由 0054C920 跳转过来
0054C935 75 07 JNZ SHORT fantasyv.0054C93E ; 跳转 F8
……
0054C93E ^ 72 CC JB SHORT fantasyv.0054C90C ; 回跳 由 0054C935 跳转过来,紧跟着一回跳。
0054C940 41 INC ECX ; 点中本行按F4跳过来
0054C943 75 07 JNZ SHORT fantasyv.0054C94C ; 跳转 F8
……
0054C94C ^ 72 BE JB SHORT fantasyv.0054C90C ; 回跳 由 0054C943 跳转后过来又是一个回跳
0054C94E 01DB ADD EBX,EBX ; 点中本行按F4跳过来
0054C950 75 07 JNZ SHORT fantasyv.0054C959 ; 跳转 F8
……
0054C959 11C9 ADC ECX,ECX ; 由 0054C959 跳转过来
0054C95D ^ 73 EF JNB SHORT fantasyv.0054C94E ; 回跳
0054C95F /75 09 JNZ SHORT fantasyv.0054C96A ; 按F4过来后紧跟着一个跳转
0054C961 |8B1E MOV EBX,DWORD PTR DS:[ESI]
0054C963 |83EE FC SUB ESI,-4
0054C966 |11DB ADC EBX,EBX
0054C968 ^|73 E4 JNB SHORT fantasyv.0054C94E
0054C96A \83C1 02 ADD ECX,2 ; 由 0054C95D 跳转过来
0054C97C /76 0E JBE SHORT fantasyv.0054C98C ; 跳转 F8
0054C97E |8A02 MOV AL,BYTE PTR DS:[EDX]
0054C980 |42 INC EDX
0054C981 |8807 MOV BYTE PTR DS:[EDI],AL
0054C983 |47 INC EDI
0054C984 |49 DEC ECX
0054C985 ^|75 F7 JNZ SHORT fantasyv.0054C97E
0054C987 ^|E9 42FFFFFF JMP fantasyv.0054C8CE
0054C98C \8B02 MOV EAX,DWORD PTR DS:[EDX] ; 由 0054C97C 跳转过来
0054C999 ^\77 F1 JA SHORT fantasyv.0054C98C ; 回跳
0054C99B 01CF ADD EDI,ECX
0054C99D ^ E9 2CFFFFFF JMP fantasyv.0054C8CE ; 回跳
0054C9A2 5E POP ESI ; fantasyv.00401000
0054C9B1 ^\77 F7 JA SHORT fantasyv.0054C9AA ; 回跳
0054C9B3 803F 24 CMP BYTE PTR DS:[EDI],24
0054C9B6 ^ 75 F2 JNZ SHORT fantasyv.0054C9AA
0054C9AF 3C 01 CMP AL,1
0054C9B1 ^ 77 F7 JA SHORT fantasyv.0054C9AA ; 回跳
0054C9B3 803F 24 CMP BYTE PTR DS:[EDI],24
0054C9B6 ^ 75 F2 JNZ SHORT fantasyv.0054C9AA
0054C9B8 8B07 MOV EAX,DWORD PTR DS:[EDI]
0054C9BA 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4]
0054C9BD 66:C1E8 08 SHR AX,8
0054C9C1 C1C0 10 ROL EAX,10
0054C9C4 86C4 XCHG AH,AL
0054C9C6 29F8 SUB EAX,EDI
0054C9C8 80EB E8 SUB BL,0E8
0054C9CB 01F0 ADD EAX,ESI
0054C9CD 8907 MOV DWORD PTR DS:[EDI],EAX
0054C9CF 83C7 05 ADD EDI,5
0054C9D2 88D8 MOV AL,BL
0054C9D4 ^ E2 D9 LOOPD SHORT fantasyv.0054C9AF ; 遇到第一个循环了,循环也是要回跳的
0054C9D6 8DBE 00901400 LEA EDI,DWORD PTR DS:[ESI+149000] ; 点中本行按F4过来
……
一路F8下来之后到了,继续
0054C9F2 FF96 78D61400 CALL DWORD PTR DS:[ESI+14D678] ; kernel32.LoadLibraryA
嘿嘿,接着我们看到了,再来
0054CA07 FF96 7CD61400 CALL DWORD PTR DS:[ESI+14D67C] ; kernel32.GetProcAddress
成功在望了,按F8跟着我们看到了什么?
0054CA16 ^\EB E1 JMP SHORT fantasyv.0054C9F9 ; 回跳 这个回跳不用管了!
0054CA18 FF96 80D61400 CALL DWORD PTR DS:[ESI+14D680]
0054CA1E 61 POPAD ; 关键点,UPX程序看到这里就看到了希望
; 按F4到这里
0054CA1F - E9 8C6BF8FF JMP fantasyv.004D35B0 ; 点这行按F4,之后按F8便可跳转到入口点,
POPAD之后紧跟着一个跨段跳转!嘿嘿,终于找到了入口点OEP了是 004D35B0 !
三、DUMP
找到入口点后利用OllyDBG插件OllyDump进行DUMP。
入口点地址:14C8B0 -> 修正为:D35B0。
重建输入表,选择“方式一”,点“脱壳”完成DUMP工作。
这样脱壳后的文件可以在我的机器上直接运行。
不过还是利用LordPE修复一下,利用重建PE功能选择DUMP出来的文件即可!
--------------------------------------------------------------------------------
【经验总结】
感谢 weiyi75[Dfcg] 兄的教程,通过学习已经懂得如何手工脱去UPX壳。为达到脱壳之目的,在脱壳时遇到回跳和循环一律
点选下一行并按F4跳过去。在遇到 kernel32.LoadLibraryA 和 kernel32.GetProcAddress 那就打起精神来,很快就要跟
到入口点了!当 POPAD 之后紧跟着一个跨段跳转,说明程序已经在内存中解压完毕,可以进行DUMP了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年02月12日 11:18:55
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!