首页
社区
课程
招聘
[求助]请教 cxlrb 一个关于 FSG 脱壳区段重组的问题
发表于: 2007-10-19 06:50 4752

[求助]请教 cxlrb 一个关于 FSG 脱壳区段重组的问题

2007-10-19 06:50
4752
看雪论坛上的 32bit Calculator v1.7 32位汇编指令计算器 是 FSG 1.31 的壳,壳很好脱,脱壳后我确定所有的数据都在7FFF之前,可是区段拼装优化我始终没弄好,段里很乱,分了几次没分明白,请教下应该怎么从新拼装,我想知道各区段的范围。

软件下载地址:6c2K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6u0r3N6r3!0G2L8s2y4Q4x3V1k6U0L8$3c8W2i4K6u0r3x3K6u0T1K9i4c8Q4x3U0f1J5x3p5y4S2L8r3y4#2L8r3q4@1L8%4u0Q4x3V1j5K6x3X3u0A6N6q4)9J5y4e0t1H3b7$3q4D9j5%4g2D9j5i4c8G2M7W2)9J5y4e0t1H3N6U0q4Q4x3X3f1%4i4K6u0W2M7X3q4J5

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
调整区段对齐粒度为1000,然后用16进制查看,如果在1000的倍数开始的地址处开始有新的数据,就从那里开始新的区段,注意计算好映像大小。
这里有个优化好的,你可以看看:

下载
2007-10-19 09:37
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
我这个脱壳程序的rva从5000到8000可以再分一个区段,自己琢磨一下。
上传的附件:
2007-10-19 09:41
0
雪    币: 191
活跃值: (351)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
4
IAT和资源段问题不大,我没搞清楚的是代码段和数据段应该从哪开始分开。
2007-10-19 20:56
0
雪    币: 191
活跃值: (351)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
5
终于搞定了,在7000之内。不过感觉3个区段好像还不是太完美,同时PEid显示的好像还不正确。汇编写的程序默认应该是几个区段呢?
上传的附件:
2007-10-19 22:48
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
6
汇编入口点是这样的:

1.
00401000 >  6A 00           push    0
00401002    E8 5D910000     call    <jmp.&kernel32.GetModuleHandleA>
00401007    A3 68B44000     mov     dword ptr [40B468], eax
0040100C    E8 8D930000     call    <jmp.&comctl32.InitCommonControls>
00401011    E8 A5190000     call    004029BB
00401016    6A 04           push    4
00401018    E8 5D930000     call    <jmp.&gdi32.GetStockObject>
0040101D    A3 01F74100     mov     dword ptr [41F701], eax
00401022    68 DA3C4000     push    00403CDA
00401027    E8 26910000     call    <jmp.&kernel32.SetUnhandledExceptionFilter>
0040102C    68 58020000     push    258
00401031    68 07074200     push    00420707

2.
00401AB1 >/$  6A 00         push    0                                ; /pModule = NULL
00401AB3  |.  E8 56130000   call    <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
00401AB8  |.  A3 561A4000   mov     dword ptr [401A56], eax
00401ABD  |.  6A 00         push    0                                ; /lParam = NULL
00401ABF  |.  68 421B4000   push    00401B42                         ; |DlgProc = PECompac.00401B42
00401AC4  |.  6A 00         push    0                                ; |hOwner = NULL
00401AC6  |.  68 58194000   push    00401958                         ; |pTemplate = PECompac.00401958
00401ACB  |.  FF35 561A4000 push    dword ptr [401A56]               ; |hInst = NULL
00401AD1  |.  E8 DE120000   call    <jmp.&user32.DialogBoxIndirectPa>; \DialogBoxIndirectParamA
00401AD6  |.  6A 00         push    0                                ; /ExitCode = 0
00401AD8  \.  E8 2B130000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess
2007-10-21 09:26
0
雪    币: 191
活跃值: (351)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
7
这个程序的入口就不同,这个是不是汇编写的程序?
2007-10-21 15:24
0
雪    币: 191
活跃值: (351)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
8
刚注意到。晕。这个是汇编写的。
上传的附件:
2007-10-21 15:43
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
慢慢分析一下,就是汇编,只不过这个程序有点怪,找不到这个函数GetModuleHandleA
,无从修复成像以上形式。

昨天看了看WinUpack 3.9 statick unpacker v0.2.exe这个程序的入口,他是汇编写得,说到底OEP中语句作用是一样的,比较如下:

00400640 >    33DB          xor     ebx, ebx
00400642      53            push    ebx
00400643  |.  E8 EC110000   call    <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
00400648  |.  A3 80184000   mov     dword ptr [401880], eax
0040064D      53            push    ebx
0040064E      68 68114000   push    00401168
00400653  |.  53            push    ebx                              ; |hOwner
00400654  |.  68 38024000   push    00400238                         ; |pTemplate = "DIALOG"
00400659  |.  FF35 80184000 push    dword ptr [401880]               ; |hInst = NULL
0040065F  |.  E8 40110000   call    <jmp.&user32.DialogBoxParamA>    ; \DialogBoxParamA
00400664  |.  50            push    eax                              ; /ExitCode
00400665  \.  E8 C4110000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess

上面这段入口代码,peid是无法识别的,我们将以上这段改成下面这段,peid便可识别为汇编语言,记得修改OEP值:

0040063F >/$  6A 00         push    0                                ; /pModule = NULL
00400641  |.  E8 EE110000   call    <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
00400646  |.  A3 80184000   mov     dword ptr [401880], eax
0040064B  |.  6A 00         push    0                                ; /lParam = NULL
0040064D  |.  68 68114000   push    00401168                         ; |DlgProc = 999.00401168
00400652  |.  6A 00         push    0                                ; |hOwner = NULL
00400654  |.  68 38024000   push    00400238                         ; |pTemplate = "DIALOG"
00400659  |.  FF35 80184000 push    dword ptr [401880]               ; |hInst = NULL
0040065F  |.  E8 40110000   call    <jmp.&user32.DialogBoxParamA>    ; \DialogBoxParamA
00400664  |.  50            push    eax                              ; /ExitCode
00400665  \.  E8 C4110000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess

那么我们直接给peid添加签名就可以了,因为这个变形入口是编译器直接编译出来的,而非认为变形,所以我们增加以下签名到peid签名库:

[MASM / TASM ->  * Sign By CxLrb]
signature = 33 DB 53 E8 ?? ?? 00 00 A3 ?? ?? 40 00 53 68 ?? ?? 40 00 53 68 ?? ?? 40 00 FF 35 ?? ?? 40 00 E8 ?? ?? 00 00 50 E8 ?? ?? 00 00
ep_only = true


再用peid扫描看看。
2007-10-22 08:35
0
雪    币: 191
活跃值: (351)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
10
[MASM / TASM -> * Sign By CxLrb]
signature = 33 DB 53 E8 ?? ?? 00 00 A3 ?? ?? 40 00 53 68 ?? ?? 40 00 53 68 ?? ?? 40 00 FF 35 ?? ?? 40 00 E8 ?? ?? 00 00 50 E8 ?? ?? 00 00
ep_only = true


这个好像是不太通用,你用这个查下我脱壳那个文件
2007-10-22 21:11
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
误解了我的意思,我那个签名仅仅作为补充,只对类似这样的入口的汇编程序有效:

00400640 >    33DB          xor     ebx, ebx
00400642      53            push    ebx
00400643  |.  E8 EC110000   call    <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA

以下是截图和测试程序:
上传的附件:
2007-10-23 10:17
0
游客
登录 | 注册 方可回帖
返回