首页
社区
课程
招聘
[原创]我做的一个北斗改壳,看谁能脱。
发表于: 2011-4-22 14:03 21196

[原创]我做的一个北斗改壳,看谁能脱。

2011-4-22 14:03
21196

首先说明一下,这个改壳是我在学习了各种反调试之后的作品,高手莫笑。
改壳说明:
1、北斗压缩之后,第一区段只有内存空间无物理空间,我在第一区段增加2000字节的空间,里面写入各种反调试代码。代码中间穿插对原壳代码的变形处理。
2、API函数的处理全部采用搜索的方式来取得。具体看我的一个文章《【原创】shellcode汇编之采用API函数》http://bbs.pediy.com/showthread.php?t=125105。改壳后的程序是没有输入表的。
3、反调试代码是我从论坛上的有关文章中自己提炼出来的,里面不少我觉得是精品。
4、程序在PEid v0.95中显示是“Microsoft Visual C++ 7.0 Method2”。
5、本改壳有生成器,我就不提供了。提供一个改过壳的记事本程序,看谁能脱。
注意,当有OD打开时,记事本程序是运行不了的。360杀毒有可能报毒。

补充说明:
首先声明下,这个北斗4.1改壳是我在OD里直接编写的,程序就是源代码。

本北斗4.1改壳程序编写主要参考了以下二个资料:
1、《【原创】软件保护壳技术专题 - 反调试器技术》http://bbs.pediy.com/showthread.php?t=71113(以下简称参考一)
2、《【原创】各种反调试技术原理与实例》http://bbs.pediy.com/showthread.php?t=106143(以下简称参考二)。

下面就有关用到的反调试代码做下说明。

1、子程序010017CF用到了参考一中的反调试21,编号FS_OD_Exception_GuardPages,说明如下:Ollydbg允许设置一个内存访问/写入断点。它通过页面保护来实现。页面保护提供了当应用程序的某块内存被访问时获得通知。页面保护通过PAGE_GUARD页面保护修改符来设置。如果访问的内存是受保护的将会产生一个STATUS_GUARD_PAGE_VIOLATION(0x80000001)异常。如果进程被Ollydbg调试并且受保护的页面被访问,将不会抛出异常。访问将会被当作内存断点来处理。

这段反调试强度不高,用StrongOD插件可以轻易绕过。程序中,在异常的同时,程序010018A2处代码实现对程序用到的输入表DLL文件名称的解密。

2、子程序010018CF代码用到了参考二中的EnableWindow,强度也不是很高,只要把断点设在retn就可以过了。

3、子程序0100193B代码用到了参考二中的校验和_补丁检测,如果程序有修改可以检测出来。此段代码可以NOP掉。

4、子程序01001B86代码用到了参考二的CheckRemoteDebuggerPresent,反调试强度比较高,用StrongOD插件也绕不过。但是知道了原理就不怕了,只要把01001BFB处的判断语句NOP掉就可以绕过了。

5、继续往下,代码01001975处用的这段反调试采用参考一的FD_DebugObject_NtQueryObject,原话是这样的:当调试会话创建,将产生一个调试对象,我们通过ntdll中的NtQueryObject函数参看调试对象的个数是否不为零,来确定调试器的存在。以ObjectAllTypeInformation使用NtQueryObject查询后会返回一个OBJECT_ALL_INFORMATION的结构,其中NumberOfObjectsTypes成员为所有的对象类型在ObjectTypeInformation数组中的计数
此对象如下:
typedef struct _OBJECT_ALL_INFORMATION
ULONG    NumberOfObjectsTypes;
OBJECT_TYPE_INFORMATION ObjectTypeInformation[1];
}
typedef strcut _OBJECT_TYPE_INFORMATION {
[00]UNICODE_STRING TypeName;
[08]ULONG TotalNumberofHandles;
[0c]ULONG TotalNumberofObjects;
...
}
循环遍历ObjectTypeInformation对比类型的名字,如有类型名为DebugObject,则检测TotalNumberofHandles与TotalNumberofObjects,如果不为0则存在调试器。

经测试,这段反调试比较强大,但有个缺点,只能用在XP和WINDOWS 2003系统中,在WINDOWS 7中不能用。所以我在前面用了个GetVersion函数来检测系统的版本。绕过这段反调试的方法是把01001A57和01001A59二句判断语句NOP掉。

6、继续往下,我们来到01001A66,这句调用01001A75,子程序01001A75是个简单的除法异常,用StrongOD可以对付。在异常处理的时候,子程序01001ADC用来对原壳代码简单的解密处理(位置反转)。

