首页
社区
课程
招聘
[原创]ASPR学习笔记上篇:修复IAT
发表于: 2009-1-13 17:47 8530

[原创]ASPR学习笔记上篇:修复IAT

2009-1-13 17:47
8530

这次的目标是AllNetic Working Time Tracker - Version 2.2,好像是一个工作时间安排的工具吧?
下载地址是 http://www.allnetic.com/
先查看一下壳的版本:
PEiD扫描:ASProtect 2.1x SKE -> Alexey Solodovnikov
使用verA0.13插件扫描:Version: ASProtect 1.35 build 04.25 Release [Extract]

找OEP就略过了,难度不大,太占篇幅了

只总结一下ASPR程序找OEP的思路:
1.刚开始F7慢慢跟,等跳到新的区段中后就可以观察后面的代码直接F4或CTRL+F9大段略过。
2.当再次跳到新的区段时直接用CTRL+F9执行到返回。注意观察一下返回前的代码,有一个地方会连续把8个地址压入堆栈,这就说明很快要到达OEP了,经过9次CTRL+F9再F7慢慢跟,直到跳到一个新区段的开始位置时,跳过循环就到达OEP附近了。
3.最简单快速的办法是下断点bp GetSystemTime,然后经过十多次RET,再F7到新区段的开始位置,再F4跳过循环,就到达OEP了。

找到OEP后的程序的输入表很多都被加密了,需要修复IAT。
既然壳会解密出一部分IAT,那么看看是在哪解密出来的?随便找一处有调用系统API的代码,发现形式是call [69CCXX],用dd 69CC00查看一下,然后向上翻找到最上面的一行,我这里是69CB98,下硬件断点hw 69CB98,重新载入后执行,经过几次数据初始化和代码解密的中断,来到这里:

