飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 33812|回复: 41

[原创] 各种常见压缩壳的入口点以及ESP定律脱法

[复制链接]

该用户从未签到

发表于 2006-8-28 21:51:15 | 显示全部楼层 |阅读模式



各种常见压缩壳的入口点以及ESP定律脱法:



UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo
ASPack 2.12 -> Alexey Solodovnikov
堀北压缩(KByS)0.28主程序脱壳
PECompact 2.x -> Jeremy Collake
PEncrypt 3.1 Final -> junkcodeeuk
北斗壳 Nspack3.7

一共六款 都是压缩壳 脱之简单 整理一下




UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo

006055B0 >  60                 pushad
006055B1    BE 00605400        mov esi,STV.00546000               ; 这里使用ESP定律
006055B6    8DBE 00B0EBFF      lea edi,dword ptr ds:[esi+FFEBB000>
006055BC    C787 C4201600 135F>mov dword ptr ds:[edi+1620C4],705D>
006055C6    57                 push edi
006055C7    83CD FF            or ebp,FFFFFFFF
006055CA    EB 0E              jmp short STV.006055DA

ESP后 直接到关键JMP

00605727  ^\E9 28CFF5FF        jmp STV.00562654                   ;F8一次 直接到达OEP
0060572C    44                 inc esp
0060572D    57                 push edi
ASPack 2.12 -> Alexey Solodovnikov

0044B001 >  60              PUSHAD                                   ; OD载入停在这里
0044B002    E8 03000000     CALL acerip.0044B00A                     ; 观看ESP寄存器 0012FFA4 ESP定律对付

ESP后 OD停到这里

0044B3B0   /75 08           JNZ SHORT acerip.0044B3BA                ; F8一次
0044B3B2   |B8 01000000     MOV EAX,1
0044B3B7   |C2 0C00         RETN 0C
0044B3BA   \68 BC1F4000     PUSH acerip.00401FBC
0044B3BF    C3              RETN                                     ; RETN之后 就跳到OEP

堀北压缩(KByS)0.28主程序脱壳


00401000 >/$  68 71EA4A00   PUSH 堀北压缩.004AEA71                       ;  OD载入停到这里~
00401005  |.  E8 01000000   CALL 堀北压缩.0040100B                       ;  这里ESP定律

F9 OD停到这里
004AEA71    B8 83EA0A00     MOV EAX,0AEA83                           ; ESP停到这里
004AEA76    BA 00004000     MOV EDX,堀北压缩.00400000
004AEA7B    03C2            ADD EAX,EDX
004AEA7D    FFE0            JMP EAX
004AEA7F    B1 15           MOV CL,15
004AEA81    0000            ADD BYTE PTR DS:[EAX],AL
004AEA83    60              PUSHAD
004AEA84    E8 00000000     CALL 堀北压缩.004AEA89                       ; F9一次到这里

F9后 循环返回到这里
00401005  |.  E8 01000000   CALL 堀北压缩.0040100B                       

下面继续F9运行 (大约)15次时 OD有一次明显的时间间隔 然后停到这里

00432A71    B8 E5A70000     MOV EAX,0A7E5                ;停到这里
00432A76    BA 00004000     MOV EDX,堀北压缩.00400000
00432A7B    03C2            ADD EAX,EDX
00432A7D    FFE0            JMP EAX                      ;到这里F7进
00432A7F    B1 15           MOV CL,15
00432A81    0000            ADD BYTE PTR DS:[EAX],AL
00432A83    60              PUSHAD
00432A84    E8 00000000     CALL 堀北压缩.00432A89

进入后 (Ctrl+A 我这的OD需要分析下代码 )这里就是OEP
0040A7E5  /.  55            PUSH EBP                        ;OEP
0040A7E6  |.  8BEC          MOV EBP,ESP
0040A7E8  |.  6A FF         PUSH -1
0040A7EA  |.  68 C0F54000   PUSH 堀北压缩.0040F5C0
0040A7EF  |.  68 00BC4000   PUSH 堀北压缩.0040BC00                       ;  SE 处理程序安装
0040A7F4  |.  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]

PECompact 2.x -> Jeremy Collake


005B8B60 >  B8 94426000     MOV EAX,MeteorNe.00604294                ; OD载入 停到这里
005B8B65    50              PUSH EAX
005B8B66    64:FF35 0000000>PUSH DWORD PTR FS:[0]
005B8B6D    64:8925 0000000>MOV DWORD PTR FS:[0],ESP                 ; 这里使用ESP定律

006042C3    83C4 04         ADD ESP,4     //ESP定律后挺到这里,向下找找关键跳转
006042C6    55              PUSH EBP
006042C7    53              PUSH EBX
006042C8    51              PUSH ECX
006042C9    57              PUSH EDI
006042CA    56              PUSH ESI
006042CB    52              PUSH EDX
…………中间代码省略
00604350    5A              POP EDX
00604351    5E              POP ESI
00604352    5F              POP EDI
00604353    59              POP ECX
00604354    5B              POP EBX
00604355    5D              POP EBP
00604356    FFE0            JMP EAX             //这里的CALL应该是跳向OEP呀~~   

PEncrypt 3.1 Final -> junkcodeeuk