7、子程序01001726用来恢复原来的输入表各个API函数的内存指针。

8、子程序01001C12用到了参考二的ZwQueryInformationProcess,强度还可以,用StrongOD不能对付,可以把01001C9E这个判断语句NOP掉就可以绕过。子程序01001CAF再次对原壳代码简单的解密处理(异或)。

过了后我们就可以顺利到达jmp eax(北斗壳的入口点)。

欢迎大家讨论。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (28)
雪    币: 13262
活跃值: (4311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看来已经有大牛在搞了-0-
等待脱文
2011-4-22 14:49
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在01001AD9那里跟不下去了,等待大牛现身。
2011-4-22 15:07
0
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道是不是脱壳了,还显示是那个壳
上传的附件:
2011-4-22 15:20
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
厉害,已经被你脱掉了。
2011-4-22 15:23
0
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
怎么还显示那个壳?
怎么完美修复呢?
2011-4-22 15:30
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
我是按照“Microsoft Visual C++ 7.0 Method2”这个样子去做的这么一个北斗变形。所以脱之前和脱之后都显示是“Microsoft Visual C++ 7.0 Method2”。
由于只是用的是北斗的压缩壳,解压之后北斗壳体代码和压缩体代码的物理空间和内存空间还在,只要把这部分去掉就可以了。
2011-4-22 15:50
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
在010010F1 F2,然后esp定律就到入口了。
2011-4-22 15:57
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
9
伪装了一下?
1.在010010F1,F2,F9,F7
2.Ctrl+S 61 9D B8 01 00 00 00 C2 0C 00 61 9D  ,F2,F9,F7
3.......
2011-4-22 17:42
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
脫殼完成了,也修復完成,目前檢查出來是VisualStdio 2007

finish.7z
上传的附件:
2011-4-22 19:13
0
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=幻影火;950788]脫殼完成了,也修復完成,目前檢查出來是VisualStdio 2007

finish.7z[/QUOTE]

请问如何修复的呢
怎么修复不了呢
2011-4-22 23:16
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
要修復第一個在dump的時候,不要用硬碟的header,IMPREC也是

第二個就是你優化區段的能力了....。
2011-4-23 08:31
0
雪    币: 414
活跃值: (10)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
13
再提供一种方法:单步后直接ESP定律,5次后单步即到入口。
2011-4-23 16:56
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
360居然报毒了,哈哈.
他对他不认识的一概的态度就是-----杀.
上传的附件:
2011-4-25 10:20
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
重新处理流程:在上次改壳的基础上,又加了一个北斗改壳,再用北斗4.1压缩(未改壳),然后用VMProtect1.7处理入口点,最后再加了一个北斗改壳。
上传的附件:
2011-4-25 11:03
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
脫殼完了,還好沒有無法執行,三層殼,可以執行真要偷笑。

finish.7z
上传的附件:
2011-4-25 11:41
0
雪    币: 394
活跃值: (131)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
[QUOTE=幻影火;951676]脫殼完了,還好沒有無法執行,三層殼,可以執行真要偷笑。

finish.7z[/QUOTE]

高手就是高手。
2011-4-25 11:44
0
雪    币: 136
活跃值: (105)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
18
vmp要加载里面 外面加了没啥用的
2011-4-25 13:31
0
雪    币: 248
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
怎么我的OD载入,单步,每次都出现程序无法出现的异常啊
高手们都是用的那个版本的啊
2011-4-25 14:00
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
基本上對我來講,如果不是將我的OD完全偵測到的話,用我自己的方法,大多都可以找到OEP,除非是stolen code
2011-4-25 15:27
0
雪    币: 291
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
幻影火  write down 你的办法啦
2011-4-25 15:38
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
膜拜幻影火,跪求脱文
2011-4-26 08:45
0
雪    币: 248
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
呵呵……
自己想了个办法脱壳完毕,请验证正确否
开始不是有个anti debug吗
不知道怎么去掉
不过看了下代码

