首页
社区
课程
招聘
[原创] 手工脱“白日梦”
发表于: 2007-2-12 11:30 5202

[原创] 手工脱“白日梦”

2007-2-12 11:30
5202
【文章标题】: 手工脱“白日梦”
【文章作者】: 王猛
【作者邮箱】: 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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
UPX 用ESP定律直接秒

还有内存断点

在程序的入口调用函数(不同的高级语言编译出来的程序都有点不同,这个可以自己找点VC,VB,DELPHI等程序看看入口)设断(如GETCOMMANDLINE,GETVERSION等API),也秒

程序始终还是要退出的,在EXITPROCESS下断,DUMP了出来之后通过IDA的调用图表,最上层的那个函数,就是OEP了,注意到这样一个事实。编写程序的流程(PCODE是例外):

START PROC




CALL XXXX


CALL XXXX


END

CALL里面还有CALL。那么处于最高层的便是入口点了。

象这种没有花指令保护的东西,通过跳转找OEP的,最好用IDA的图形视图,一下就能找到出口了。

然后直接跳到相关地址下断,F9就到了。

或者在壳的出口附近找特征码(壳的框架是基本不变的),下次碰到相同版本的壳就直接内存搜索
2007-2-12 13:21
0
雪    币: 191
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
谢谢版主回复。

现在我遇到一个问题,脱壳这个软件之后,我利用IDA 5 Pro试图反汇编,可是IDA居然会卡死!用W32DASM反汇编,勉强找到了几个用来验证的跳转,我想直接修改汇编,可是W32DASM没这种功能。

请版主指点一二。

FAQ里边的ESP定律似乎搞不定呢!
我尝试下硬件断点,但是0lly不买账:(
2007-2-12 15:54
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
4
IDA会卡死是因为你机器的内存不够大
壳把区段的大小定得太大了,这个是反IDA的一个技巧,你把他定小一点就没事了。

至于要定多少,才足以让程序能正常反汇编,你就得参照一些功能复杂的程序(QQ,OFFICE,或者一些网游),他们的区段一般最大多少的。

我说那么多方法,是希望你可以将文章再扩展一下,也用用其他的一些方法。这样才好加精华。
2007-2-12 16:15
0
雪    币: 191
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
谢谢版主赏识,我用函数下断点的方法又脱了一次。请指教!另外,区段大小的位置我去看看。
【文章标题】: 手工脱“白日梦”(2)
【文章作者】: 王猛
【作者邮箱】: [email]12985462@QQ.com[/email]
【作者主页】: www.81mil.cn
【作者QQ号】: 12985462
【软件名称】: 白如梦 VIP v3.15
【软件大小】: 394KB
【下载地址】: www.bairimeng.com
【加壳方式】: UPX
【保护方式】: 联网认证
【编写语言】: Delphi
【使用工具】: PEiD v0.94;OllyDBG v1.10;LordPE
【操作平台】: Windows XP SP2
【软件介绍】: 本软件为单纯模拟键盘鼠标的大话西游II辅助工具
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  一、学习目的
  在上一篇中,利用最原始的方式一步一步纯手工脱掉了“白日梦”的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
  0054C8B6    8DBE 0050F1FF   LEA EDI,DWORD PTR DS:[ESI+FFF15000]
  0054C8BC    57              PUSH EDI
  
  利用命令 Bp GetProcAddress 下断点,按F9继续。程序停在了 7C80ADA0 :
  
  7C80ADA0 >  8BFF            MOV EDI,EDI                              ; fantasyv.0054A00F
  7C80ADA2    55              PUSH EBP
  7C80ADA3    8BEC            MOV EBP,ESP
  
  现在我们已经来到了系统领空。按F2取消断点,按Ctrl+F9返回,一路F8之后来到了 0054CA0D :
  
  0054CA0D    09C0            OR EAX,EAX                               ; kernel32.Sleep 一路F8继续走
  0054CA0F    74 07           JE SHORT fantasyv.0054CA18
  0054CA11    8903            MOV DWORD PTR DS:[EBX],EAX
  0054CA13    83C3 04         ADD EBX,4
  0054CA16  ^ EB E1           JMP SHORT fantasyv.0054C9F9              ; 回跳 跳过这行!!
  0054CA18    FF96 80D61400   CALL DWORD PTR DS:[ESI+14D680]
  0054CA1E    61              POPAD                                    ; 关键点,鼠标选中本行按F4走到这里,再按F8
  0054CA1F  - E9 8C6BF8FF     JMP fantasyv.004D35B0                    ; 跳转到入口点,按F8跟进去。
  
  OK了!POPAD后的第一个跨段跳转就是我们要找的入口点:004D35B0 。
  
  四、重建PE
  
  利用OllyDump插件将文件DUMP出来。
  入口点地址:14C8BO -> 修正为:D35B0,用文中方法默认已经如此设置了,点脱壳即可得到文件。
  
  用第一篇中提到的方法使用LordPE重建PE即可。
  
--------------------------------------------------------------------------------
【经验总结】
  利用下函数断点的方法,比之第一篇中一步一步纯手工脱壳提高了很多效率。
  要点是,千万记得用F2取消断点,用Ctrl+F9跳出来!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年02月12日 16:34:24
2007-2-12 16:21
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
写得不错。。又学得一招。
2007-3-1 16:59
0
雪    币: 235
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
脱个UPX也写文章,无语!
2007-3-1 17:12
0
雪    币: 191
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
upx -d files
enjoy!

我是第一次脱壳,所以写下来留个纪念!
2007-3-1 19:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习……学习……
2007-3-1 20:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主.可以把你脱完壳的.这个软件发出来.我想用.谢谢
2007-4-13 11:04
0
游客
登录 | 注册 方可回帖
返回
//