标题:手动脱壳入门第二篇UPX 1.0

-------------------------------------------------------------------------------------------------------------------------------

时间:2006/8/28 17:04:14

-------------------------------------------------------------------------------------------------------------------------------

内容:

 手动脱壳入门第二篇UPX 1.08  
手动脱壳入门第二篇UPX 1.08
【脱文作者】 weiyi75[Dfcg] 
【作者邮箱】 weiyi75@sohu.com 
【作者主页】 Dfcg官方大本营 
【使用工具】 Fi,Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 chap702
【软件简介】 UPX V1.08加壳的一个Win98的记事本
【软件大小】 15.9KB 
【加壳方式】 UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
【保护方式】 UPX普通壳
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 
脱壳内容
UPX脱壳第一篇总结内容如下:
UPX脱壳断点
bp LoadLibraryA 经过两个很关键的脱壳相关函数,很快到入口点,前面有Popad
bp GetProcAddress 这个优先下断点,可省略很多循环,我们在第一篇已看清UPX手动脱壳流程.
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD 
一般经过JMP跨段跳跃到入口处.
有了手动脱壳第一片的总结,脱UPX壳很容易.
好,我们看第二个Upx壳。
本地下载
首先必须的工具要准备好,
附件中壳为Fi测壳为Upx1.08,Peid这里测不出Upx的压缩版本。
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
用OD载入程序后。
Od提示程序加壳,选不继续分析。
0040E8C0 > 60 PUSHAD UPX壳的加壳入口第一句是PUSHAD
0040E8C1 BE 15B04000 MOV ESI,chap702.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5FEB]
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT chap702.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
...................................
我们这一次不单步跟踪,我们再命令行下断点
Bp GetProcAddress
入口前必经之函数.
见截图.
 
F9运行中断在
77E7564B > 55 PUSH EBP 断在这里 ,注意这里是系统领空 ; KERNEL32.77E60000 F2取消断点.Ctrl+F9返回.
77E7564C 8BEC MOV EBP,ESP
77E7564E 51 PUSH ECX
77E7564F 51 PUSH ECX
77E75650 53 PUSH EBX
77E75651 57 PUSH EDI
77E75652 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
77E75655 BB FFFF0000 MOV EBX,0FFFF
77E7565A 3BFB CMP EDI,EBX
77E756A8 C2 0800 RETN 8 到这里,F8
77E756AB - FF25 2013E677 JMP DWORD PTR DS:[<&NTDLL.LdrGetProcedur>; ntdll.LdrGetProcedureAddress
77E756B1 85FF TEST EDI,EDI
77E756B3 0F85 AD620000 JNZ KERNEL32.77E7B966
77E756B9 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
77E756BC 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
77E756BF 0FB740 2E MOVZX EAX,WORD PTR DS:[EAX+2E]
77E756C3 EB 0A JMP SHORT KERNEL32.77E756CF
77E756C5 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
77E756C8 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
77E756CB 0FB740 12 MOVZX EAX,WORD PTR DS:[EAX+12]
77E756CF 8D0C46 LEA ECX,DWORD PTR DS:[ESI+EAX*2]
0040E9FD 09C0 OR EAX,EAX 回到程序领空了. ; KERNEL32._lwrite
0040E9FF 74 07 JE SHORT chap702.0040EA08
0040EA01 8903 MOV DWORD PTR DS:[EBX],EAX
0040EA03 83C3 04 ADD EBX,4
0040EA06 ^ EB E1 JMP SHORT chap702.0040E9E9 这里想往回跳.
0040EA08 FF96 A8EC0000 CALL DWORD PTR DS:[ESI+ECA8] F4到这里.
0040EA0E 61 POPAD 关键字,入口就在附近.
0040EA0F - E9 B826FFFF JMP chap702.004010CC 跨段跳跃到入口.
004010CC 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT chap702.004010FC
这个程序的输入表没有损坏,可以直接运行.
还有更快的方法.
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD 
一般经过JMP跨段跳跃到入口处.
用Od载入程序.
0040E8C0 > 60 PUSHAD UPX壳的加壳入口第一句是PUSHAD
0040E8C1 BE 15B04000 MOV ESI,chap702.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5FEB]
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT chap702.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
0040E8D5 90 NOP
0040E8D6 90 NOP
..............................................................
按Crtl+F向下找PoPad,
见截图.


0040EA0E 61 POPAD 关键字. F2下断点,F9运行到这里,清除断点.
0040EA0F - E9 B826FFFF JMP chap702.004010CC 入口点.
0040EA14 0000 ADD BYTE PTR DS:[EAX],AL
0040EA16 0000 ADD BYTE PTR DS:[EAX],AL
0040EA18 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1A 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1C 0000 ADD BYTE PTR DS:[EAX],AL
...................................................
004010CC 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT chap702.004010FC
这个程序的输入表没有损坏,可以直接运行.第二种方法在软件加了几层壳时很有用,节省大量时间.前提是你必须找到脱壳规律.
"手动脱壳入门第二篇"脱壳动画!
  
 

  

 手动脱壳入门第二篇UPX 1.08  