01001000 N>  6A 70             push 70
01001002     68 002E0001       push NOTEPAD.01002E00
01001007     E8 F4050000       call NOTEPAD.01001600
0100100C     33DB              xor ebx,ebx
0100100E     53                push ebx
0100100F     E8 FE060000       call NOTEPAD.01001712
01001014     8945 F0           mov dword ptr ss:[ebp-10],eax
01001017     68 D418B682       push 82B618D4
0100101C     FF75 F0           push dword ptr ss:[ebp-10]
0100101F     6A 00             push 0
01001021     E8 15060000       call NOTEPAD.0100163B
01001026     8BF8              mov edi,eax
01001028     FFD7              call edi
0100102A     66:8138 4D5A      cmp word ptr ds:[eax],5A4D
0100102F     75 1F             jnz short NOTEPAD.01001050
01001031     8B48 3C           mov ecx,dword ptr ds:[eax+3C]
01001034     03C8              add ecx,eax
01001036     8139 50450000     cmp dword ptr ds:[ecx],4550
0100103C     75 15             jnz short NOTEPAD.01001053
0100103E     894D E0           mov dword ptr ss:[ebp-20],ecx
01001041     0FB741 18         movzx eax,word ptr ds:[ecx+18]
01001045     3D 0B010000       cmp eax,10B
0100104A     74 1F             je short NOTEPAD.0100106B
0100104C     3D 0B020000       cmp eax,20B
01001051     74 05             je short NOTEPAD.01001058
01001053     895D E4           mov dword ptr ss:[ebp-1C],ebx
01001056     EB 27             jmp short NOTEPAD.0100107F
01001058     83B9 84000000 0E  cmp dword ptr ds:[ecx+84],0E
0100105F   ^ 76 F2             jbe short NOTEPAD.01001053
01001061     33C0              xor eax,eax
01001063     3999 F8000000     cmp dword ptr ds:[ecx+F8],ebx
01001069     EB 0E             jmp short NOTEPAD.01001079
0100106B     8379 74 0E        cmp dword ptr ds:[ecx+74],0E
0100106F   ^ 76 E2             jbe short NOTEPAD.01001053
01001071     33C0              xor eax,eax
01001073     3999 E8000000     cmp dword ptr ds:[ecx+E8],ebx
01001079     0F95C0            setne al
0100107C     8945 E4           mov dword ptr ss:[ebp-1C],eax
0100107F     895D FC           mov dword ptr ss:[ebp-4],ebx
01001082     68 ADD13441       push 4134D1AD
01001087     FF75 F0           push dword ptr ss:[ebp-10]
0100108A     6A 00             push 0
0100108C     E8 AA050000       call NOTEPAD.0100163B
01001091     8B4D F8           mov ecx,dword ptr ss:[ebp-8]
01001094     8941 10           mov dword ptr ds:[ecx+10],eax
01001097     50                push eax
01001098     FF75 F0           push dword ptr ss:[ebp-10]
0100109B     E8 2F070000       call NOTEPAD.010017CF
010010A0     E8 2A080000       call NOTEPAD.010018CF
010010A5     8B55 F8           mov edx,dword ptr ss:[ebp-8]
010010A8     81EA D0170000     sub edx,17D0
010010AE     B9 00030000       mov ecx,300
010010B3     52                push edx
010010B4     51                push ecx
010010B5     E8 81080000       call NOTEPAD.0100193B
010010BA     E8 C70A0000       call NOTEPAD.01001B86
010010BF     8B4D F8           mov ecx,dword ptr ss:[ebp-8]
010010C2     51                push ecx
010010C3     E8 5E060000       call NOTEPAD.01001726
010010C8     E8 450B0000       call NOTEPAD.01001C12
010010CD     83C4 14           add esp,14
010010D0     5F                pop edi
010010D1     5E                pop esi
010010D2     5B                pop ebx
010010D3     83C4 70           add esp,70
010010D6     8B4D 00           mov ecx,dword ptr ss:[ebp]
010010D9     64:890D 00000000  mov dword ptr fs:[0],ecx
010010E0     83C4 14           add esp,14
010010E3     E8 00000000       call NOTEPAD.010010E8
010010E8     58                pop eax
010010E9     05 181D0000       add eax,1D18
010010EE     8B40 18           mov eax,dword ptr ds:[eax+18]
010010F1     FFE0              jmp eax

