首页
社区
课程
招聘
[原创]ASProtect 1.35不完全分析
发表于: 2006-12-15 22:07 4631

[原创]ASProtect 1.35不完全分析

2006-12-15 22:07
4631
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日开班!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1946
活跃值: (313)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
2
沙发。后面的研究透了就发这里了
2006-12-15 22:25
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
不知所云
2006-12-15 22:28
0
雪    币: 1946
活跃值: (313)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
4
本来就没写什么,还是喜欢直接写注释方便
2006-12-15 22:30
0
游客
登录 | 注册 方可回帖
返回