OD载入:
004E3600 > $  B8 00E05500   MOV EAX,MediaFix.0055E000   //停到这里 F8单步一次
004E3605   .  FFD0          CALL EAX                                     //F7跟进此Call
004E3607      2C            DB 2C                                    ;  CHAR ','
……
F7跟进CALL
0055E000   /E9 25010000     JMP MediaFix.0055E12A           //这里的跳转是实现的 我们F8一次即可
0055E005   |57              PUSH EDI
0055E006   |65:6E           OUTS DX,BYTE PTR ES:[EDI]                ; I/O 命令
……
F8一次后停到这里:
0055E12A    58              POP EAX                                  ; MediaFix.004E3607  //停到这里,我们在该代码下方找到第一个retn语句 并下断
0055E12B    E8 16030000     CALL MediaFix.0055E446
0055E130    48              DEC EAX
……中间无用代码省去
0055E2A7    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
0055E2A9    59              POP ECX
0055E2AA    5F              POP EDI
0055E2AB    5E              POP ESI
0055E2AC    C3              RETN                                  //这就是第一个retn语句,下断,运行停在这里。F8一次 即可通往OEP

我这还得Ctrl+A分析下
004E3600 > $  55            PUSH EBP                                 ;  MediaFix.0055E005 // OEP
004E3601   .  8BEC          MOV EBP,ESP
004E3603   .  83C4 F0       ADD ESP,-10
004E3606   .  53            PUSH EBX
004E3607   .  B8 F0324E00   MOV EAX,MediaFix.004E32F0
004E360C   .  E8 8737F2FF   CALL MediaFix.00406D98

北斗壳 Nspack3.7


0057A867 >  9C              PUSHFD                                   ; OD载入后停到这里
0057A868    60              PUSHAD                                   ; 我们在这里ESP定律即可
0057A869    E8 00000000     CALL 流星Nisy.0057A86E

0057AAD9  - E9 5AF5F8FF     JMP 流星Nisy.0050A038                      ; ESP定律后到这里 F8一次到OEP
0057AADE    8BB5 A1F9FFFF   MOV ESI,DWORD PTR SS:[EBP-65F]
0057AAE4    0BF6            OR ESI,ESI
0057AAE6    0F84 97000000   JE 流星Nisy.0057AB83

0050A038      55            DB 55                                    ;  CHAR 'U'//这里Ctrl+A分析一下就可以了
0050A039      8B            DB 8B
0050A03A      EC            DB EC
0050A03B      83            DB 83
0050A03C      C4            DB C4
0050A03D      EC            DB EC
0050A03E      53            DB 53                                    ;  CHAR 'S'

Ctrl+A分析后的代码:
0050A038   .  55            PUSH EBP
0050A039   .  8BEC          MOV EBP,ESP
0050A03B   .  83C4 EC       ADD ESP,-14
0050A03E   .  53            PUSH EBX
0050A03F   .  56            PUSH ESI

脱壳的各种方法

常见脱壳知识:
1.PUSHAD (压栈) 代表程序的入口点,
2.POPAD (出栈) 代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近拉!
3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们找到程序真正的OEP,就可以立刻脱壳。

方法一:
1.用OD载入,不分析代码!
2.单步向下跟踪F8,是向下跳的让它实现
3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点--运行到所选)
4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!
5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP
6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入
7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。

方法二:
ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)
1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现。
2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车!
3.选种下断的地址,下硬件访问WORD断点。
4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳

方法三:
内存跟踪:
1:用OD打开软件!
2:点击选项--调试选项--异常,把里面的忽略全部√上!CTRL+F2重载下程序!
3:按ALT+M,DA 打开内存镜象,找到第一个.rsrc.按F2下断点,
然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到.RSRC上面的CODE,按F2下断点!
然后按SHIFT+F9,直接到达程序OEP,脱壳!

方法四:一步到达OEP(前辈们总结的经验)
1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处
2.来到大跳转处,点下F8,脱壳之!

方法五:
1:用OD打开软件!
2:点击选项--调试选项--异常,把里面的√全部去掉!CTRL+F2重载下程序
3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序运行的次数!
4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次
5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!
6:按F2下断点!然后按SHIFT+F9来到断点处!
7:去掉断点,按F8慢慢向下走!
8:到达程序的OEP,脱壳!
PYG19周年生日快乐!

该用户从未签到

发表于 2006-8-28 23:33:24 | 显示全部楼层
强!支持老大!
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2015-8-24 20:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-8-29 02:41:31 | 显示全部楼层
    呵呵,,对我有用!!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    发表于 2006-9-1 11:54:10 | 显示全部楼层
    很好,已经成系列话了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-1 18:06:11 | 显示全部楼层
    应该加上FSG2.0:lol:
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-3 15:29:03 | 显示全部楼层
    总结的很好,感觉很实用
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-5 15:31:26 | 显示全部楼层
    最後找OEP的五個方法整理的真好
    如何利用就靠經驗了吧
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-1-15 11:40
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2006-9-6 14:15:08 | 显示全部楼层
    感谢楼主的教程,受益非浅/:D
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-7-18 14:10
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2006-9-9 09:03:36 | 显示全部楼层
    感谢楼主的教程,受益非浅
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-2-12 11:35:09 | 显示全部楼层
    方法一:里面的第7.提到的“很大的跳转”,究竟是指多大的跳转?有没有个对很大的程度的定义?
    谢谢!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表