首页
社区
课程
招聘
ASProtect 2.1x SKE之QQ群发软件2006综合最强版 脱壳分析
发表于: 2006-4-23 19:01 6159

ASProtect 2.1x SKE之QQ群发软件2006综合最强版 脱壳分析

2006-4-23 19:01
6159
【破文标题】ASProtect 2.1x SKE之QQ群发软件2006综合最强版 脱壳分析
【破解工具】OD,PEID0.94,ImportREC1.6F
【破解平台】WinXP
【软件名称】QQ群发软件2006综合最强版
【软件大小】641k
【保护方式】ASProtect 2.1x SKE -> Alexey Solodovnikov
【破解声明】 我是一只小菜鸟,第一次学习脱壳,脱完壳还是不能运行,望各位多多指点!

第一步:PEID0.94 检测,加壳方式为:ASProtect 2.1x SKE -> Alexey Solodovnikov
第二步:寻找OEP,采用的是最后一次异常法,找到OEP
过程如下:
OD载入,因为我一开始就不忽略所有的异常,所以一载入就提示有异常,我们shit+F9,点“否”,停在入口了。
00401000 >  68 01A05600     PUSH QQ群发软.0056A001   //停在这里
00401005    E8 01000000     CALL QQ群发软.0040100B
0040100A    C3              RETN
0040100B    C3              RETN
0040100C    49              DEC ECX

下面就开始使用最后一次异常法了。。。
我们一直狂按shit+F9,按了35次,到最后一次异常!
00EFFAA5    C700 EFCA5C85   MOV DWORD PTR DS:[EAX],855CCAEF
00EFFAAB    67:64:8F06 0000 POP DWORD PTR FS:[0]
00EFFAB1    83C4 04         ADD ESP,4
00EFFAB4    83E8 AF         SUB EAX,-51
00EFFAB7    83C8 4B         OR EAX,4B
按Alt+M,在00401000 CODE段下F2断点,Shift+F9运行:
00407170    E8 8B8ED200     CALL 01130000  //这就是OEP处
00407175    E4 8B           IN AL,8B                                 ; I/O 命令
00407177    C0FF 25         SAR BH,25                                ; 移位常量超出 1..31 的

好的,按Ctrl+B,搜索一下FF 25,会找到:
004012B4  - FF25 1C325100       JMP DWORD PTR DS:[51321C]                ; kernel32.CreateFileA
004012BA    8BC0                MOV EAX,EAX
004012BC    E8 3FEDD200         CALL 01130000     
004012C1    5B                  POP EBX

在命令行下 dd  51321C,在数据区可看到:
0051321C  7C801A24  kernel32.CreateFileA
00513220  7C809B77  kernel32.CloseHandle
00513224  00000000
00513228  77D311B3  user32.GetKeyboardType
0051322C  77D20FE8  user32.LoadStringA
00513230  5E758D5A
00513234  77D20F90  user32.CharNextA
00513238  00000000                                  //可知IAT没有加密
0051323C  A5419701
00513240  5806B233
00513244  F1A010CD
00513248  00000000
0051324C  770F4850  oleaut32.SysFreeString
00513250  7711C99D  oleaut32.SysReAllocStringLen
00513254  770F4B59  oleaut32.SysAllocStringLen
00513258  00000000
0051325C  7C809BF5  kernel32.TlsSetValue
00513260  7C809750  kernel32.TlsGetValue
00513264  7C8099BD  kernel32.LocalAlloc

然后到OEP处,用OD插件脱壳,再用Imp修复,填上OEP=7170,点IAT自动搜索,获得输入信息,全部为有效指针,修复抓取文件。
运行脱壳文件,发现它不能正常运行,晕!