最后一句jmp eax
估计是个关键跳转
但有OD单步到不了那里,反调试
那我就直接在原来代码上做点手脚改下
如下
01001000 N>  6A 70             push 70
01001002     68 002E0001       push NOTEPAD.01002E00
01001007     E8 F4050000       call NOTEPAD.01001600
0100100C     33DB              xor ebx,ebx
0100100E     53                push ebx
0100100F     E8 FE060000       call NOTEPAD.01001712
01001014     8945 F0           mov dword ptr ss:[ebp-10],eax
01001017     68 D418B682       push 82B618D4
0100101C     FF75 F0           push dword ptr ss:[ebp-10]
0100101F     6A 00             push 0
01001021     E8 15060000       call NOTEPAD.0100163B
01001026     8BF8              mov edi,eax
01001028     FFD7              call edi
0100102A     66:8138 4D5A      cmp word ptr ds:[eax],5A4D
0100102F     75 1F             jnz short NOTEPAD.01001050
01001031     8B48 3C           mov ecx,dword ptr ds:[eax+3C]
01001034     03C8              add ecx,eax
01001036     8139 50450000     cmp dword ptr ds:[ecx],4550
0100103C     75 15             jnz short NOTEPAD.01001053
0100103E     894D E0           mov dword ptr ss:[ebp-20],ecx
01001041     0FB741 18         movzx eax,word ptr ds:[ecx+18]
01001045     3D 0B010000       cmp eax,10B
0100104A     74 1F             je short NOTEPAD.0100106B
0100104C     3D 0B020000       cmp eax,20B
01001051     74 05             je short NOTEPAD.01001058
01001053     895D E4           mov dword ptr ss:[ebp-1C],ebx
01001056     EB 27             jmp short NOTEPAD.0100107F
01001058     83B9 84000000 0E  cmp dword ptr ds:[ecx+84],0E
0100105F   ^ 76 F2             jbe short NOTEPAD.01001053
01001061     33C0              xor eax,eax
01001063     3999 F8000000     cmp dword ptr ds:[ecx+F8],ebx
01001069     EB 0E             jmp short NOTEPAD.01001079
0100106B     8379 74 0E        cmp dword ptr ds:[ecx+74],0E
0100106F   ^ 76 E2             jbe short NOTEPAD.01001053
01001071     33C0              xor eax,eax
01001073     3999 E8000000     cmp dword ptr ds:[ecx+E8],ebx
01001079     0F95C0            setne al
0100107C     8945 E4           mov dword ptr ss:[ebp-1C],eax
0100107F     895D FC           mov dword ptr ss:[ebp-4],ebx
01001082     68 ADD13441       push 4134D1AD
01001087     FF75 F0           push dword ptr ss:[ebp-10]
0100108A     6A 00             push 0
0100108C     E8 AA050000       call NOTEPAD.0100163B
01001091     8B4D F8           mov ecx,dword ptr ss:[ebp-8]
01001094     8941 10           mov dword ptr ds:[ecx+10],eax
01001097     50                push eax
01001098     FF75 F0           push dword ptr ss:[ebp-10]
0100109B     E8 2F070000       call NOTEPAD.010017CF
010010A0     E8 2A080000       call NOTEPAD.010018CF
010010A5     8B55 F8           mov edx,dword ptr ss:[ebp-8]
010010A8     81EA D0170000     sub edx,17D0
010010AE     B9 00030000       mov ecx,300
010010B3     52                push edx
010010B4     51                push ecx
010010B5     E8 81080000       call NOTEPAD.0100193B
010010BA     E8 C70A0000       call NOTEPAD.01001B86
010010BF     8B4D F8           mov ecx,dword ptr ss:[ebp-8]
010010C2     51                push ecx
010010C3     E8 5E060000       call NOTEPAD.01001726
010010C8     E8 450B0000       call NOTEPAD.01001C12
010010CD     83C4 14           add esp,14
010010D0     5F                pop edi
010010D1     5E                pop esi
010010D2     5B                pop ebx
010010D3     83C4 70           add esp,70
010010D6     8B4D 00           mov ecx,dword ptr ss:[ebp]
010010D9     64:890D 00000000  mov dword ptr fs:[0],ecx
010010E0     83C4 14           add esp,14
010010E3     E8 00000000       call NOTEPAD.010010E8
010010E8     CC                int3
010010E9     58                pop eax
010010EA     05 181D0000       add eax,1D18
010010EF     8B40 18           mov eax,dword ptr ds:[eax+18]
010010F2     FFE0              jmp eax

就在010010E3处家个Int3异常,保存文件
设置系统默认调试器为OD,运行文件,出错,点调试,OD打开了,OK绕过了ANTI DEBUG了
进去后用ESP定律直接到达OEP
用OD插件脱壳直接完成
本人新手菜鸟,只能想到这个笨办法,盼望那位大牛贴出好方法,
上传的附件:
2011-4-26 11:30
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
全是高人,学习了.
2011-4-27 14:08
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
發一個教程

4.part1.rar
4.part2.rar
4.part3.rar
上传的附件:
2011-4-27 15:41
0
游客
登录 | 注册 方可回帖
返回
//