首页
社区
课程
招聘
[原创]ASProtect 2.1x Delphi的跳转表修复
发表于: 2007-1-12 11:20 8037

[原创]ASProtect 2.1x Delphi的跳转表修复

2007-1-12 11:20
8037

ASProtect 2.1x Delphi的跳转表修复
ASProtect对Delphi的保护比一般别的程序的保护都要强很多,像VC等程序到了OEP后,都可以对照同类型的文件,进行OEP修复,但对Delphi程序来说,修复OEP,要困难很多。因为ASProtect保护了Delphi的跳转表。
好了,首先我们看看什么是跳转表,用一个未加壳的delphi程序来看
0044DBF8      2D            db      2D                               ;  CHAR '-'
0044DBF9      00            db      00
0044DBFA      00            db      00
0044DBFB      00            db      00             ------------------>这个DWORD代码跳转表项的数目 0x2D项
0044DBFC   .  00DC4400      dd      delphi.0044DC00------------------>这个是First项的地址
////////////////////////////////////////////////////////////////////
从下面开始 每两个DWORD为一对,代表一项
第一个是Initialization函数地址
第二个是Finalization函数地址
这就有点类似于C++中class的构造函数和析构函数
一直到OEP
注意最后一项只有析构函数
0044DD60      00            db      00
0044DD61      00            db      00
0044DD62      00            db      00
0044DD63      00            db      00
0044DD64   .  D0DB4400      dd      delphi.0044DBD0
////////////////////////////////////////////////////////////////////
0044DC00   .  D8654000      dd      delphi.004065D8
0044DC04   .  A8654000      dd      delphi.004065A8
0044DC08   .  2C644000      dd      delphi.0040642C
0044DC0C   .  D8634000      dd      delphi.004063D8
0044DC10   .  50664000      dd      delphi.00406650
0044DC14   .  20664000      dd      delphi.00406620
0044DC18   .  A4704000      dd      delphi.004070A4
0044DC1C   .  74704000      dd      delphi.00407074
0044DC20   .  DC704000      dd      delphi.004070DC
0044DC24   .  AC704000      dd      delphi.004070AC
0044DC28   .  980B4100      dd      delphi.00410B98
0044DC2C   .  680B4100      dd      delphi.00410B68
0044DC30   .  A4734000      dd      delphi.004073A4
0044DC34   .  74734000      dd      delphi.00407374
0044DC38   .  00B94000      dd      delphi.0040B900
0044DC3C   .  80B74000      dd      delphi.0040B780
0044DC40   .  10BA4000      dd      delphi.0040BA10
0044DC44   .  E0B94000      dd      delphi.0040B9E0
0044DC48   .  78FA4000      dd      delphi.0040FA78
0044DC4C   .  14FA4000      dd      delphi.0040FA14
0044DC50   .  94FD4000      dd      delphi.0040FD94
0044DC54   .  64FD4000      dd      delphi.0040FD64
0044DC58   .  600B4100      dd      delphi.00410B60
0044DC5C   .  100B4100      dd      delphi.00410B10
0044DC60   .  FCC34100      dd      delphi.0041C3FC
0044DC64   .  54C34100      dd      delphi.0041C354
0044DC68   .  2C394200      dd      delphi.0042392C
0044DC6C   .  FC384200      dd      delphi.004238FC
0044DC70   .  E43B4200      dd      delphi.00423BE4
0044DC74   .  B43B4200      dd      delphi.00423BB4
0044DC78   .  10554200      dd      delphi.00425510
0044DC7C   .  CC544200      dd      delphi.004254CC
0044DC80   .  58444200      dd      delphi.00424458
0044DC84   .  28444200      dd      delphi.00424428
0044DC88   .  D83C4200      dd      delphi.00423CD8
0044DC8C   .  A83C4200      dd      delphi.00423CA8
0044DC90   .  98C64100      dd      delphi.0041C698
0044DC94   .  68C64100      dd      delphi.0041C668
0044DC98   .  F0374200      dd      delphi.004237F0
0044DC9C   .  1C374200      dd      delphi.0042371C
0044DCA0   .  00AB4300      dd      delphi.0043AB00
0044DCA4   .  D0AA4300      dd      delphi.0043AAD0
0044DCA8   .  98444200      dd      delphi.00424498
0044DCAC   .  68444200      dd      delphi.00424468
0044DCB0   .  440F4400      dd      delphi.00440F44
0044DCB4   .  D40E4400      dd      delphi.00440ED4
0044DCB8   .  3C834300      dd      delphi.0043833C
0044DCBC   .  D4824300      dd      delphi.004382D4
0044DCC0   .  1C964300      dd      delphi.0043961C
0044DCC4   .  EC954300      dd      delphi.004395EC
0044DCC8   .  38804200      dd      delphi.00428038
0044DCCC   .  CC7F4200      dd      delphi.00427FCC
0044DCD0   .  64674200      dd      delphi.00426764
0044DCD4   .  34674200      dd      delphi.00426734
0044DCD8   .  2C674200      dd      delphi.0042672C
0044DCDC   .  FC664200      dd      delphi.004266FC
0044DCE0   .  F4664200      dd      delphi.004266F4
0044DCE4   .  C4664200      dd      delphi.004266C4
0044DCE8   .  BC664200      dd      delphi.004266BC
0044DCEC   .  8C664200      dd      delphi.0042668C
0044DCF0   .  9C674200      dd      delphi.0042679C
0044DCF4   .  6C674200      dd      delphi.0042676C
0044DCF8   .  48554200      dd      delphi.00425548
0044DCFC   .  18554200      dd      delphi.00425518
0044DD00   .  8C554200      dd      delphi.0042558C
0044DD04   .  50554200      dd      delphi.00425550
0044DD08   .  84664200      dd      delphi.00426684
0044DD0C   .  54664200      dd      delphi.00426654
0044DD10   .  D4674200      dd      delphi.004267D4
0044DD14   .  A4674200      dd      delphi.004267A4
0044DD18   .  486B4200      dd      delphi.00426B48
0044DD1C   .  186B4200      dd      delphi.00426B18
0044DD20   .  F46A4200      dd      delphi.00426AF4
0044DD24   .  C46A4200      dd      delphi.00426AC4
0044DD28   .  80714200      dd      delphi.00427180
0044DD2C   .  24714200      dd      delphi.00427124
0044DD30   .  70724200      dd      delphi.00427270
0044DD34   .  40724200      dd      delphi.00427240
0044DD38   .  E8714200      dd      delphi.004271E8
0044DD3C   .  AC714200      dd      delphi.004271AC
0044DD40   .  D8734200      dd      delphi.004273D8
0044DD44   .  A8734200      dd      delphi.004273A8
0044DD48   .  A4584200      dd      delphi.004258A4
0044DD4C   .  74584200      dd      delphi.00425874
0044DD50   .  D4D94400      dd      delphi.0044D9D4
0044DD54   .  78D94400      dd      delphi.0044D978
0044DD58   .  C8DB4400      dd      delphi.0044DBC8
0044DD5C   .  98DB4400      dd      delphi.0044DB98
0044DD60      00            db      00
0044DD61      00            db      00
0044DD62      00            db      00
0044DD63      00            db      00
0044DD64   .  D0DB4400      dd      delphi.0044DBD0
0044DD68 > $  55               push    ebp  ------------>OEP
0044DD69   .  8BEC             mov     ebp, esp
0044DD6B   .  83C4 F0          add     esp, -10
0044DD6E   .  B8 F8DB4400      mov     eax, 0044DBF8
0044DD73   .  E8 EC87FBFF      call    <@Sysinit@@InitExe$qqrpv>   F7调用Initialiation函数表
0044DD78   .  A1 DCED4400      mov     eax, dword ptr [44EDDC]
0044DD7D   .  8B00             mov     eax, dword ptr [eax]
0044DD7F   .  E8 A8E7FFFF      call    <unknown_libname_292>
0044DD84   .  8B0D B0EE4400    mov     ecx, dword ptr [44EEB0]                                      ;  delphi.0044FC1C
0044DD8A   .  A1 DCED4400      mov     eax, dword ptr [44EDDC]
0044DD8F   .  8B00             mov     eax, dword ptr [eax]
0044DD91   .  8B15 18DA4400    mov     edx, dword ptr [44DA18]                                      ;  delphi.0044DA64
0044DD97   .  E8 A8E7FFFF      call    <@Forms@TApplication@CreateForm$qqrp17System@TMetaClasspv>
0044DD9C   .  A1 DCED4400      mov     eax, dword ptr [44EDDC]
0044DDA1   .  8B00             mov     eax, dword ptr [eax]
0044DDA3   .  E8 1CE8FFFF      call    <@Forms@TApplication@Run$qqrv>
0044DDA8   .  E8 5B63FBFF      call    <@System@@Halt0$qqrv>
跳转表的构造函数的调用在
<@Sysinit@@InitExe$qqrpv>
        |
        <@System@@StartExe$qqrp23System@PackageInfoTablep17System@TLibModule>
                |
                <@System@_16605>->这个CALL是最终调用初始化函数表的
