首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>本站原创>安全防范>文章内容
两分种搞定UPX壳
来源:www.safechina.net 作者:yellow 发布时间:2004-01-20  

两分种搞定UPX壳
Author:yellow
Email:yellow@safechian.net
Home Page:www.safechina.net
Date:2004-01-19.夜

我从没有搞过破解,只是在前段时间学习PE文件格式在看雪学院Down了一些资料,明
天就要放假了闲来无事用一个小时把看雪学院的<Crack Tutorial 2001>通览了一遍,为
了练习搞定了几个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 3,User 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

?
"
String Resource ID=00010: "?-ОU

?
"
String Resource ID=00011: "?丕癠

?
"
String Resource ID=00012: "k?
String Resource ID=00013: "by Robert Donner and Curt Johnson"
".chm"
"?
"?"
"CLSID\{ADB880A6-D8FF-11CF-9377-00AA003B7A11}\I"
"entpack.ini"
"Failed t!
o create Bitmap
"
"FLoad failed to create compatible "
"hhctrl.ocx"
"NTHelp.chm"
"Software\Microsoft\winmine"
"U嬱婨
SV冭SW勬"
"winmine.hlp"
"2?"
一切收眼底,引入函数参考仍然看不见,有错误吗?不知道!可以正常运行应该是没有,使用
Visual Studio的Depends工具看一下先,引入函数和未加壳前一模一样,应该没有什么问题,
注意如果在这里能对PE文件头的Section Header进行一些重构那就脱的非常完美了,如果
是其它需要注册的软件可以再进一步跟踪分析出注册码.

最后:
手工加上一个int 3调用是非常有用的,有些软件使用OllyDbg来一步步跟踪分析是非
常费时费力的(需要解码很多数据,我们感兴趣的不是加密过的代码,而是未加密代码),而且
这样定位非常准确,既然我们已经明白了UPX加壳的算法原理(类似与ShellCode编解码算法),
那我们就等它自己解码完了以后Dump一下不是非常爽快吗?这里只是简单分析了一种快速去
除一般UPX壳的方法,有些软件还有反跟踪和反调试功能,脱壳就没有那!
么简单了.

Crack也怪有意思的!呵呵!不过我不会再玩了!在这?
镒8魑籆
racker新年里破解顺利,Bye!
By yellow From www.safechina.net
2004-01-19.夜
The End.



 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·访问列表(ACL)在Cisco路由器安
·Windows 平台的 MySQL 缺省配置
·我的一台linux肉鸡的简单手工入
·防止apache的php扩展名解析漏洞
  相关文章
·Windows 平台的 MySQL 缺省配置
·访问列表(ACL)在Cisco路由器安
·我的一台linux肉鸡的简单手工入
·防止apache的php扩展名解析漏洞
  推荐广告
CopyRight © 2002-2018 VFocuS.Net All Rights Reserved