首页
社区
课程
招聘
[原创]ASPR学习笔记下篇:还原跳转表
发表于: 2009-1-13 18:16 9312

[原创]ASPR学习笔记下篇:还原跳转表

2009-1-13 18:16
9312

这一个星期都在弄这个ASPR壳,弄的头晕眼花的。。。
还是上次的目标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]

请关注上一节:ASPR学习笔记上篇:修复IAT  http://bbs.pediy.com/showthread.php?t=80422

在上一节修复完IAT后可以看出OEP=289BE0,RVA=29CB98,SIZE=9B8
修复IAT还不能算完成,因为ASPR把程序中的跳转表JMP [IAT table]替换成了CALL 01410000这类壳中调用了,还需要把CALL还原成JMP。
先看看壳是怎么把JMP替换成CALL的?
替换CALL XXXXXXXX时同样也会修改程序代码数据,到达OEP在程序开始部分的跳转表中随便找个CALL 01410000,比如:
00401288 call    01410000
在地址部分下硬件断点hw 00401289,重新载入程序后运行,经过几次初始化中断之后就来到了替换CALL的循环。
这一段是生成基本数据并修正所有CALL地址:

01262440    55              push    ebp
01262441    8BEC            mov     ebp, esp
01262443    53              push    ebx
01262444    8B5D 08         mov     ebx, dword ptr [ebp+8]
01262447    EB 01           jmp     short 0126244A
0126244A    85DB            test    ebx, ebx
0126244C    74 2A           je      short 01262478
0126244E    8BC3            mov     eax, ebx
01262450    E8 4FE5FFFF     call    012609A4                                 ; 生成基本数据
01262455    84C0            test    al, al
01262457    75 0A           jnz     short 01262463                           ; 生成出错?
01262459    68 88242601     push    1262488                                  ; ASCII "107",CR,LF
0126245E    E8 812DFFFF     call    012551E4                                 ; 错误提示并退出
01262463    8BC3            mov     eax, ebx
01262465    E8 36000000     call    012624A0                                 ; 修正所有跳转表地址
0126246A    84C0            test    al, al
0126246C    75 0A           jnz     short 01262478                           ; 修正出错?
0126246E    68 98242601     push    1262498                                  ; ASCII "108",CR,LF
01262473    E8 6C2DFFFF     call    012551E4                                 ; 错误提示并退出
01262478    5B              pop     ebx
01262479    5D              pop     ebp
0126247A    C2 0400         retn    4
012609A4    53              push    ebx
012609A5    56              push    esi
012609A6    57              push    edi
012609A7    55              push    ebp
012609A8    83C4 F8         add     esp, -8
012609AB    8BF8            mov     edi, eax
012609AD    C60424 00       mov     byte ptr [esp], 0
012609B1    837F 08 00      cmp     dword ptr [edi+8], 0
012609B5    0F84 DF010000   je      01260B9A
012609BB    8D47 5C         lea     eax, dword ptr [edi+5C]
012609BE    BA 0A000000     mov     edx, 0A
012609C3    E8 FC27FFFF     call    012531C4                                 ; 初始化随机序列数据
012609C8    8D47 5C         lea     eax, dword ptr [edi+5C]
012609CB    BA 0A000000     mov     edx, 0A
012609D0    E8 A327FFFF     call    01253178                                 ; 生成随机序列保存到[edi+5C]
012609D5    33ED            xor     ebp, ebp
012609D7    8A442F 5C       mov     al, byte ptr [edi+ebp+5C]
012609DB    8D57 40         lea     edx, dword ptr [edi+40]
012609DE    03D5            add     edx, ebp
012609E0    8802            mov     byte ptr [edx], al
012609E2    45              inc     ebp
012609E3    83FD 0A         cmp     ebp, 0A
012609E6  ^ 75 EF           jnz     short 012609D7                           ; copy随机序列到[edi+40]
012609E8    8B77 08         mov     esi, dword ptr [edi+8]
012609EB    BD 0A000000     mov     ebp, 0A
012609F0    8A1E            mov     bl, byte ptr [esi]                       ; 取index
012609F2    46              inc     esi
012609F3    80FB 09         cmp     bl, 9
012609F6    0F87 9E010000   ja      01260B9A
012609FC    8BD3            mov     edx, ebx
012609FE    8BC7            mov     eax, edi
01260A00    E8 77FFFFFF     call    0126097C                                 ; 取index所在的随机值
01260A05    8BD8            mov     ebx, eax
01260A07    80FB FF         cmp     bl, 0FF                                  ; 随机序列是否正确?
01260A0A    75 0A           jnz     short 01260A16
01260A0C    68 AC0B2601     push    1260BAC                                  ; ASCII "107",CR,LF
01260A11    E8 CE47FFFF     call    012551E4
01260A16    8B06            mov     eax, dword ptr [esi]
01260A18    83C6 04         add     esi, 4
01260A1B    33D2            xor     edx, edx
01260A1D    8AD3            mov     dl, bl
01260A1F    8D1452          lea     edx, dword ptr [edx+edx*2]
01260A22    894497 6C       mov     dword ptr [edi+edx*4+6C], eax
01260A26    3D 00200000     cmp     eax, 2000
01260A2B    0F87 69010000   ja      01260B9A
01260A31    8B16            mov     edx, dword ptr [esi]
01260A33    895424 04       mov     dword ptr [esp+4], edx
01260A37    83C6 04         add     esi, 4
01260A3A    33D2            xor     edx, edx
01260A3C    8AD3            mov     dl, bl
01260A3E    8D1452          lea     edx, dword ptr [edx+edx*2]
01260A41    8B4C24 04       mov     ecx, dword ptr [esp+4]
01260A45    894C97 70       mov     dword ptr [edi+edx*4+70], ecx
01260A49    33D2            xor     edx, edx
01260A4B    8AD3            mov     dl, bl
01260A4D    8D1452          lea     edx, dword ptr [edx+edx*2]
01260A50    897497 68       mov     dword ptr [edi+edx*4+68], esi
01260A54    03F0            add     esi, eax
01260A56    4D              dec     ebp
01260A57  ^ 75 97           jnz     short 012609F0                           ; 循环生成函数随机入口
01260A59    8D47 4A         lea     eax, dword ptr [edi+4A]
01260A5C    B9 09000000     mov     ecx, 9
01260A61    8BD6            mov     edx, esi
01260A63    E8 2C4FFEFF     call    <CopyStringByByte>                       ; 复制9字节到[edi+4A]
01260A68    83C6 09         add     esi, 9
01260A6B    8A06            mov     al, byte ptr [esi]
01260A6D    8847 20         mov     byte ptr [edi+20], al                    ; 标志位
01260A70    46              inc     esi
01260A71    8B06            mov     eax, dword ptr [esi]
01260A73    8987 E4000000   mov     dword ptr [edi+E4], eax                  ; 数据组的长度
01260A79    83C6 04         add     esi, 4
01260A7C    8B06            mov     eax, dword ptr [esi]
01260A7E    8987 E0000000   mov     dword ptr [edi+E0], eax                  ; 待修正代码的偏移
01260A84    83C6 04         add     esi, 4
01260A87    BA 54652601     mov     edx, 1266554
01260A8C    8902            mov     dword ptr [edx], eax
01260A8E    8B06            mov     eax, dword ptr [esi]
01260A90    8947 18         mov     dword ptr [edi+18], eax                  ; 待修正代码的数据组的数量
01260A93    83C6 04         add     esi, 4
01260A96    837F 2C 00      cmp     dword ptr [edi+2C], 0                    ; 生成4个新段并把入口放入[edi+2C]开始的位置中
01260A9A    74 0D           je      short 01260AA9                           ; 段1是否已经生成?
01260A9C    8D47 2C         lea     eax, dword ptr [edi+2C]
01260A9F    E8 0C99FFFF     call    0125A3B0
01260AA4    33C0            xor     eax, eax
01260AA6    8947 2C         mov     dword ptr [edi+2C], eax
01260AA9    8BC7            mov     eax, edi
01260AAB    E8 74F6FFFF     call    01260124                                 ; 生成段1并生成代码数据
01260AB0    8947 2C         mov     dword ptr [edi+2C], eax                  ; 保存段1入口地址
01260AB3    837F 30 00      cmp     dword ptr [edi+30], 0
01260AB7    74 0D           je      short 01260AC6                           ; 段2是否已经生成?
01260AB9    8D47 30         lea     eax, dword ptr [edi+30]
01260ABC    E8 EF98FFFF     call    0125A3B0
01260AC1    33C0            xor     eax, eax
01260AC3    8947 30         mov     dword ptr [edi+30], eax
01260AC6    8BC7            mov     eax, edi
01260AC8    E8 87F9FFFF     call    01260454                                 ; 生成段2并生成代码数据
01260ACD    8947 30         mov     dword ptr [edi+30], eax                  ; 保存段2入口地址
01260AD0    837F 34 00      cmp     dword ptr [edi+34], 0
01260AD4    74 0D           je      short 01260AE3                           ; 段3是否已经生成?
01260AD6    8D47 34         lea     eax, dword ptr [edi+34]
01260AD9    E8 D298FFFF     call    0125A3B0
01260ADE    33C0            xor     eax, eax
01260AE0    8947 34         mov     dword ptr [edi+34], eax
01260AE3    8BC7            mov     eax, edi
01260AE5    E8 4AFBFFFF     call    01260634                                 ; 生成段3并生成代码数据
01260AEA    8947 34         mov     dword ptr [edi+34], eax                  ; 保存段3入口地址
01260AED    837F 38 00      cmp     dword ptr [edi+38], 0
01260AF1    74 0D           je      short 01260B00                           ; 段4是否已经生成?
01260AF3    8D47 38         lea     eax, dword ptr [edi+38]
01260AF6    E8 B598FFFF     call    0125A3B0
01260AFB    33C0            xor     eax, eax
01260AFD    8947 38         mov     dword ptr [edi+38], eax
01260B00    8BC7            mov     eax, edi
01260B02    E8 D1FCFFFF     call    012607D8                                 ; 生成段4并生成代码数据
01260B07    8947 38         mov     dword ptr [edi+38], eax                  ; 保存段4入口地址
01260B0A    8977 54         mov     dword ptr [edi+54], esi                  ; 修正跳转表所用的数据组基址
01260B0D    8B47 18         mov     eax, dword ptr [edi+18]
01260B10    F7AF E4000000   imul    dword ptr [edi+E4]                       ; 数据组数量*数据组长度
01260B16    03F0            add     esi, eax
01260B18    8B06            mov     eax, dword ptr [esi]
01260B1A    8947 1C         mov     dword ptr [edi+1C], eax                  ; 0
01260B1D    83C6 04         add     esi, 4
01260B20    8977 58         mov     dword ptr [edi+58], esi                  ; 数据组的结束地址
01260B23    8B87 E0000000   mov     eax, dword ptr [edi+E0]
01260B29    50              push    eax
01260B2A    68 00030000     push    300
01260B2F    8B47 2C         mov     eax, dword ptr [edi+2C]
01260B32    50              push    eax
01260B33    57              push    edi
01260B34    E8 DF010000     call    01260D18                                 ; hash(段1,300)
01260B39    8BD8            mov     ebx, eax
01260B3B    899F F0000000   mov     dword ptr [edi+F0], ebx                  ; save hash
01260B41    53              push    ebx
01260B42    68 00030000     push    300
01260B47    8B47 30         mov     eax, dword ptr [edi+30]
01260B4A    50              push    eax
01260B4B    57              push    edi
01260B4C    E8 C7010000     call    01260D18                                 ; hash(段2,300)
01260B51    8BF0            mov     esi, eax
01260B53    89B7 F4000000   mov     dword ptr [edi+F4], esi                  ; save hash
01260B59    56              push    esi
01260B5A    68 00030000     push    300
01260B5F    8B47 34         mov     eax, dword ptr [edi+34]
01260B62    50              push    eax
01260B63    57              push    edi
01260B64    E8 AF010000     call    01260D18                                 ; hash(段3,300)
01260B69    8BD8            mov     ebx, eax
01260B6B    899F F8000000   mov     dword ptr [edi+F8], ebx                  ; save hash
01260B71    53              push    ebx
01260B72    68 00030000     push    300
01260B77    8B47 38         mov     eax, dword ptr [edi+38]
01260B7A    50              push    eax
01260B7B    57              push    edi
01260B7C    E8 97010000     call    01260D18                                 ; hash(段4,300)
01260B81    8BF0            mov     esi, eax
01260B83    89B7 FC000000   mov     dword ptr [edi+FC], esi                  ; save hash
01260B89    56              push    esi
01260B8A    57              push    edi
01260B8B    E8 3C1B0000     call    012626CC                                 ; hash(数据组)
01260B90    8987 04010000   mov     dword ptr [edi+104], eax                 ; save hash
01260B96    C60424 01       mov     byte ptr [esp], 1
01260B9A    8A0424          mov     al, byte ptr [esp]
01260B9D    59              pop     ecx
01260B9E    5A              pop     edx
01260B9F    5D              pop     ebp
01260BA0    5F              pop     edi
01260BA1    5E              pop     esi
01260BA2    5B              pop     ebx
01260BA3    C3              retn
012624A0    53              push    ebx
012624A1    56              push    esi
012624A2    57              push    edi
012624A3    55              push    ebp
012624A4    83C4 DC         add     esp, -24
012624A7    8BD8            mov     ebx, eax
012624A9    33C0            xor     eax, eax
012624AB    8B53 54         mov     edx, dword ptr [ebx+54]
012624AE    85D2            test    edx, edx
012624B0    0F84 0D020000   je      012626C3
012624B6    83BB E4000000 0>cmp     dword ptr [ebx+E4], 0
012624BD    0F84 00020000   je      012626C3
012624C3    837B 18 00      cmp     dword ptr [ebx+18], 0
012624C7    0F84 F6010000   je      012626C3
012624CD    837B 24 00      cmp     dword ptr [ebx+24], 0
012624D1    0F84 EC010000   je      012626C3
012624D7    837B 2C 00      cmp     dword ptr [ebx+2C], 0
012624DB    0F84 E2010000   je      012626C3
012624E1    837B 30 00      cmp     dword ptr [ebx+30], 0
012624E5    0F84 D8010000   je      012626C3
012624EB    8BF2            mov     esi, edx
012624ED    8B43 18         mov     eax, dword ptr [ebx+18]
012624F0    890424          mov     dword ptr [esp], eax
012624F3    8B83 E0000000   mov     eax, dword ptr [ebx+E0]
012624F9    894424 14       mov     dword ptr [esp+14], eax
012624FD    8D7B 40         lea     edi, dword ptr [ebx+40]
01262500    833C24 00       cmp     dword ptr [esp], 0
01262504    0F86 AB010000   jbe     012626B5
0126250A    33C0            xor     eax, eax
0126250C    8A07            mov     al, byte ptr [edi]                       ; 取函数入口index0
0126250E    8D0440          lea     eax, dword ptr [eax+eax*2]
01262511    8B6C83 68       mov     ebp, dword ptr [ebx+eax*4+68]            ; 函数入口:[ebx+index0*3*4+68]
01262515    8BC6            mov     eax, esi
01262517    FFD5            call    ebp                                      ; 函数功能:mov eax,[eax+4]
01262519    8BE8            mov     ebp, eax                                 ; 取出的值为待修正地址的偏移
0126251B    036B 24         add     ebp, dword ptr [ebx+24]                  ; +基址
0126251E    03AB E0000000   add     ebp, dword ptr [ebx+E0]                  ; +段偏移
01262524    EB 01           jmp     short 01262527                           ; 结果为待修正的地址入口
01262526    90              nop
01262527    33C0            xor     eax, eax
01262529    8A47 09         mov     al, byte ptr [edi+9]                     ; 取函数入口index9
0126252C    8D0440          lea     eax, dword ptr [eax+eax*2]
0126252F    8B5483 68       mov     edx, dword ptr [ebx+eax*4+68]            ; 函数入口:[ebx+index9*3*4+68]
01262533    8BC6            mov     eax, esi
01262535    FFD2            call    edx                                      ; 函数功能:mov eax,byte ptr [eax+1A]
01262537    807B 20 00      cmp     byte ptr [ebx+20], 0                     ; 取出的值为待修正地址的标志位
0126253B    0F85 3D010000   jnz     0126267E                                 ; 总标志位:是否进行修正?
01262541    3C 01           cmp     al, 1
01262543    0F85 35010000   jnz     0126267E                                 ; 数据组标志位:是否进行修正?
0126267E    8B43 2C         mov     eax, dword ptr [ebx+2C]                  ; 取call XXXXXXXX的地址值=01410000
01262681    2BC5            sub     eax, ebp                                 ; WorkingT.00401268
01262683    83E8 05         sub     eax, 5                                   ; 计算相对偏移
01262686    45              inc     ebp
01262687    8945 00         mov     dword ptr [ebp], eax                     ; !!!!!!!!!!!将jmp XXXXXXXX改为call 01410000写到程序中
0126268A    6A 0A           push    0A
0126268C    E8 1309FFFF     call    01252FA4                                 ; rnd 计算出一个随机值
01262691    8BC8            mov     ecx, eax
01262693    038B E4000000   add     ecx, dword ptr [ebx+E4]                  ; 复制的长度:随机多复制几个字节
01262699    8BD6            mov     edx, esi
0126269B    8BC3            mov     eax, ebx
0126269D    E8 BAE6FFFF     call    01260D5C                                 ; copy一段代码到一个段中
012626A2    FF0C24          dec     dword ptr [esp]                          ; 循环次数-1
012626A5    03B3 E4000000   add     esi, dword ptr [ebx+E4]                  ; +数据组长度:取下一个数据组
012626AB    833C24 00       cmp     dword ptr [esp], 0
012626AF  ^ 0F87 55FEFFFF   ja      0126250A                                 ; 继续循环
012626B5    53              push    ebx
012626B6    E8 5D000000     call    01262718                                 ; 校验hash:是否修改代码?
012626BB    0183 EC000000   add     dword ptr [ebx+EC], eax                  ; 校验的段:
012626C1    B0 01           mov     al, 1                                    ; 段1
012626C3    83C4 24         add     esp, 24                                  ; 段2
012626C6    5D              pop     ebp                                      ; 段3
012626C7    5F              pop     edi                                      ; 段4
012626C8    5E              pop     esi                                      ; 数据组
012626C9    5B              pop     ebx                                      ; 2E34-3F10的代码
012626CA    C3              retn
+0:  dword    not used
+4:  dword    not used
+8:  dword    基本数据组初始化时所用的随机函数地址所需的数据
+C:  dword    not used
+10: dword    计算代码段HASH时使用的代码起止位置数据表
+14: dword    程序基址
+18: dword    待修正跳转表地址数量
+1C: dword    not used
+20: dword    是否修正跳转表的总标志位
+24: dword    程序代码段起始地址
+28: dword    待修正跳转表地址的范围
+2C: dword    跳转表调用的地址,代码区段1
+30: dword    代码区段2
+34: dword    代码区段3
+38: dword    代码区段4
+3C: dword    IAT数据组基址
+40: byte*0A  函数序列的随机地址index,从+5C复制过来
+4A: byte*0A  not used--copy from [+8]
+54: dword    修正跳转表所用的数据组的基址
+58: dword    修正跳转表所用的数据组的结束地址
+5C: byte*0A  函数序列的随机地址index
+66: byte*2   not used
+68: dword    
{
  +0:  dword  函数序列index指向的函数地址
  +4:  dword  标志位? not used, copy from [+8]
  +8:  dword  hash? not used, copy from [+8]
}*8
+E0: dword    对地址加密的offset
+E4: dword    待修正跳转表所用的数据组的每组数据长度
+E8: dword    
+EC: dword    修正完毕后的计数
+F0: dword    代码区段1的HASH值
+F4: dword    代码区段2的HASH值
+F8: dword    代码区段3的HASH值
+FC: dword    代码区段4的HASH值
+100:dword    not used
+104:dword    修正跳转表所用数据组的HASH值

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