如何定位<@System@_16605>,就是<@Sysinit@@InitExe$qqrpv>进去
00406564 >/$  53               push    ebx
00406565  |.  8BD8             mov     ebx, eax
00406567  |.  33C0             xor     eax, eax
00406569  |.  A3 0CF74400      mov     dword ptr [44F70C], eax
0040656E  |.  6A 00            push    0                                                               ; /pModule = NULL
00406570  |.  E8 2BFFFFFF      call    <GetModuleHandleA_0>                                            ; \GetModuleHandleA
00406575  |.  A3 14F74400      mov     dword ptr [44F714], eax
0040657A  |.  A1 14F74400      mov     eax, dword ptr [44F714]
0040657F  |.  A3 90E04400      mov     dword ptr [44E090], eax
00406584  |.  33C0             xor     eax, eax
00406586  |.  A3 94E04400      mov     dword ptr [44E094], eax
0040658B  |.  33C0             xor     eax, eax
0040658D  |.  A3 98E04400      mov     dword ptr [44E098], eax
00406592  |.  E8 C1FFFFFF      call    <@SysInit@_16395>
00406597  |.  BA 8CE04400      mov     edx, 0044E08C
0040659C  |.  8BC3             mov     eax, ebx
0040659E  |.  E8 C1D9FFFF      call    <@System@@StartExe$qqrp23System@PackageInfoTablep17System@TLibM> F7进去
004065A3  |.  5B               pop     ebx
004065A4  \.  C3               retn
-------------------------------------------
00403F64 >/$  C705 14F04400 3C>mov     dword ptr [44F014], <jmp.&kernel32.RaiseException>
00403F6E  |.  C705 18F04400 4C>mov     dword ptr [44F018], <jmp.&kernel32.RtlUnwind>
00403F78  |.  A3 38F64400      mov     dword ptr [44F638], eax
00403F7D  |.  33C0             xor     eax, eax
00403F7F  |.  A3 3CF64400      mov     dword ptr [44F63C], eax
00403F84  |.  8915 40F64400    mov     dword ptr [44F640], edx
00403F8A  |.  8B42 04          mov     eax, dword ptr [edx+4]
00403F8D  |.  A3 2CF04400      mov     dword ptr [44F02C], eax
00403F92  |.  E8 C5FEFFFF      call    <SetExceptionHandler_0>
00403F97  |.  C605 34F04400 00 mov     byte ptr [44F034], 0
00403F9E  |.  E8 61FFFFFF      call    <@System@_16605>         这里就是啦
00403FA3  \.  C3               retn
好,我们进去看看都是什么
00403F04 > $  55               push    ebp
00403F05   .  8BEC             mov     ebp, esp
00403F07   .  53               push    ebx
00403F08   .  56               push    esi
00403F09   .  57               push    edi
00403F0A   .  A1 38F64400      mov     eax, dword ptr [44F638]-------->这个值跳转表开始的地方,就是跳转表项的数目的地址,我们可以用这个值来定位跳转表开始的位置,这个值在壳中也不会变换。
00403F0F   .  85C0             test    eax, eax
00403F11   .  74 4B            je      short 00403F5E
00403F13   .  8B30             mov     esi, dword ptr [eax]
00403F15   .  33DB             xor     ebx, ebx
00403F17   .  8B78 04          mov     edi, dword ptr [eax+4]
00403F1A   .  33D2             xor     edx, edx
00403F1C   .  55               push    ebp
00403F1D   .  68 4A3F4000      push    00403F4A
00403F22   .  64:FF32          push    dword ptr fs:[edx]
00403F25   .  64:8922          mov     dword ptr fs:[edx], esp
00403F28   .  3BF3             cmp     esi, ebx
00403F2A   .  7E 14            jle     short 00403F40
00403F2C   >  8B04DF           mov     eax, dword ptr [edi+ebx*8]---->取每一个构造函数
00403F2F   .  43               inc     ebx
00403F30   .  891D 3CF64400    mov     dword ptr [44F63C], ebx
00403F36   .  85C0             test    eax, eax
00403F38   .  74 02            je      short 00403F3C
00403F3A   .  FFD0             call    eax------------->调用构造函数
00403F3C   >  3BF3             cmp     esi, ebx
00403F3E   .^ 7F EC            jg      short 00403F2C
00403F40   >  33C0             xor     eax, eax
00403F42   .  5A               pop     edx
00403F43   .  59               pop     ecx
00403F44   .  59               pop     ecx
00403F45   .  64:8910          mov     dword ptr fs:[eax], edx
00403F48   .  EB 14            jmp     short 00403F5E
00403F4A   .^ E9 1DFAFFFF      jmp     <@System@@HandleAnyException$qqrv>
00403F4F   .  E8 50FFFFFF      call    <@System@_16604>
00403F54   .  E8 27FDFFFF      call    <@System@@RaiseAgain$qqrv>
00403F59   .  E8 76FDFFFF      call    <@@DoneExcept$qqrv>
00403F5E   >  5F               pop     edi
00403F5F   .  5E               pop     esi
00403F60   .  5B               pop     ebx
00403F61   .  5D               pop     ebp
00403F62   .  C3               retn
Finalization函数也一样,只不过是从最后一项开始,一直到第一样,和Initialation方向相反。
0044DDA8   .  E8 5B63FBFF      call    <@System@@Halt0$qqrv> 在这个CALL中进行。

