ASPR低版本(甚至高版本)已被高手们分析烂了,我对壳还很陌生,在这里抱着的心态来研究研究ASPR,高手可以掠过。
OD加载入口处.壳的CALL算是ASPR的一大特色,通过CALL来压入下一条代码的位置,所以CALL基本上得按F7
进入,切记一定得小心,稍不留神就会跑飞.另外得注意一些变形代码
01001000 > 68 01400101 PUSH packnote.01014001
01001005 E8 01000000 CALL packnote.0100100B ; 压入下一条代码地
址,100100B处
0100100A C3 RETN ; 又返回到1014001处
0100100B C3 RETN ; 返回到CALL压入的地址
然后到这里解密一部分代码,ASPR是分块加密的
01014115 68 E2305540 PUSH 405530E2
0101411A 66:8BDF MOV BX,DI
0101411D 58 POP EAX ; mov eax,405530e2
0101411E FF31 PUSH DWORD PTR DS:[ECX] ; 解密了一点数据
01014120 81C3 19D5467D ADD EBX,7D46D519
01014126 5F POP EDI ; mov edi,dowd ptr
[ecx]
01014127 81F0 EA65334B XOR EAX,4B3365EA
0101412D 81EF B1BD3122 SUB EDI,2231BDB1
01014133 E8 06000000 CALL packnote.0101413E
01014138 B6 B7 MOV DH,0B7
0101413A 24 8D AND AL,8D
0101413C 42 INC EDX
0101413D 53 PUSH EBX
0101413E B7 52 MOV BH,52 ; CALL 到这里开始循环
01014140 5A POP EDX
01014141 81F7 96E2DF5E XOR EDI,5EDFE296
01014147 80C6 FD ADD DH,0FD
0101414A 81F7 175E6172 XOR EDI,72615E17
01014150 0FB7DA MOVZX EBX,DX
01014153 8939 MOV DWORD PTR DS:[ECX],EDI
01014155 66:81DB 9755 SBB BX,5597
0101415A 83E9 03 SUB ECX,3
0101415D 8BD0 MOV EDX,EAX
0101415F 49 DEC ECX ; 总共减了4个字节
01014160 B0 B7 MOV AL,0B7
01014162 4E DEC ESI
01014163 ^ 0F85 B5FFFFFF JNZ packnote.0101411E
01014169 57 PUSH EDI ; 厄..循环结束后后面的
代码解密完毕
0101416A 66:B8 2310 MOV AX,1023
0101416E 5B POP EBX ; mov ebx,edi
这里的代码就是刚刚被上面解密的代码
01014186 /0F82 04000000 JB packnote.01014190 ; 上面CALL到这里
0101418C |53 PUSH EBX
0101418D |B7 2D MOV BH,2D
0101418F |59 POP ECX ; mov ecx,ebx
01014190 \5F POP EDI ; edi = 返回地址
01014191 0F89 02000000 JNS packnote.01014199
01014197 B3 A1 MOV BL,0A1
01014199 81C7 88070000 ADD EDI,788 ; 厄...已加密代码尾部地
址,从尾步解密
0101419F E8 0B000000 CALL packnote.010141AF ; 跳
....几行乱码
010141C1 59 POP ECX ; ecx = 上个CALL的返回
地址
010141C2 B8 A4010000 MOV EAX,1A4
010141C7 0F8D 03000000 JGE packnote.010141D0
010141CD 66:8BD7 MOV DX,DI
010141D0 8B37 MOV ESI,DWORD PTR DS:[EDI] ; edi,已加密代码的地址
010141D2 68 AF29B26A PUSH 6AB229AF
010141D7 50 PUSH EAX ; eax为剩下未加密代码的
长度
010141D8 E8 06000000 CALL packnote.010141E3
010141DD 66:A7 CMPS WORD PTR DS:[ESI],WORD PTR ES:[EDI]
010141DF 54 PUSH ESP
010141E0 FD STD
010141E1 F2: PREFIX REPNE: ; 多余的前缀
010141E2 43 INC EBX
010141E3 59 POP ECX ; ecx = 返回地址
010141E4 5B POP EBX ; mov ebx,eax
010141E5 59 POP ECX ; mov ecx,6ab229af
010141E6 81EE A5860773 SUB ESI,730786A5 ; esi 已加密代码数据
010141EC 8AEE MOV CH,DH
010141EE 81EE 7ACAD84D SUB ESI,4DD8CA7A ; esi 已加密代码数据
010141F4 8BD0 MOV EDX,EAX
010141F6 81C6 2B925B47 ADD ESI,475B922B ; 厄...对ESI的操作都是
在解密
010141FC E8 13000000 CALL packnote.01014214 ; 跳
01014214 B6 00 MOV DH,0
01014216 59 POP ECX ; ecx = 返回地址
01014217 56 PUSH ESI
01014218 66:BB 4EA8 MOV BX,0A84E
0101421C 8F07 POP DWORD PTR DS:[EDI] ; [edi] = esi
0101421E E8 0A000000 CALL packnote.0101422D
01014223 5A POP EDX
01014224 8B68 81 MOV EBP,DWORD PTR DS:[EAX-7F]
01014227 26:67:14 BD ADC AL,0BD ; 多余的前缀
0101422B B2 03 MOV DL,3
0101422D 66:81D3 7523 ADC BX,2375 ; call
01014232 5A POP EDX ; ebx = 返回地址
01014233 83EF 04 SUB EDI,4
01014236 68 2D4C0977 PUSH 77094C2D
0101423B 81DA 4F7FB940 SBB EDX,40B97F4F
01014241 5A POP EDX ; mov edx,77094c2d
01014242 81E8 01000000 SUB EAX,1
01014248 0F85 12000000 JNZ packnote.01014260 ; eax没减完就跳
0101424E 81E3 9D9A820E AND EBX,0E829A9D
01014254 E9 1B000000 JMP packnote.01014274
01014259 ^ E3 E0 JECXZ SHORT packnote.0101423B
0101425B 99 CDQ
0101425C 5E POP ESI
0101425D 3F AAS
0101425E 0C 55 OR AL,55
01014260 66:B9 D1CC MOV CX,0CCD1
01014264 ^ E9 67FFFFFF JMP packnote.010141D0 ; 没解密完,往上跳,厄.这
是个变形循环
01014274 66:BA 3E2F MOV DX,2F3E ; jmp到了这里,此时这里
的代码刚刚解密
01014278 E8 14000000 CALL packnote.01014291 ; 跳
0101427D EC IN AL,DX ; 中间...别看了
0101427E B5 4A MOV CH,4A
01014280 BB D8311697 MOV EBX,971631D8
01014285 846D A2 TEST BYTE PTR SS:[EBP-5E],CH
01014288 33F0 XOR ESI,EAX
0101428A 69EE 8F1C25FA IMUL EBP,ESI,FA251C8F
01014290 AB STOS DWORD PTR ES:[EDI]
01014291 66:BF B4D5 MOV DI,0D5B4 ; call到了这里
01014295 5E POP ESI ; esi = 返回地址
01014296 80F2 D9 XOR DL,0D9
01014299 81C6 83060000 ADD ESI,683 ; esi = 加密代码数据尾
部地址
0101429F 0FB7FB MOVZX EDI,BX
010142A2 B9 1154B56C MOV ECX,6CB55411
010142A7 81C1 67AD4A93 ADD ECX,934AAD67
010142AD E8 12000000 CALL packnote.010142C4 ; 又跳
...
010142C4 8AF0 MOV DH,AL ; 跳到这里
010142C6 58 POP EAX ; eax = 返回地址
010142C7 FF36 PUSH DWORD PTR DS:[ESI] ; 压入加密数据
010142C9 51 PUSH ECX ; 剩下未解密的代码
010142CA E9 0E000000 JMP packnote.010142DD
010142CF AE SCAS BYTE PTR ES:[EDI]
010142D0 4F DEC EDI
010142D1 DCE5 FSUBR ST(5),ST
010142D3 BA 6BC86186 MOV EDX,8661C86B
010142D8 47 INC EDI
010142D9 ^ 74 9D JE SHORT packnote.01014278
010142DB 12E3 ADC AH,BL
010142DD 58 POP EAX ; mov eax,ecx
010142DE 5B POP EBX ; mov pop,dword ptr
[edi]
010142DF 0FBFFE MOVSX EDI,SI
010142E2 81C3 CB167F53 ADD EBX,537F16CB ; 对EBX的操作就是再解密
代码
010142E8 0F80 02000000 JO packnote.010142F0
010142EE 8BC3 MOV EAX,EBX
010142F0 81C3 A8BE1072 ADD EBX,7210BEA8
010142F6 81EB C18D2849 SUB EBX,49288DC1
010142FC 80E8 1A SUB AL,1A
010142FF 53 PUSH EBX
01014300 8BD1 MOV EDX,ECX
01014302 8F06 POP DWORD PTR DS:[ESI] ; 将解密代码数据写入
01014304 81EE 6C74F049 SUB ESI,49F0746C
0101430A 81C6 6874F049 ADD ESI,49F07468 ; 厄....sub esi,4
01014310 51 PUSH ECX
01014311 BA 6E39F47D MOV EDX,7DF4396E
01014316 58 POP EAX ; mov eax,ecx
01014317 83E9 01 SUB ECX,1
0101431A ^ 0F85 A7FFFFFF JNZ packnote.010142C7 ; 没减完就给我跳,厄..一
个循环
01014320 66:BF 3497 MOV DI,9734
01014324 36:C2 9883 RETN 8398 ; 这句不是真正代码,解密
完后会显示
...解密后的代码
01014320 66:BF 3497 MOV DI,9734
01014324 E8 09000000 CALL packnote.01014332 ; 跳到下面...存在花指令
.
01014332 5B POP EBX ; ebx = 返回地址
01014333 E9 12000000 JMP packnote.0101434A ; 跳.很烦的花指令,得走
过去才能看见真正代码
...
0101434A 81C3 D5050000 ADD EBX,5D5 ; ebx = 加密代码数据尾
部
01014350 68 7EECEF2C PUSH 2CEFEC7E
01014355 8AE3 MOV AH,BL
01014357 5F POP EDI
01014358 BA 00000000 MOV EDX,0
0101435D 81E0 304FD739 AND EAX,39D74F30
01014363 FF341A PUSH DWORD PTR DS:[EDX+EBX]
01014366 59 POP ECX
01014367 66:B8 C71E MOV AX,1EC7
0101436B 81F1 6EA6B540 XOR ECX,40B5A66E
01014371 E9 07000000 JMP packnote.0101437D ;又跳.
...这里的花指令让分析出来的代码太乱了,就不贴了
最后到这里.
010146F0 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24] ; kernel32.7C816FD7
010146F4 25 0000FFFF AND EAX,FFFF0000 ; 擦掉低端
010146F9 05 00000100 ADD EAX,10000
010146FE 2D 00000100 SUB EAX,10000 ; 查找kernel32.dll的文
件头
01014703 66:8138 4D5A CMP WORD PTR DS:[EAX],5A4D
01014708 ^ 75 F4 JNZ SHORT packnote.010146FE
0101470A 60 PUSHAD
0101470B 8985 F8030000 MOV DWORD PTR SS:[EBP+3F8],EAX
01014711 8BD0 MOV EDX,EAX
01014713 8BD8 MOV EBX,EAX
01014715 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C] ; [eax+3c] =
kernel32.dll文件头
01014718 0358 78 ADD EBX,DWORD PTR DS:[EAX+78]
0101471B 899D 0D030000 MOV DWORD PTR SS:[EBP+30D],EBX
01014721 8D9D CC030000 LEA EBX,DWORD PTR SS:[EBP+3CC]
01014727 8DBD E4030000 LEA EDI,DWORD PTR SS:[EBP+3E4]
0101472D 8B33 MOV ESI,DWORD PTR DS:[EBX]
0101472F 89B5 7C030000 MOV DWORD PTR SS:[EBP+37C],ESI
01014735 E8 0B000000 CALL packnote.01014745 ; 处理IAT?这是对DLL中的
函数做处理,而这里的循环又是针对DLL做处理,哎,壳就是不太清晰,不好分析
这里的循环貌似是对DLL中的函数做处理,加密还是解密就不清楚了..对PE的加载看了很久了还不熟悉(太
多太难记了)
01014745 60 PUSHAD ; CALL到这里
01014746 8B9D 0D030000 MOV EBX,DWORD PTR SS:[EBP+30D]
0101474C 8B4B 20 MOV ECX,DWORD PTR DS:[EBX+20]
0101474F 03CA ADD ECX,EDX
01014751 8B31 MOV ESI,DWORD PTR DS:[ECX]
01014753 03F2 ADD ESI,EDX
01014755 E8 2F000000 CALL packnote.01014789
0101475A BF A75125B7 MOV EDI,B72551A7
0101475F 3BC7 CMP EAX,EDI
01014761 74 05 JE SHORT packnote.01014768
01014763 83C1 04 ADD ECX,4
01014766 ^ EB E9 JMP SHORT packnote.01014751
之后的CALL就不用进入了,因为已经解密完成,是在对输入表或其他数据做处理了..
后面的什么处理IAT,补区段什么的,因为我也不会,学习中,还望高人指点了.
看雪是我家,学习靠大家
[培训]科锐逆向工程师培训第53期2025年7月8日开班!