收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这么好的帖子怎么没人顶!!!
我来顶!!!
2009-1-14 00:35
0
雪    币: 47147
活跃值: (20380)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
lelfei基础扎实,这样研究下去,实力不可小窥
2009-1-14 09:37
0
雪    币: 136
活跃值: (105)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
hehe很强大的 leifei 学习很久没看到这么号的文章了
2009-1-14 10:15
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
5
呵呵,感谢kanxue老大的赞扬~感谢各位兄弟捧场~
2009-1-14 11:47
0
雪    币: 564
活跃值: (12)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
上篇收藏好了,来收藏下篇了。

支持下先,再收藏!
2009-1-14 12:07
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
我还以为aspr接管了switch产生的那个跳转表呢。。
被标题忽悠了
2009-1-14 18:04
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
认真学习。。。。。。
2009-1-15 15:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
标记

好好学习。
2009-3-3 19:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
强壳,先顶一下再慢慢看
2009-3-4 09:29
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
长征第一步
2009-3-17 01:00
0
雪    币: 187
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看雪老大看中的人不会差了的,收藏之后赞一个。你就是我偶像。
2009-3-17 12:00
0
雪    币: 274
活跃值: (358)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
现在水平太低,完全看不懂啊!!

加油努力,争取早日看懂.
2009-10-15 17:56
0
游客
登录 | 注册 方可回帖
返回
//