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大侠强大的脚本更脱壳带来的方便。
猪大家新年快乐
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)