这一个星期都在弄这个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值
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)