01263DC4    53               push    ebx
01263DC5    56               push    esi
01263DC6    57               push    edi
01263DC7    55               push    ebp
01263DC8    83C4 F4          add     esp, -0C
01263DCB    8BF0             mov     esi, eax
01263DCD    C60424 01        mov     byte ptr [esp], 1
01263DD1    EB 01            jmp     short 01263DD4
01263DD3    90               nop
01263DD4    837E 04 00       cmp     dword ptr [esi+4], 0        ; 导入表数据组为空?
01263DD8    0F84 24010000    je      01263F02
01263DDE    8B7E 04          mov     edi, dword ptr [esi+4]      ; 取导入表数据组基址
01263DE1    8B46 50          mov     eax, dword ptr [esi+50]     ; 取程序基址
01263DE4    894424 04        mov     dword ptr [esp+4], eax      ; 保存程序基址
01263DE8    EB 01            jmp     short 01263DEB
01263DEA    90               nop
01263DEB    8D46 34          lea     eax, dword ptr [esi+34]
01263DEE    B9 09000000      mov     ecx, 9
01263DF3    8BD7             mov     edx, edi
01263DF5    E8 9A1BFEFF      call    01245994                    ; 把导入表数据组前9字节复制出来
01263DFA    83C7 09          add     edi, 9
01263DFD    8B15 9C662601    mov     edx, dword ptr [126669C]
01263E03    8B12             mov     edx, dword ptr [edx]
01263E05    8BC6             mov     eax, esi
01263E07    E8 5CF1FFFF      call    01262F68
01263E0C    84C0             test    al, al
01263E0E    0F84 E2000000    je      01263EF6
01263E14    6A 14            push    14
01263E16    E8 89F1FEFF      call    01252FA4
01263E1B    01C7             add     edi, eax
01263E1D    E9 D4000000      jmp     01263EF6
01263E22    894424 08        mov     dword ptr [esp+8], eax      ; 保存IAT地址偏移
01263E26    6A FF            push    -1
01263E28    E8 77F1FEFF      call    01252FA4                    ; rnd
01263E2D    40               inc     eax
01263E2E    8903             mov     dword ptr [ebx], eax        ; 随机值覆盖掉导入表数据组IAT偏移
01263E30    83C7 04          add     edi, 4
01263E33    83C7 06          add     edi, 6
01263E36    8BEF             mov     ebp, edi                    ; DLL名称
01263E38    8BC7             mov     eax, edi
01263E3A    E8 355EFEFF      call    01249C74                    ; 获取DLL名称长度
01263E3F    40               inc     eax
01263E40    0FB7C0           movzx   eax, ax
01263E43    03F8             add     edi, eax
01263E45    8B46 48          mov     eax, dword ptr [esi+48]
01263E48    8B00             mov     eax, dword ptr [eax]
01263E4A    3346 48          xor     eax, dword ptr [esi+48]
01263E4D    2B46 4C          sub     eax, dword ptr [esi+4C]
01263E50    E8 5FFFFFFF      call    01263DB4                    ; 校验GetProcAddress前4字节
01263E55    25 FF000000      and     eax, 0FF                    ; eax必须为0
01263E5A    03F8             add     edi, eax
01263E5C    8A1F             mov     bl, byte ptr [edi]          ; 取API名称字符串加密方式标志位key
01263E5E    47               inc     edi
01263E5F    8B46 40          mov     eax, dword ptr [esi+40]
01263E62    8B00             mov     eax, dword ptr [eax]
01263E64    3346 40          xor     eax, dword ptr [esi+40]
01263E67    2B46 44          sub     eax, dword ptr [esi+44]
01263E6A    E8 45FFFFFF      call    01263DB4                    ; 校验LoadLibraryA前4字节
01263E6F    25 FF000000      and     eax, 0FF                    ; eax必须为0
01263E74    03F8             add     edi, eax
01263E76    8B4424 04        mov     eax, dword ptr [esp+4]      ; 取程序基址
01263E7A    014424 08        add     dword ptr [esp+8], eax      ; 程序基址+IAT地址偏移:计算出IAT实际地址
01263E7E    EB 71            jmp     short 01263EF1
01263E80    3A5E 37          cmp     bl, byte ptr [esi+37]
01263E83    75 17            jnz     short 01263E9C
01263E85    83C7 02          add     edi, 2                      ; key=[esi+37]:
01263E88    8BC7             mov     eax, edi
01263E8A    50               push    eax
01263E8B    55               push    ebp
01263E8C    8D4424 10        lea     eax, dword ptr [esp+10]
01263E90    50               push    eax
01263E91    56               push    esi
01263E92    E8 EDFCFFFF      call    01263B84                    ; 保存API地址
01263E97    83C7 04          add     edi, 4                      ; 数据组指针+4
01263E9A    EB 52            jmp     short 01263EEE
01263E9C    3A5E 39          cmp     bl, byte ptr [esi+39]
01263E9F    75 17            jnz     short 01263EB8
01263EA1    83C7 02          add     edi, 2                      ; key=[esi+39]:
01263EA4    8BC7             mov     eax, edi
01263EA6    50               push    eax
01263EA7    55               push    ebp
01263EA8    8D4424 10        lea     eax, dword ptr [esp+10]
01263EAC    50               push    eax
01263EAD    56               push    esi
01263EAE    E8 D1FCFFFF      call    01263B84                    ; 保存API地址
01263EB3    83C7 02          add     edi, 2                      ; 数据组指针+2
01263EB6    EB 36            jmp     short 01263EEE
01263EB8    3A5E 38          cmp     bl, byte ptr [esi+38]
01263EBB    75 17            jnz     short 01263ED4
01263EBD    83C7 02          add     edi, 2                      ; key=[esi+38]:
01263EC0    8BC7             mov     eax, edi
01263EC2    50               push    eax
01263EC3    55               push    ebp
01263EC4    8D4424 10        lea     eax, dword ptr [esp+10]
01263EC8    50               push    eax
01263EC9    56               push    esi
01263ECA    E8 B5FCFFFF      call    01263B84                    ; 保存API地址
01263ECF    83C7 02          add     edi, 2                      ; 数据组指针+2
01263ED2    EB 1A            jmp     short 01263EEE
01263ED4    83C7 02          add     edi, 2                      ; 其他:
01263ED7    8BC7             mov     eax, edi
01263ED9    50               push    eax
01263EDA    55               push    ebp
01263EDB    8D4424 10        lea     eax, dword ptr [esp+10]
01263EDF    50               push    eax
01263EE0    56               push    esi
01263EE1    E8 9EFCFFFF      call    01263B84                    ; 保存API地址
01263EE6    0FB707           movzx   eax, word ptr [edi]         ; 取API字符串长度
01263EE9    83C0 02          add     eax, 2                      ; 数据组指针+2
01263EEC    03F8             add     edi, eax                    ; 数据组指针+字符串长
01263EEE    8A1F             mov     bl, byte ptr [edi]          ; 取下一个字符串解密标志位key
01263EF0    47               inc     edi
01263EF1    3A5E 34          cmp     bl, byte ptr [esi+34]       ; key=[ebx+34]:循环结束
01263EF4  ^ 75 8A            jnz     short 01263E80
01263EF6    8BDF             mov     ebx, edi
01263EF8    8B03             mov     eax, dword ptr [ebx]        ; 取IAT地址偏移
01263EFA    85C0             test    eax, eax
01263EFC  ^ 0F85 20FFFFFF    jnz     01263E22                    ; 偏移为0时循环结束
01263F02    8A0424           mov     al, byte ptr [esp]
01263F05    83C4 0C          add     esp, 0C
01263F08    5D               pop     ebp
01263F09    5F               pop     edi
01263F0A    5E               pop     esi
01263F0B    5B               pop     ebx
01263F0C    C3               retn
01263B8D    53              push    ebx
01263B8E    56              push    esi
01263B8F    57              push    edi
01263B90    8B55 14         mov     edx, dword ptr [ebp+14]
01263B93    8B5D 08         mov     ebx, dword ptr [ebp+8]
01263B96    8DBD FAFEFFFF   lea     edi, dword ptr [ebp-106]
01263B9C    8BC2            mov     eax, edx
01263B9E    48              dec     eax
01263B9F    83E8 02         sub     eax, 2
01263BA2    0FB630          movzx   esi, byte ptr [eax]                 ; 解密方式标志位key
01263BA5    8B45 10         mov     eax, dword ptr [ebp+10]
01263BA8    83E8 02         sub     eax, 2
01263BAB    0FB600          movzx   eax, byte ptr [eax]                 ; dll hash
01263BAE    3B43 2C         cmp     eax, dword ptr [ebx+2C]             ; is dll already loaded?
01263BB1    76 06           jbe     short 01263BB9
01263BB3    8943 2C         mov     dword ptr [ebx+2C], eax             ; save dll hash
01263BB6    EB 01           jmp     short 01263BB9
01263BB8    90              nop
01263BB9    33C0            xor     eax, eax
01263BBB    8A43 3B         mov     al, byte ptr [ebx+3B]               ; 第一种加密方式:key=ebx+3B
01263BBE    3BF0            cmp     esi, eax
01263BC0    75 5E           jnz     short 01263C20
01263BC2    EB 01           jmp     short 01263BC5
01263BC4    90              nop
01263BC5    66:8B02         mov     ax, word ptr [edx]                  ; 待解密API名称字符串的长度
01263BC8    66:8945 FA      mov     word ptr [ebp-6], ax
01263BCC    83C2 02         add     edx, 2
01263BCF    8955 FC         mov     dword ptr [ebp-4], edx              ; 待解密API名称字符串地址
01263BD2    66:817D FA FF00 cmp     word ptr [ebp-6], 0FF
01263BD8    76 0B           jbe     short 01263BE5                      ; 超长?
01263BDA    0FB745 FA       movzx   eax, word ptr [ebp-6]
01263BDE    E8 61E9FDFF     call    01242544
01263BE3    8BF8            mov     edi, eax
01263BE5    0FB775 FA       movzx   esi, word ptr [ebp-6]
01263BE9    8BCE            mov     ecx, esi
01263BEB    8B55 FC         mov     edx, dword ptr [ebp-4]
01263BEE    8BC7            mov     eax, edi
01263BF0    E8 9F1DFEFF     call    <CopyStringByByte>                  ; 加密的字符串复制出来
01263BF5    6A 0A           push    0A
01263BF7    8D4B 12         lea     ecx, dword ptr [ebx+12]             ; 解密:使用ebx+12开始的种子进行XOR解密
01263BFA    8BD6            mov     edx, esi
01263BFC    8BC7            mov     eax, edi
01263BFE    E8 9DDCFEFF     call    <DecyptString>                      ; 字符串解密
01263C03    897D FC         mov     dword ptr [ebp-4], edi
01263C06    8B45 FC         mov     eax, dword ptr [ebp-4]
01263C09    50              push    eax
01263C0A    8B45 10         mov     eax, dword ptr [ebp+10]
01263C0D    50              push    eax
01263C0E    53              push    ebx
01263C0F    E8 7CFDFFFF     call    <GetApiAddress>                     ; 根据DLL名和API名获取API地址
01263C14    8B55 0C         mov     edx, dword ptr [ebp+C]
01263C17    8B12            mov     edx, dword ptr [edx]
01263C19    8902            mov     dword ptr [edx], eax                ; 保存IAT地址
01263C1B    E9 74010000     jmp     01263D94
01263C20    33C0            xor     eax, eax
01263C22    8A43 35         mov     al, byte ptr [ebx+35]               ; 第二种加密方式:key=ebx+35,ebx+36,ebx+37,ebx+3A及其他
01263C25    3BF0            cmp     esi, eax
01263C27    74 22           je      short 01263C4B
01263C29    33C0            xor     eax, eax
01263C2B    8A43 36         mov     al, byte ptr [ebx+36]
01263C2E    3BF0            cmp     esi, eax
01263C30    74 19           je      short 01263C4B
01263C32    33C0            xor     eax, eax
01263C34    8A43 37         mov     al, byte ptr [ebx+37]
01263C37    3BF0            cmp     esi, eax
01263C39    74 10           je      short 01263C4B
01263C3B    33C0            xor     eax, eax
01263C3D    8A43 3A         mov     al, byte ptr [ebx+3A]
01263C40    3BF0            cmp     esi, eax
01263C42    0F85 B7000000   jnz     01263CFF
01263C48    EB 01           jmp     short 01263C4B
01263C4A    90              nop
01263C4B    33C0            xor     eax, eax
01263C4D    8A43 36         mov     al, byte ptr [ebx+36]               ; key=ebx+36,ebx+3A时才解密IAT
01263C50    3BF0            cmp     esi, eax
01263C52    74 09           je      short 01263C5D                      ; *是否解密IAT
01263C54    33C0            xor     eax, eax
01263C56    8A43 3A         mov     al, byte ptr [ebx+3A]
01263C59    3BF0            cmp     esi, eax
01263C5B    75 43           jnz     short 01263CA0
01263C5D    66:8B02         mov     ax, word ptr [edx]                  ; 待解密API名称字符串的长度
01263C60    66:8945 FA      mov     word ptr [ebp-6], ax
01263C64    83C2 02         add     edx, 2
01263C67    8955 FC         mov     dword ptr [ebp-4], edx              ; 待解密API名称字符串地址
01263C6A    66:817D FA FF00 cmp     word ptr [ebp-6], 0FF
01263C70    76 0B           jbe     short 01263C7D                      ; 超长?
01263C72    0FB745 FA       movzx   eax, word ptr [ebp-6]
01263C76    E8 C9E8FDFF     call    01242544
01263C7B    8BF8            mov     edi, eax
01263C7D    0FB74D FA       movzx   ecx, word ptr [ebp-6]
01263C81    8B55 FC         mov     edx, dword ptr [ebp-4]
01263C84    8BC7            mov     eax, edi
01263C86    E8 091DFEFF     call    <CopyStringByByte>                  ; 字符串复制出来
01263C8B    6A 0A           push    0A
01263C8D    8D4B 08         lea     ecx, dword ptr [ebx+8]              ; 解密:使用ebx+8开始的种子进行XOR解密
01263C90    0FB755 FA       movzx   edx, word ptr [ebp-6]
01263C94    8BC7            mov     eax, edi
01263C96    E8 05DCFEFF     call    <DecyptString>                      ; 字符串解密
01263C9B    897D FC         mov     dword ptr [ebp-4], edi
01263C9E    EB 08           jmp     short 01263CA8
01263CA0    8B02            mov     eax, dword ptr [edx]
01263CA2    8945 FC         mov     dword ptr [ebp-4], eax
01263CA5    EB 01           jmp     short 01263CA8
01263CA7    90              nop
01263CA8    33C0            xor     eax, eax
01263CAA    8A43 3A         mov     al, byte ptr [ebx+3A]
01263CAD    3BF0            cmp     esi, eax
01263CAF    75 27           jnz     short 01263CD8                      ; key=ebx+3A时获取IAT地址并修改成壳里调用
01263CB1    8B45 FC         mov     eax, dword ptr [ebp-4]
01263CB4    50              push    eax
01263CB5    8B45 10         mov     eax, dword ptr [ebp+10]
01263CB8    50              push    eax
01263CB9    53              push    ebx
01263CBA    E8 D1FCFFFF     call    <GetApiAddress>
01263CBF    8B15 AC672601   mov     edx, dword ptr [12667AC]
01263CC5    8902            mov     dword ptr [edx], eax
01263CC7    B8 9C752501     mov     eax, 125759C                        ; *修改IAT地址为壳内容
01263CCC    8B55 0C         mov     edx, dword ptr [ebp+C]
01263CCF    8B12            mov     edx, dword ptr [edx]
01263CD1    8902            mov     dword ptr [edx], eax
01263CD3    E9 BC000000     jmp     01263D94
01263CD8    33C0            xor     eax, eax
01263CDA    8A43 35         mov     al, byte ptr [ebx+35]               ; key=ebx+35时不保存IAT
01263CDD    3BF0            cmp     esi, eax
01263CDF    0F84 AF000000   je      01263D94                            ; *是否保存IAT地址
01263CE5    8B45 FC         mov     eax, dword ptr [ebp-4]
01263CE8    50              push    eax
01263CE9    8B45 10         mov     eax, dword ptr [ebp+10]
01263CEC    50              push    eax
01263CED    53              push    ebx
01263CEE    E8 9DFCFFFF     call    <GetApiAddress>
01263CF3    8B55 0C         mov     edx, dword ptr [ebp+C]
01263CF6    8B12            mov     edx, dword ptr [edx]
01263CF8    8902            mov     dword ptr [edx], eax                ; 保存IAT地址
01263CFA    E9 95000000     jmp     01263D94
01263CFF    33C0            xor     eax, eax
01263D01    8A43 38         mov     al, byte ptr [ebx+38]               ; 第三种加密方式:key=ebx+38,ebx+39
01263D04    3BF0            cmp     esi, eax                            ; 替换掉IAT中的2个地址
01263D06    75 41           jnz     short 01263D49
01263D08    EB 01           jmp     short 01263D0B
01263D0A    90              nop
01263D0B    B8 2C2E2601     mov     eax, 1262E2C                        ; key=ebx+38时把地址替换为1262E2C
01263D10    8B55 0C         mov     edx, dword ptr [ebp+C]
01263D13    8B12            mov     edx, dword ptr [edx]
01263D15    8902            mov     dword ptr [edx], eax
01263D17    B8 103F2601     mov     eax, 1263F10
01263D1C    BE 342E2601     mov     esi, 1262E34
01263D21    2BC6            sub     eax, esi
01263D23    50              push    eax
01263D24    56              push    esi
01263D25    E8 06D2FEFF     call    01250F30                            ; HASH(代码)
01263D2A    3B43 28         cmp     eax, dword ptr [ebx+28]             ; 校验HASH
01263D2D    74 65           je      short 01263D94                      ; *被修改时:更换XOR种子,改为jmp
01263D2F    6A FF           push    -1
01263D31    E8 6EF2FEFF     call    01252FA4
01263D36    8D53 08         lea     edx, dword ptr [ebx+8]
01263D39    8902            mov     dword ptr [edx], eax
01263D3B    6A 1E           push    1E
01263D3D    E8 62F2FEFF     call    01252FA4
01263D42    8B55 0C         mov     edx, dword ptr [ebp+C]
01263D45    0102            add     dword ptr [edx], eax
01263D47    EB 4B           jmp     short 01263D94
01263D49    33C0            xor     eax, eax
01263D4B    8A43 39         mov     al, byte ptr [ebx+39]
01263D4E    3BF0            cmp     esi, eax
01263D50    75 42           jnz     short 01263D94
01263D52    EB 01           jmp     short 01263D55
01263D54    90              nop
01263D55    B8 74752501     mov     eax, 1257574                        ; key=ebx+39时把地址替换为1257574
01263D5A    8B55 0C         mov     edx, dword ptr [ebp+C]
01263D5D    8B12            mov     edx, dword ptr [edx]
01263D5F    8902            mov     dword ptr [edx], eax
01263D61    B8 103F2601     mov     eax, 1263F10
01263D66    BE 342E2601     mov     esi, 1262E34
01263D6B    2BC6            sub     eax, esi
01263D6D    50              push    eax
01263D6E    56              push    esi
01263D6F    E8 BCD1FEFF     call    01250F30                            ; HASH(代码)
01263D74    3B43 28         cmp     eax, dword ptr [ebx+28]             ; 校验HASH
01263D77    74 1B           je      short 01263D94                      ; *被修改时:更换XOR种子,改为jmp
01263D79    6A FF           push    -1
01263D7B    E8 24F2FEFF     call    01252FA4
01263D80    8D53 08         lea     edx, dword ptr [ebx+8]
01263D83    8902            mov     dword ptr [edx], eax
01263D85    6A 32           push    32
01263D87    E8 18F2FEFF     call    01252FA4
01263D8C    8B55 0C         mov     edx, dword ptr [ebp+C]
01263D8F    0102            add     dword ptr [edx], eax
01263D91    EB 01           jmp     short 01263D94
01263D93    90              nop
01263D94    8B45 0C         mov     eax, dword ptr [ebp+C]
01263D97    8300 04         add     dword ptr [eax], 4
01263D9A    8D85 FAFEFFFF   lea     eax, dword ptr [ebp-106]
01263DA0    3BF8            cmp     edi, eax
01263DA2    74 07           je      short 01263DAB
01263DA4    8BC7            mov     eax, edi
01263DA6    E8 B1E7FDFF     call    0124255C
01263DAB    5F              pop     edi
01263DAC    5E              pop     esi
01263DAD    5B              pop     ebx
01263DAE    8BE5            mov     esp, ebp
01263DB0    5D              pop     ebp
01263DB1    C2 1000         retn    10

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 1270
活跃值: (109)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
认真学习中……
2009-1-14 11:27
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
3
好文学习中
2009-1-14 11:40
0
雪    币: 564
活跃值: (12)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
收藏之~~
感谢楼主分享~~!
2009-1-14 12:03
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
比前面的破文要难多了..
2009-1-14 17:35
0
雪    币: 471
活跃值: (3988)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
分析的很仔细,受教了
2009-1-15 12:42
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习ing。。。
2009-1-17 17:07
0
雪    币: 228
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
写的好!忒深刻!
2009-1-18 20:28
0
雪    币: 337
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
座下好好学习。。
2009-1-20 22:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
标记

好好学习一下。
2009-3-3 19:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
强壳,先顶一下再慢慢看
2009-3-4 09:29
0
游客
登录 | 注册 方可回帖
返回
//