OK,我们现在再来看看加过壳的跳转表吧。
0044DBF8    0100            add     dword ptr [eax], eax
0044DBFA    0000            add     byte ptr [eax], al
0044DBFC    58              pop     eax
0044DBFD    DC4400 D9       fadd    qword ptr [eax+eax-27]
0044DC01    DAAE 26A7A159   fisubr  dword ptr [esi+59A1A726]
0044DC07    0F3F            ???                                      ; 未知命令
0044DC09    F2:             prefix repne:
0044DC0A    2B7E 48         sub     edi, dword ptr [esi+48]
0044DC0D  - E9 97315B04     jmp     04A00DA9
0044DC12    78 1B           js      short 0044DC2F
0044DC14    A7              cmps    dword ptr [esi], dword ptr es:[e>
0044DC15    DADB            fcmovu  st, st(3)
0044DC17  ^ 74 C0           je      short 0044DBD9
0044DC19    80F9 78         cmp     cl, 78
0044DC1C    1C 87           sbb     al, 87
0044DC1E    93              xchg    eax, ebx
0044DC1F    1837            sbb     byte ptr [edi], dh
0044DC21    04 23           add     al, 23
0044DC23    FE              ???                                      ; 未知命令
0044DC24    60              pushad
0044DC25    12B5 9E9EAE4E   adc     dh, byte ptr [ebp+4EAE9E9E]
0044DC2B    24 3C           and     al, 3C
0044DC2D    EB 20           jmp     short 0044DC4F
0044DC2F    92              xchg    eax, edx
0044DC30    DDD0            fst     st
0044DC32    1D 593D6C80     sbb     eax, 806C3D59
0044DC37    26:E1 E9        loopde  short 0044DC23
0044DC3A  ^ 70 D1           jo      short 0044DC0D
0044DC3C  ^ 7C B7           jl      short 0044DBF5
0044DC3E    D197 AEF8E60D   rcl     dword ptr [edi+DE6F8AE], 1
0044DC44  ^ 75 F2           jnz     short 0044DC38
0044DC46    64:6D           ins     dword ptr es:[edi], dx
0044DC48    7A 15           jpe     short 0044DC5F
0044DC4A    F5              cmc
0044DC4B    41              inc     ecx
0044DC4C    F0:CC           lock int3                                ; 不允许锁定前缀
0044DC4E    7E 7D           jle     short 0044DCCD
0044DC50    E2 5D           loopd   short 0044DCAF
0044DC52    8586 F74D85C9   test    dword ptr [esi+C9854DF7], eax
0044DC58    08C6            or      dh, al
0044DC5A    DE00            fiadd   word ptr [eax]
0044DC5C    34 C6           xor     al, 0C6
0044DC5E    DE00            fiadd   word ptr [eax]
0044DC60    80D7 EC         adc     bh, 0EC
0044DC63    ED              in      eax, dx
0044DC64    5B              pop     ebx
0044DC65    68 77BB7329     push    2973BB77
0044DC6A    8CD0            mov     ax, ss
0044DC6C    AB              stos    dword ptr es:[edi]
0044DC6D    C52E            lds     ebp, fword ptr [esi]
0044DC6F    3D 4BF07657     cmp     eax, 5776F04B
0044DC74    CF              iretd
0044DC75    2C AD           sub     al, 0AD
0044DC77    18944F 2B63CCE4 sbb     byte ptr [edi+ecx*2+E4CC632B], d>
0044DC7E    3150 B0         xor     dword ptr [eax-50], edx
0044DC81    8F              ???                                      ; 未知命令
0044DC82    4B              dec     ebx
0044DC83    F2:             prefix repne:
0044DC84    0B29            or      ebp, dword ptr [ecx]
0044DC86    E7 3E           out     3E, eax
0044DC88    6D              ins     dword ptr es:[edi], dx
0044DC89    40              inc     eax
0044DC8A    24 01           and     al, 1
0044DC8C    B6 24           mov     dh, 24
0044DC8E    1015 BCA6D739   adc     byte ptr [39D7A6BC], dl
0044DC94    3D 49A3406F     cmp     eax, 6F40A349
0044DC99    77 0F           ja      short 0044DCAA
0044DC9B  ^ 79 CF           jns     short 0044DC6C
0044DC9D    FB              sti
0044DC9E    92              xchg    eax, edx
0044DC9F    8B06            mov     eax, dword ptr [esi]
0044DCA1    E7 3C           out     3C, eax
0044DCA3    21FD            and     ebp, edi
0044DCA5    818E 1C91066E 3>or      dword ptr [esi+6E06911C], 67475D>
0044DCAF    37              aaa
0044DCB0    A0 6EB84B3E     mov     al, byte ptr [3E4BB86E]
0044DCB5  ^ 7C F3           jl      short 0044DCAA
0044DCB7    E2 41           loopd   short 0044DCFA
0044DCB9    42              inc     edx
0044DCBA    1E              push    ds
0044DCBB    58              pop     eax
0044DCBC  ^ 76 F0           jbe     short 0044DCAE
0044DCBE    91              xchg    eax, ecx
0044DCBF    49              dec     ecx
0044DCC0    0C 78           or      al, 78
0044DCC2    1F              pop     ds
0044DCC3    3336            xor     esi, dword ptr [esi]
0044DCC5    51              push    ecx
0044DCC6    2C F1           sub     al, 0F1
0044DCC8    4C              dec     esp
0044DCC9  ^ 78 C4           js      short 0044DC8F
0044DCCB    02F1            add     dh, cl
0044DCCD    A5              movs    dword ptr es:[edi], dword ptr [e>
0044DCCE    DCCF            fmul    st(7), st
0044DCD0    25 0C476156     and     eax, 5661470C
0044DCD5    2E:1018         adc     byte ptr cs:[eax], bl
0044DCD8    D898 426F5582   fcomp   dword ptr [eax+82556F42]
0044DCDE    48              dec     eax
0044DCDF    EA 13AE7696 370>jmp     far 0C37:9676AE13
0044DCE6    64:CE           into
0044DCE8    4E              dec     esi
0044DCE9    E8 2133C7C7     call    C80C100F
0044DCEE  ^ 7C F9           jl      short 0044DCE9
0044DCF0    3B15 D8028A5C   cmp     edx, dword ptr [5C8A02D8]
0044DCF6    4D              dec     ebp
0044DCF7    67:49           dec     ecx
0044DCF9    B5 08           mov     ch, 8
0044DCFB    64:0283 35C82EC>add     al, byte ptr fs:[ebx+CD2EC835]
0044DD02  - E9 6D09BABD     jmp     BDFEE674
0044DD07    398A FE24C839   cmp     dword ptr [edx+39C824FE], ecx
0044DD0D    49              dec     ecx
0044DD0E    B6 C6           mov     dh, 0C6
0044DD10    98              cwde
0044DD11    F5              cmc
0044DD12    E7 6A           out     6A, eax
0044DD14    64:99           cdq
0044DD16    E4 D0           in      al, 0D0
0044DD18    E8 2AA10E17     call    17537E47
0044DD1D    DA3A            fidivr  dword ptr [edx]
0044DD1F    2E:34 E8        xor     al, 0E8
0044DD22    42              inc     edx
0044DD23    8B37            mov     esi, dword ptr [edi]
0044DD25    F7A2 263CB312   mul     dword ptr [edx+12B33C26]
0044DD2B    F3:             prefix rep:
0044DD2C    A3 DC603CB6     mov     dword ptr [B63C60DC], eax
0044DD31    EE              out     dx, al
0044DD32  - 0F89 F10BF3C6   jns     C737E929
0044DD38    52              push    edx
0044DD39    DB              ???                                      ; 未知命令
0044DD3A    E4 7B           in      al, 7B
0044DD3C    35 839D5AC0     xor     eax, C05A9D83
0044DD41    EA 707BD1F3 640>jmp     far 0564:F3D17B70
0044DD48    DC57 D1         fcom    qword ptr [edi-2F]
0044DD4B    1B66 45         sbb     esp, dword ptr [esi+45]
0044DD4E    B0 53           mov     al, 53
0044DD50    D211            rcl     byte ptr [ecx], cl
0044DD52    0F02C6          lar     eax, esi
0044DD55    6B7B 2D 63      imul    edi, dword ptr [ebx+2D], 63
0044DD59    014B EB         add     dword ptr [ebx-15], ecx
0044DD5C    FD              std
0044DD5D    8B0A            mov     ecx, dword ptr [edx]
0044DD5F    7F 34           jg      short 0044DD95
0044DD61    90              nop
0044DD62    857A 6C         test    dword ptr [edx+6C], edi
0044DD65    73 34           jnb     short 0044DD9B
已经面目全非了,在OEP处,跟踪了一阵子就来到
呵呵,System@_16605没有被搞到壳里面去,来来,我们一步一步走。
00403F04    55              push    ebp
00403F05    8BEC            mov     ebp, esp
00403F07    53              push    ebx
00403F08    56              push    esi
00403F09    57              push    edi
00403F0A    A1 38F64400     mov     eax, dword ptr [44F638]---->这个值跳转表开始的地方,记下来,用来修复用
00403F0F    85C0            test    eax, eax
00403F11    74 4B           je      short 00403F5E
00403F13    8B30            mov     esi, dword ptr [eax]---->这个值本来应该是0x2D,项目的个数,但是现在变成0x1了
00403F15    33DB            xor     ebx, ebx
00403F17    8B78 04         mov     edi, dword ptr [eax+4]
00403F1A    33D2            xor     edx, edx
00403F1C    55              push    ebp
00403F1D    68 4A3F4000     push    00403F4A
00403F22    64:FF32         push    dword ptr fs:[edx]
00403F25    64:8922         mov     dword ptr fs:[edx], esp
00403F28    3BF3            cmp     esi, ebx
00403F2A    7E 14           jle     short 00403F40
00403F2C    8B04DF          mov     eax, dword ptr [edi+ebx*8]
00403F2F    43              inc     ebx
00403F30    891D 3CF64400   mov     dword ptr [44F63C], ebx
00403F36    85C0            test    eax, eax
00403F38    74 02           je      short 00403F3C
00403F3A    FFD0            call    eax----------->这里进入壳里,初始化函数跳到壳中执行了。OK,F7
00403F3C    3BF3            cmp     esi, ebx
00403F3E  ^ 7F EC           jg      short 00403F2C
00403F40    33C0            xor     eax, eax
00403F42    5A              pop     edx
00403F43    59              pop     ecx
00403F44    59              pop     ecx
00403F45    64:8910         mov     dword ptr fs:[eax], edx
00403F48    EB 14           jmp     short 00403F5E
00403F4A  ^ E9 1DFAFFFF     jmp     0040396C
00403F4F    E8 50FFFFFF     call    00403EA4
00403F54    E8 27FDFFFF     call    00403C80
00403F59    E8 76FDFFFF     call    00403CD4
00403F5E    5F              pop     edi
00403F5F    5E              pop     esi
00403F60    5B              pop     ebx
00403F61    5D              pop     ebp
00403F62    C3              retn
F7进入壳里面来到,也许你的地址会不一样
00DEC608    53              push    ebx
00DEC609    B3 01           mov     bl, 1
00DEC60B    803D 0436DF00 0>cmp     byte ptr [DF3604], 0 --->这是个标志
00DEC612    74 1A           je      short 00DEC62E
00DEC614    A1 0038DF00     mov     eax, dword ptr [DF3800]
00DEC619    8B00            mov     eax, dword ptr [eax]
00DEC61B    50              push    eax       --->这个是ImageBase=0x400000
00DEC61C    A1 FC35DF00     mov     eax, dword ptr [DF35FC]
00DEC621    50              push    eax       --->Table1地址
00DEC622    A1 F835DF00     mov     eax, dword ptr [DF35F8]
00DEC627    50              push    eax              --->Table2地址
00DEC628    FF15 0036DF00   call    dword ptr [DF3600]  ->F7跟进
00DEC62E    8BC3            mov     eax, ebx
00DEC630    5B              pop     ebx
00DEC631    C3              retn
通过后来分析知道,Table1存放加密后的跳转表项的RVA值,Table2是一个效验的表,通过它和code代码,来得到正确的值,也就是说[DF3600]进入的call,不能下普通断点了,好在硬件断点可以用。
进入[DF3600],看到
01070000    52              push    edx
01070001    2BD1            sub     edx, ecx
01070003    8D9411 A08F4800 lea     edx, dword ptr [ecx+edx+488FA0]
0107000A    8D5424 13       lea     edx, dword ptr [esp+13]
0107000E    8D5402 ED       lea     edx, dword ptr [edx+eax-13]
01070012    2BD0            sub     edx, eax
01070014    57              push    edi
01070015    337C24 28       xor     edi, dword ptr [esp+28]
01070019    BF 82A14000     mov     edi, 40A182
0107001E    51              push    ecx
0107001F    81E9 367BAC10   sub     ecx, 10AC7B36
01070025    50              push    eax
01070026    F2:             prefix repne:
01070027    EB 01           jmp     short 0107002A
01070029  - E9 33442428     jmp     292B4461
0107002E    83C8 31         or      eax, 31
01070031    81E7 66F9F3E5   and     edi, E5F3F966
01070037    FF72 08         push    dword ptr [edx+8]
0107003A    BF F6CF4700     mov     edi, 47CFF6
0107003F    83EF D7         sub     edi, -29
01070042    5F              pop     edi
01070043    EB 01           jmp     short 01070046
01070045    698D 4C4B42FF 7>imul    ecx, dword ptr [ebp+FF424B4C], D9C10C72

一步一步F7
0107005B    8B07            mov     eax, dword ptr [edi]--->取Table1中每项值
0107005D    0BC0            or      eax, eax
0107005F    0F84 FA010000   je      0107025F
01070065   |81F8 8464D6AF   cmp     eax, AFD66484
0107006B   |0F84 DD010000   je      0107024E
我们看看table1是什么吧 我的table1地址是1050000
01050000  40 F6 9B EC 0F B3 2C EE 83 2C 8D F2 2B DE BD C2  @????,?+藿
01050010  06 D4 5F 42 54 3E C6 8A C6 24 E3 30 9C 77 8C DD  赃BT>?????
01050020  39 B9 BA EE 51 3D B7 97 E0 37 60 03 C2 45 75 5B  9购钛=??`屡u[
01050030  82 EB 8F FD 08 84 B0 B3 40 B6 67 7E 61 C3 9F 55  ???忱剁~a?U
01050040  32 6E E3 30 FA E8 1A CF D5 9C 9D AF 4E E9 1A CF  2n??险???
01050050  6F 68 AF 68 56 2A 9C D3 5A C7 86 03 41 3F 9F 05  oh?V*?Z?A??
01050060  FE 70 5D B4 52 02 5E B4 E8 20 4E 3C F4 B9 C3 8A  ?]匆^磋 N<艄?
01050070  7B DD E2 85 CB 9F B1 02 E9 10 AC 9A 53 B1 61 C3  {葩????S贬
01050080  AF AB 32 1D AD DC 99 75 E8 D9 BE B4 51 B2 A4 51  ?2??栀敬Q菠Q
01050090  C7 CF 21 52 65 39 38 DF 28 C1 48 E2 DF 0C 25 43  窍!Re98?寥膺.%C
010500A0  33 43 41 AF 2C 93 6A 7E E0 70 61 03 BD 52 82 A8  3CA??~囵a揭?
010500B0  20 74 C5 8A 6F A3 D4 56 D6 A1 B4 CB 4F 48 F0 E1   t?oTV帧此OH疳
010500C0  C5 97 31 DD 0B F3 BA 7D AA 7A FD 85 5F 34 B0 0A  ?1?蠛}??_4?
010500D0  2D AE 63 4D 28 75 A0 13 A0 51 52 2B C2 8B E9 1D  -?M(u?_QR+??
010500E0  A1 18 83 F0 3E 18 75 5B E1 E1 3F F1 3E 7C E2 83  ??>u[後??|?
010500F0  CA F3 11 D7 65 07 AE 9B 21 2A 89 DF AE AF 93 33  鼠族?!*???
01050100  BA 1F 37 EB AD E4 13 2E D3 BA 6E D9 60 F4 39 33  ?7氕?.雍n汆?3
01050110  EB 1A 59 BA 3A F3 15 02 25 F3 D2 70 BF E7 74 11  ?Y??%笠p跨t
01050120  CD 3F 89 DF 6B 96 DB AC 36 D6 0A 66 8B 7C F1 68  ??k???f?耔
01050130  17 FA 0B AE 15 FC E4 08 08 A5 F1 5C 88 19 A0 8F  ???ヱ\?_?
01050140  6B 76 BB C2 0C 12 87 D4 CC 77 8C DD D4 1D 59 17  kv宦.?眺??Y
01050150  36 AE D1 5F 77 2E 8D F2 3C C6 54 2B 7F EB 09 AE  6?_w.?<圃+?
01050160  84 64 D6 AF 48 4D 1F 1D                          ?织HM..

接着走 f7,记住一定要f7,因为中间有过call会迷惑你,一会来到
0107020B    2B37            sub     esi, dword ptr [edi]
0107020D    2B2B            sub     ebp, dword ptr [ebx]
0107020F    8D5B 04         lea     ebx, dword ptr [ebx+4]
01070212    3BDE            cmp     ebx, esi
01070214  ^ 0F82 F3FFFFFF   jb      0107020D          这里就是用table2,table1,和当前代码计算值了,千万不要加普通断点,否则会出错

还是f7,最终来到
0107018A    81F6 BCADBD89   xor     esi, 89BDADBC
01070190    5E              pop     esi
01070191    0342 10         add     eax, dword ptr [edx+10]->[edx+10]存放ImageBase,eax是RVA
01070194    FFD0            call    eax----->这时的eax就是我们要找的跳转表的值

在这里下硬件断点吧,取每一个eax的值吧,呵呵
也可以一进来就搜索5E 03 42 10 FF D0,来定位这个地方。当然你也可以写一个脚本。

Finalization时候,01070194    FFD0            call    eax 这个地址是不会变的
直接下硬件断点,获得吧

唯一不同的就是,Finalization的获得的顺序是从后往前。

谢谢崛北真希小姐和kanxue对我的帮助,感谢VolX大侠强大的脚本更脱壳带来的方便。
猪大家新年快乐


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

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
楼主的头像好漂亮啊
2007-1-12 11:27
0
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
Delphi的跳转表,后来大侠们说了,内部函数表..
2007-1-12 12:43
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
这个跳转表也有人称其为初始化表
2007-1-12 13:08
0
雪    币: 191
活跃值: (345)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
5
PELOCK 1.06 好象也偷跳转DELPHI的跳转表
2007-1-12 13:37
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
经典,学习一下
2007-1-12 15:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主的照片漂亮是漂亮.....可是有点模糊,建议拍得清楚点 的确漂亮
2007-1-12 15:35
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
8
这个学习不了,只能顶
2007-1-15 10:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
ASProtect 2.1x这个壳我经常遇到,我直接用"内存镜像"来脱,就搞定了,看了这篇文章收获很多,赞一个!~~~~~
2007-1-15 11:07
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
10
真要命,好难看懂~~
2007-1-17 08:33
0
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
11
黑暗中的一盏明灯。
以前跟踪到call eax的时候就不知道如何下去了。
下啥断点都被搞定。
2007-1-17 11:58
0
游客
登录 | 注册 方可回帖
返回
//