首页
社区
课程
招聘
藏好自己的 OllyDbg
发表于: 2005-8-20 17:24 21814

藏好自己的 OllyDbg

2005-8-20 17:24
21814

OllyDbg 的检测方法多如繁星,即使悉数了解并掌握破解技巧也需要耗费一定的时间。
因此可以制作一个 DLL(比如写一个插件) 借助 API Hook 来完成自动隐藏工作。

这篇教程中我不打算介绍如何进行 Hook API,Google 会比我讲的详细 :)

我们的 DLL 面临着这些问题:

1) 躲避字符串解析漏洞

某天你拿到一个程序载入运行,OllyDbg 连续三次非法后伤逝……
基本可以估计这个程序钻了这个漏洞。OllyDbg 使用了格式化字符输出调试信息,
如果调试信息里带有格式控制字符譬如“%s%s%s”,在字符输出之前就会死于非命。

利用代码:
                        @pushsz "%s%s%s%s%s"
                        call    OutputDebugStringA

要避免也很简单,只要钩住这个函数过滤掉对它的调用即可。想做的锦上添花可重定向输出到一个watch窗口中。

2) GetProcessHeap 后门

自从某人从 ASProtect 早期版本得到启发,发现 M$ 的此内存初值后门,这个漏洞也(将会)有不少人用。

利用代码:
                        call    GetProcessHeap
                        mov     eax, [eax+0Ch]
                        test    eax, 40h
                        je      no_debugger

我很抱歉,关于原因的事情你得问微软去了,谁叫你用 Windows 呢 ;-)
解决它要彻底些,不能用 Hook ,因为不一定非通过这个函数读取 Heap,PEB 也可以。

看看 GetProcessHeap:
7C80AA49 >  64:A1 18000000  mov     eax, fs:[18]
7C80AA4F    8B40 30         mov     eax, [eax+30]
7C80AA52    8B40 18         mov     eax, [eax+18]
7C80AA55    C3              retn

剩下的不用多费唇舌了吧。

3) 卑鄙的 native API

看雪精华里 blowfish 详细介绍过 ZwSetInformationThread 等 API,最好统统 Hook。

4) MeltICE

如果你用监视器,就像 RegMon 等,需要照顾一下这里。

如果发现 CreateFileA/W 中的文件名开头是 “\\.\ ”决不能手软,截留返回0。
这些通常是要进行 MeltICE 探测的。不过有些注册程序要读取硬盘序列号也会打开类似上面的文件名,
所以还是建议你准备一份常用 MeltICE 名表,对比拦截,比较稳妥。

5) IsDebuggerPresent

这个函数你一定用过。

7C812E03 >  64:A1 18000000  mov     eax, fs:[18]
7C812E09    8B40 30         mov     eax, [eax+30]
7C812E0C    0FB640 02       movzx   eax, byte ptr [eax+2]
7C812E10    C3              retn

修改掉标志就行了。

6) 进程检测

查阅一下 Process32Next 的帮助,如果发现它正探测你的调试器,把这个结构指向 Explorer 的或者直接跳到下一个。

现在可以不用把调试器改成丑陋的 eXpLoReR.eXe

7) 模块检测

看来 DBGHELP.DLL 不太受欢迎,有些程序调用 Module32Next检测到别人加载此模块就会大发雷霆……

8) UnhandledExceptionHandler

明明没有 SEH 处理程序缺能在没有调试器的时候运行,怎么也过不去怎么办?
看看 simonzh2000 《SetUnhandledExceptionFilter 的讨论》。
如果你上面处理了 native API 事实上这里不会再有问题。

9) BlockInput

最近在某个壳里看到这个函数:

                        push    TRUE/FALSE
                        call    BlockInput

就可以控制你的鼠标键盘是否能动了,按 Ctrl+Alt+Del 可以解,
不过谁也不想一按 F9 什么都不动了(做个绘图覆盖在调试器上面制造假死)
脑袋缺筋的可能会重启……

类似的还有 EnableWindow,不能让它肆意操作你的调试窗口。

10) 待你补充

我一时想不出更多阴招了。