手动脱壳入门第二篇UPX 1.08
【脱文作者】 weiyi75[Dfcg] 
【作者邮箱】 weiyi75@sohu.com 
【作者主页】 Dfcg官方大本营 
【使用工具】 Fi,Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 chap702
【软件简介】 UPX V1.08加壳的一个Win98的记事本
【软件大小】 15.9KB 
【加壳方式】 UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
【保护方式】 UPX普通壳
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 
脱壳内容
UPX脱壳第一篇总结内容如下:
UPX脱壳断点
bp LoadLibraryA 经过两个很关键的脱壳相关函数,很快到入口点,前面有Popad
bp GetProcAddress 这个优先下断点,可省略很多循环,我们在第一篇已看清UPX手动脱壳流程.
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD 
一般经过JMP跨段跳跃到入口处.
有了手动脱壳第一片的总结,脱UPX壳很容易.
好,我们看第二个Upx壳。
本地下载
首先必须的工具要准备好,
附件中壳为Fi测壳为Upx1.08,Peid这里测不出Upx的压缩版本。
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
用OD载入程序后。
Od提示程序加壳,选不继续分析。
0040E8C0 > 60 PUSHAD UPX壳的加壳入口第一句是PUSHAD
0040E8C1 BE 15B04000 MOV ESI,chap702.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5FEB]
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT chap702.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
...................................
我们这一次不单步跟踪,我们再命令行下断点
Bp GetProcAddress
入口前必经之函数.
见截图.
 
F9运行中断在
77E7564B > 55 PUSH EBP 断在这里 ,注意这里是系统领空 ; KERNEL32.77E60000 F2取消断点.Ctrl+F9返回.
77E7564C 8BEC MOV EBP,ESP
77E7564E 51 PUSH ECX
77E7564F 51 PUSH ECX
77E75650 53 PUSH EBX
77E75651 57 PUSH EDI
77E75652 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
77E75655 BB FFFF0000 MOV EBX,0FFFF
77E7565A 3BFB CMP EDI,EBX
77E756A8 C2 0800 RETN 8 到这里,F8
77E756AB - FF25 2013E677 JMP DWORD PTR DS:[<&NTDLL.LdrGetProcedur>; ntdll.LdrGetProcedureAddress
77E756B1 85FF TEST EDI,EDI
77E756B3 0F85 AD620000 JNZ KERNEL32.77E7B966
77E756B9 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
77E756BC 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
77E756BF 0FB740 2E MOVZX EAX,WORD PTR DS:[EAX+2E]
77E756C3 EB 0A JMP SHORT KERNEL32.77E756CF
77E756C5 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
77E756C8 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
77E756CB 0FB740 12 MOVZX EAX,WORD PTR DS:[EAX+12]
77E756CF 8D0C46 LEA ECX,DWORD PTR DS:[ESI+EAX*2]
0040E9FD 09C0 OR EAX,EAX 回到程序领空了. ; KERNEL32._lwrite
0040E9FF 74 07 JE SHORT chap702.0040EA08
0040EA01 8903 MOV DWORD PTR DS:[EBX],EAX
0040EA03 83C3 04 ADD EBX,4
0040EA06 ^ EB E1 JMP SHORT chap702.0040E9E9 这里想往回跳.
0040EA08 FF96 A8EC0000 CALL DWORD PTR DS:[ESI+ECA8] F4到这里.
0040EA0E 61 POPAD 关键字,入口就在附近.
0040EA0F - E9 B826FFFF JMP chap702.004010CC 跨段跳跃到入口.
004010CC 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT chap702.004010FC
这个程序的输入表没有损坏,可以直接运行.
还有更快的方法.
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD 
一般经过JMP跨段跳跃到入口处.
用Od载入程序.
0040E8C0 > 60 PUSHAD UPX壳的加壳入口第一句是PUSHAD
0040E8C1 BE 15B04000 MOV ESI,chap702.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5FEB]
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT chap702.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
0040E8D5 90 NOP
0040E8D6 90 NOP
..............................................................
按Crtl+F向下找PoPad,
见截图.


0040EA0E 61 POPAD 关键字. F2下断点,F9运行到这里,清除断点.
0040EA0F - E9 B826FFFF JMP chap702.004010CC 入口点.
0040EA14 0000 ADD BYTE PTR DS:[EAX],AL
0040EA16 0000 ADD BYTE PTR DS:[EAX],AL
0040EA18 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1A 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1C 0000 ADD BYTE PTR DS:[EAX],AL
...................................................
004010CC 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT chap702.004010FC
这个程序的输入表没有损坏,可以直接运行.第二种方法在软件加了几层壳时很有用,节省大量时间.前提是你必须找到脱壳规律.
"手动脱壳入门第二篇"脱壳动画!