OD载入,运行脱壳修复后的文件,停在此处,不知道该如何修改!才能使文件运行!
00407170 > $  E8 8B8ED200   CALL 01130000
00407175      E4            DB E4
00407176      8BC0          MOV EAX,EAX
00407178   $- FF25 64325100 JMP DWORD PTR DS:[513264]                ;  kernel32.LocalAlloc
0040717E      8BC0          MOV EAX,EAX
00407180   $- FF25 14905900 JMP DWORD PTR DS:[<&kernel32.#846>]      ;  kernel32.TlsGetValue
00407186      8BC0          MOV EAX,EAX
00407188   $- FF25 10905900 JMP DWORD PTR DS:[<&kernel32.#847>]      ;  kernel32.TlsSetValue

看堆栈区:
0012FFC4   7C816D4F  返回到 kernel32.7C816D4F
0012FFC8   7C930738  ntdll.7C930738
0012FFCC   FFFFFFFF
0012FFD0   7FFD3000
0012FFD4   8054B938
0012FFD8   0012FFC8
0012FFDC   FF612DA8
0012FFE0   FFFFFFFF  SEH 链尾部
0012FFE4   7C8399F3  SE处理程序
0012FFE8   7C816D58  kernel32.7C816D58

不知道该如何修改,才能运行脱壳后的文件!
请各位多多指点!谢谢各位了!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
缩贴留念?
2006-4-23 19:05
0
雪    币: 208
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
OD载入,运行脱壳修复后的文件,停在此处,不知道该如何修改!才能使文件运行!
00407170 > $ E8 8B8ED200 CALL 01130000<-------函数没有修复啊?
00407175 E4 DB E4
00407176 8BC0 MOV EAX,EAX


还有IAT好象是加密过的啊
2006-4-23 20:37
0
雪    币: 129
活跃值: (135)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
IAT加密了。。。。
2006-4-23 20:48
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
5
stolen code

被抽代码了,IAT被加密了
2006-4-23 21:02
0
雪    币: 319
活跃值: (2439)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
6
试用版,脱了也没多大用处。
2006-4-23 21:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
那位大侠请说一下  IAT加密与否是看哪的啊  这个例子的IAT有没有被加密啊
请大侠们赐教
2006-4-24 11:38
0
雪    币: 233
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
期待有人回复,小弟我也学习一下
2006-4-24 23:57
0
雪    币: 208
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
0051321C  7C801A24  kernel32.CreateFileA
00513220  7C809B77  kernel32.CloseHandle
00513224  00000000<---------------------------一般IAT都是以这种000000隔开每个模块的
00513228  77D311B3  user32.GetKeyboardType<---一般IAT里面的函数都应该是77(user32)、7C(kernel32)
0051322C  77D20FE8  user32.LoadStringA<-------这些打头的[自己定义的函数除外,但如果未加密一般也能显出函数名称来
00513230  5E758D5A
00513234  77D20F90  user32.CharNextA
00513238  00000000                                 
0051323C  A5419701<--------------象这种看起来没什么规律的,又显不出函数名称的
00513240  5806B233<--------------一般都是加密的
00513244  F1A010CD<--------------
00513248  00000000
0051324C  770F4850  oleaut32.SysFreeString
00513250  7711C99D  oleaut32.SysReAllocStringLen
00513254  770F4B59  oleaut32.SysAllocStringLen
00513258  00000000
0051325C  7C809BF5  kernel32.TlsSetValue
00513260  7C809750  kernel32.TlsGetValue
00513264  7C8099BD  kernel32.LocalAlloc

个人观点,如有不对,请高手指点。
2006-4-25 14:29
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
10
今天拿来试了下
简单的纪录了下
希望对楼主有帮助

00513178  00000000  ;Start
0051317C  77F69D12  ntdll.RtlDeleteCriticalSection
00513180  77F5B380  ntdll.RtlLeaveCriticalSection

005139D8  71A2C328  WS2_32.bind
005139DC  00000000  ;End

014975F4   /75 5E           jnz short 01497654  ;jmp 1840000
014975F6   |EB 01           jmp short 014975F9

01840000     - 0F84 F375D7FF     je 014975F9
01840006       83FE 76           cmp esi,76
01840009     - 0F84 4576D7FF     je 01497654
0184000F       BE 76000000       mov esi,76
01840014     - E9 3B76D7FF       jmp 01497654

0F 84 F3 75 C5 FF 83 FE 76 0F 84 45 76 C5 FF BE 76 00 00 00 E9 3B 76 C5 FF

83,C4,28,5D,5F,5E,5B,C3

0149FBFA    E8 B5D0FFFF     call 0149CCB4
0149FBFF    83C4 2C         add esp,2C
0149FC02    5D              pop ebp
0149FC03    5F              pop edi
0149FC04    5E              pop esi
0149FC05    5B              pop ebx
0149FC06    C3              retn

89,45,F0,B8,00,07,00,00

01497188    8945 F0         mov dword ptr ss:[ebp-10],eax
0149718B    B8 00070000     mov eax,700
01497190    E8 B7B3FDFF     call 0147254C  ;jmp 1840037

Stolen Start

016B025C    55              push ebp
016B025D    C1C5 A7         rol ebp,0A7
016B0260    036C24 18       add ebp,dword ptr ss:[esp+18]
016B0264    8BEC            mov ebp,esp

call 016D0000

01840000       BA 00104000       mov edx,2006.<ModuleEntryPoint>
01840005       803A E8           cmp byte ptr ds:[edx],0E8
01840008       75 12             jnz short 0184001C
0184000A       8B42 01           mov eax,dword ptr ds:[edx+1]
0184000D       03C2              add eax,edx
0184000F       83C0 05           add eax,5
01840012       3D 00007001       cmp eax,016D0000
01840017       75 03             jnz short 0184001C
01840019       EB 0C             jmp short 01840027
0184001B       90                nop
0184001C       42                inc edx
0184001D       81FA 00905000     cmp edx,509000
01840023     ^ 72 E0             jb short 01840005
01840025     - EB FE             jmp short 01840025
01840027       8915 00018401     mov dword ptr ds:[1840100],edx
0184002D       60                pushad
0184002E       FFE2              jmp edx
01840030       90                nop
01840031       90                nop
01840032       90                nop
01840033       90                nop
01840034       90                nop
01840035       90                nop
01840036       90                nop
01840037       60                pushad
01840038       B8 78315100       mov eax,513178
0184003D       90                nop
0184003E       3910              cmp dword ptr ds:[eax],edx
01840040       75 20             jnz short 01840062
01840042       8B0D 00018401     mov ecx,dword ptr ds:[1840100]
01840048       C701 FF250000     mov dword ptr ds:[ecx],25FF
0184004E       8941 02           mov dword ptr ds:[ecx+2],eax
01840051       61                popad
01840052       90                nop
01840053       8B15 00018401     mov edx,dword ptr ds:[1840100]
01840059       90                nop
0184005A       90                nop
0184005B       90                nop
0184005C     ^ EB BE             jmp short 0184001C
0184005E       90                nop
0184005F       90                nop
01840060       90                nop
01840061       90                nop
01840062       83C0 04           add eax,4
01840065       3D DC395100       cmp eax,5139DC
0184006A     ^ 7E D2             jle short 0184003E
0184006C     ^ EB E3             jmp short 01840051

BA 00 10 40 00 80 3A E8 75 12 8B 42 01 03 C2 83 C0 05 3D 00 00 6D 01 75 03 EB 0C 90 42 81 FA 00
90 50 00 72 E0 EB FE 89 15 00 01 84 01 60 FF E2 90 90 90 90 90 90 90 60 B8 78 31 51 00 90 39 10
75 20 8B 0D 00 01 84 01 C7 01 FF 25 00 00 89 41 02 61 90 8B 15 00 01 84 01 90 90 90 EB BE 90 90
90 90 83 C0 04 3D DC 39 51 00 7E D2 EB E3

我是按linex的方法补了32个区段。。。真是累死。。。郁闷ing
另外需要修复
Route Check
和自校验。。。

最后完成了,,呵呵
2006-4-25 22:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 dpbird 发布
下面就开始使用最后一次异常法了。。。
我们一直狂按shit+F9,按了35次,到最后一次异常!
00EFFAA5 C700 EFCA5C85 MOV DWORD PTR DS:[EAX],855CCAEF
00EFFAAB 67:64:8F06 0000 POP DWORD PTR FS:[0]
00EFFAB1 83C4 04 ADD ESP,4
00EFFAB4 83E8 AF SUB EAX,-51
00EFFAB7 83C8 4B OR EAX,4B
按Alt+M,在00401000 CODE段下F2断点,Shift+F9运行:
00407170 E8 8B8ED200 CALL 01130000 //这就是OEP处
00407175 E4 8B IN AL,8B ; I/O 命令
00407177 C0FF 25 SAR BH,25 ; 移位常量超出 1..31 的

好的,按Ctrl+B,搜索一下FF 25,会找到:
004012B4 - FF25 1C325100 JMP DWORD PTR DS:[51321C] ; kernel32.CreateFileA
004012BA 8BC0 MOV EAX,EAX
004012BC E8 3FEDD200 CALL 01130000
004012C1 5B POP EBX
........

请问下了内存断点,Shift+F9后,为什么要搜索FF 25,这个怎么来的?请告知。我下了断点Shift+f9后直接到了这个地方:
004012B4  - FF25 1C325100       JMP DWORD PTR DS:[51321C]                ; kernel32.CreateFileA
004012BA    8BC0                MOV EAX,EAX
004012BC    E8 3FEDD200         CALL 01130000     
004012C1    5B                  POP EBX
没看到OEP处,这是怎么回事呢?谢谢!!
2006-4-26 13:57
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
12
你和楼主都没有到真正的OEP!
最好多看看有关ASProtect的脱文再去脱壳
2006-4-26 14:12
0
游客
登录 | 注册 方可回帖
返回
//