forgot/iPB/Saga(他们死活不支持改名,又反对uS,就用Saga吧)
2005-8-20


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

收藏
免费 7
支持
分享
最新回复 (38)
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2

很全了 ,呵呵
不错哦
2005-8-20 17:43
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
支持,收藏。
2005-8-20 17:44
0
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
还缺一个方法呢
2005-8-20 17:46
0
雪    币: 221
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好啊!
OD反调试大法!
2005-8-20 17:49
0
雪    币: 200
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
收藏!
2005-8-20 18:03
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
ReadProcessMemory也要Hook的...一些壳会用特征码来检测OD....
2005-8-20 18:32
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
8
学习啊
2005-8-20 18:40
0
雪    币: 166
活跃值: (112)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
还可以使用如下方法检测OD
1.父进程检测:这个检测方法很多人开始用了,网上也可以找到现成的代码;但是如果换作native api来实现呢?又为什么一定要检测父进程名为explorer.exe呢?

2.对PE文件的修改:armdillo作者曾经写过一篇文章论述了如何通过修改PE结构的某些部分来阻止OD载入的方法

3.一般来说,NT平台上作system hook大多是修改SSDT表,如果我对此作检查呢?
2005-8-20 19:40
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
10
2005-8-20 19:45
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
继续
2005-8-20 20:02
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
12
不错,比较全了

Hook没用吧。不少人不调api了,直接拿来api函数的代码。
2005-8-20 20:36
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
13
笨蛋,你在他拿之前hook不就行了
2005-8-20 20:38
0
雪    币: 303
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
还有:ZwQueryInformationProcess 如SDP 使用
还有:GetTickCount
2005-8-20 20:44
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
15
1. CheckRemoteDebuggerPresent
2. exetools上有人提过CsrGetProcessId
3. GetTickCount,rdtsc,GetProcessTimes,GetSystemTimeAsFileTime之类的

另外,有些壳如ExeCryptor喜欢打窗口的主意,用的api
记不清了,大概有

EnumWindows,EnumChildWindows,GetWindow,
GetWindowThreadProcessId,还有个获取当前鼠标位置
所在窗口句柄的,想不起来了,不过对应NtUserWindowFromPoint

以forgot的功力,不要搞什么dll或者插件了,直接在
Ring0实现,事半功倍
2005-8-20 20:49
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 forgot 发布
笨蛋,你在他拿之前hook不就行了


他的意思是自己写代码模拟API
2005-8-20 20:56
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
17
最初由 小楼 发布
还可以使用如下方法检测OD
1.父进程检测:这个检测方法很多人开始用了,网上也可以找到现成的代码;但是如果换作native api来实现呢?又为什么一定要检测父进程名为explorer.exe呢?

2.对PE文件的修改:armdillo作者曾经写过一篇文章论述了如何通过修改PE结构的某些部分来阻止OD载入的方法

........


如果你检查SSDT,也许可以修改页表给个假的。
2005-8-20 20:57
0
雪    币: 209
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
咋hook 给推荐一篇简单易懂的教程
2005-8-20 21:00
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
19
最初由 forgot 发布
笨蛋,你在他拿之前hook不就行了


汉。我先研究研究咋把网页存下来。
2005-8-20 21:00
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
20
SSDT 是啥表?只知道有这么个表,全称都不知道
2005-8-20 21:13
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
21
忘记回帖了,补个先
2005-8-20 21:17
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
22
最初由 forgot 发布
SSDT 是啥表?只知道有这么个表,全称都不知道


系统服务描述符表
2005-8-20 21:44
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
23
最初由 forgot 发布
SSDT 是啥表?只知道有这么个表,全称都不知道


SST=SYSTEM SERVICE TABLE

SSDT=SYSTEM SERVICE DIRECTORY TABLE

好像是呃?,有邋?指正....QQ
2005-8-20 21:53
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
24
如果ssdt是系统服务描述符表那么应该是system service descriptor table
2005-8-20 23:16
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
25
应该多发好的贴。
2005-8-20 23:29
0
游客
登录 | 注册 方可回帖
返回
//