两分种搞定UPX壳
Author:yellow
Email:yellow@safechian.net
Home Page:www.safechina.net
Date:2004-01-19.夜
我从没有搞过破解只是在前段时间学习PE文件格式在看雪学院Down了一些资料明
天就要放假了闲来无事用一个小时把看雪学院的通览了一遍为
了练习搞定了几个CrackMe觉得也怪好玩的觉得!
Crack技术里的脱壳技术是非常有意思
我不想解释脱壳的概念什么的这方面的资料非常多好了不废话下面让开始讲解如何
在两分种内脱掉UPX的壳以前没有搞过Crack有什么Error的地方高手误笑!呵呵!
相关工具:
UPX 1.23W(用于压缩和加壳)
W32Dasm 10.0黄金汉化版(Cracker们和Hacker们都经常要用的)
OllyDbg 1.09c聆风听雨汉化版(这个汉化Bug很少很好用)
OllyDump(OllyDbg脱壳插件)
"开始"-->"程序"-->"附件"-->"游戏"-->"扫雷"-->"右击"-->"属性"-->"查找目标"
复制到工作目录下(我的是D:/temp/Crack/)使用UPX对扫雷程序加壳
命令如下:
d:/temp/crack>upx -9 winmine.exe -o swinmine.exe
目录下生成了一个名为swinmine.exe的已加壳程序
使用W32Dasm打开反汇编已经看不到引入和引出函数参考对话框和菜单参考字串参考全变成了
String Resource ID=00001: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00002: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌?
哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌?quot;
String Resource ID=0!
0003: &q
uot;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00004: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00005: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00007: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00009: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00011: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00014: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
String Resource ID=00014: "哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌"
先按Ctrl+End光标走到了最后一行再选择W32Dasm的"查找/查找文本"菜单输入"popad"选中
查找方向为向上找到这样的语句:
:0101BC28 FF96E8BC0100 !
call dword ptr [esi+0001BCE8]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
│:0101BBF0(C)
│
:0101BC2E 61 popad
:0101BC2F E99C81FEFF jmp 01003DD0;<==---
光标移到:0101BC2F E99C81FEFF jmp 01003DD0这句上选择"编辑/快速编辑"
菜单项将
E99C81FEFF000000000000000000000000000000改为
CCE99C81FEFF0000000000000000000000000000
(后面去掉两个一字节前面添加一字节的十六进制数的CC即汇编语句int 3User Break
Point中断调用)保存成Pswinmine.exe运行一下弹出一个MessageBox"Software Exception...
位置0101bc2f"出现一个未处理异常?出错了?没有!没有!是我们写入的int 3发出的!
看
清楚它的位置0101bc2f
再反汇编Pswinmine.exe看一下0x01!
01bc2f地
址的指令就明白了:
:0101BC28 FF96E8BC0100 call dword ptr [esi+0001BCE8]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
│:0101BBF0(C)
│
:0101BC2E 61 popad
:0101BC2F CC int 03;<==---
:0101BC30 E99C81FEFF jmp 01003DD1<==---
退出W32Dasm打开OllyDbg打开刚才打过用户中断调用补丁的Pswinmine.exe程序显示
"模块"Pwinmine"的快速统计测试报告说明它的代码总发也许是经过了压缩加密或者包含
很大数目的嵌入式数据.代码分析结果将会是非常不可靠的或者是简单而且错误的.您确定要
继续进行分析吗?"当然!
点"是"了再按F9程序会中断在0101bc2f因为我们int 3调用了User
Break Point中断控制权转到了OllyDbg其实加壳(加密)后程序需要在执行时由一小段程序
来解密程序然后再跳转到解密后的代码执行这和Overflow攻击中使用的ShellCode编解码技
术惊人的相似ShellCode在解码以前只有一小段代码(通常是解码子程序)是可执行的其它未
经解码的代码(其实在未解码前它们同加壳过的软件代码一样是一系列毫无规则的错误的指令
甚至是根本不存在的指令代码)如果执行就会出现错误.
右击选"Dump Debuged Process"在Entry Point框输入3dd1注意是3dd1而不是3dd0输入保
存文件名123.exe点确定保存运行一下一切正常(这时程序已从内存中被脱壳出来).
退出OllyDbg打开W32Dasm再次反汇编123.exe(已脱UPX壳的扫雷程序)
菜单参考:
Menu: MenuID_01F4
Menu: MenuID_01F4 Item: ""
Menu: MenuID_01F4 Item: "??)(M)"
Menu: MenuID_01F4 Item: "?B)"
Menu: MenuID_01F4 Item: "-?I)"
Menu: MenuID_01F4 Item: "痼(S)"
Menu: MenuID_01F4 !
Item: "丕(E)"
Menu: MenuID_01F4 Item: " (L!
)"<
br>Menu: MenuID_01F4 Item: " I(C)..."
Menu: MenuID_01F4 Item: " (C) F1"
对话框参考:
Dialog: DialogID_0050
Dialog: DialogID_0258
Dialog: DialogID_02BC
字符参考:
String Resource ID=00001: "k?
String Resource ID=00003: "k??
String Resource ID=00004: "嗾Mn■h ?
String Resource ID=00005: "
?
String Resource ID=00006: "? %d"
String Resource ID=00007: "%d ?
String Resource ID=00008: "Z
"
String Resource ID=00009: "?ОU