首页
社区
课程
招聘
新兵训练场第三期(12月27日,RING3下反调试技巧基本收集完毕)
2006-12-8 15:02 34990

新兵训练场第三期(12月27日,RING3下反调试技巧基本收集完毕)

2006-12-8 15:02
34990
引用WIN32病毒教程作者,16岁少年的一句话:“正如编写病毒的每一件事,开始的时候看起来很难,但是到了后来,就很简单了”

如果你勇于挑战困难,并且动手做这些题目,假如看了提示之后你仍然不会,在这里跟贴,你将会得到帮助。

本系列贴作为解密基础知识入门(http://bbs.pediy.com/showthread.php?s=&threadid=31840)的补充,过于基础的问题,将不会解答。总不能别人出书的东西,再重新默写出来给你看。此外在置顶贴中你会找到本系列的第一期的链接。非置顶贴则只有下一期的链接,请注意。

最后假如你在本帖中得益,那么请你继续关注本系列的帖,并且帮助后来人。一个人力量有限,我不可能照顾所有人的需要。唯一可以做的就是把一些有潜力的培养起来,然后在他们的帮助下培养更多的人。

第一期:

http://bbs.pediy.com/showthread.php?s=&threadid=35559

第一题。寻找反调试的实现方法和反反调试的方法。你可以自己想,或者自己搜索。搜索3种以上则过关。我将收录在3楼,方便后来人查看。请大家做这题之前先观察3楼还有那些没有被搜索出来。

要么你善于思考,通过调试分析自己找答案。要么善于查找现有的资料。这是本题锻炼的目的。虽然很多反调试技巧都有插件能过,但是你不可能永远都使用OD,假如其他调试器有更强大的功能,而又没有人开发插件,那么不懂得如何对付这些反调试技巧会成为你实力提升的障碍。知道反调试技巧,象高手那样能根据需要修改自己的调试器,是必须的能力。FLYODBG,野猪力量,OLLYICE等就是很好的例子。然而高手未必把自己修改的调试器放出来,你必须具备动手修改的能力!

提示:查看OD插件的功能,里面便有搜索反调试技巧的关键字

第二题。改变计算机运行顺序的2种方式。异常和中断。它们的区别是,异常由软件(即程序代码)引起,中断由硬件引起。关于这两种机制,调试器的断点就是基于这两种机制的。把你下断点的地方替换成代码INT3,当程序运行到这里,就会产生异常(称为陷阱类异常),并把原来的代码替换回去,这是最常见的软件断点。而硬件断点,一般指的是CPU提供的调试寄存器,即DRX。由硬件引起的,个人认为这属于中断。

上面是个人对基本概念的一些理解,可能会误导人,所以不必当真,大概有个认识就好了。本题的问题是,调试器是如何对这两种基本概念扩充,实现API断点和消息断点的?

提示:前者与PE结构有关。后者跟系统机制有关,作为第一期第三题和第二期第一题第三问的扩展。

第三题。HAPPYTOWN版主做了很多CRACKME,我对它们做了收集(连接在2楼),没有分析的,你可以写出分析。已有分析的,你可以随便找一个来修改,目标是防爆破。挑一种,另发贴写出详细过程,你会得到一篇精华文章。另外也收集了相关CRACKME的破文,假如你对破解很有兴趣,那么我也建议你看看

前者的参考资料:

新手加密算法入门系列文章
http://bbs.pediy.com/showthread.php?s=&threadid=27136
http://bbs.pediy.com/showthread.php?s=&threadid=27140
http://bbs.pediy.com/showthread.php?s=&threadid=27190
http://bbs.pediy.com/showthread.php?s=&threadid=27237
http://bbs.pediy.com/showthread.php?s=&threadid=28199

后者提示:

1 对目标加密处理,例如将显示注册成功的字符加密,然后只有得出正确注册码才能得到注册成功的字符。当然最好的方法是将注册号作为解密的密钥了,你可以根据需要,修改程序的加密算法。

2 在使用相关API之前先校验API是否已经下断,甚至模拟该API(在自己代码实现该API的功能,你需要搜索一些关于系统调用的信息)。当然,最好你能把消息断点也封杀掉。

3 你可以使用其他方法获得用户的输入,或者改变获得用户输入的时机(其实不一定要按下BUTTON才获取。),改变判断注册码是否正确的时机(常见的如重启验证)。

前者如果你对没分析过的,分析了并且给出注册机,可以把文章和注册机源代码发到CRACKME版。对没分析过的,写出分析,请发在这个版。后者,同样发到CRACK版,如果我说的3点,你全实现了,可以发去调试版了,这比我写的文章都要有深度了

给点信心自己,能到这里,证明你已经有一定逆向分析基础了。

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞7
打赏
分享
最新回复 (48)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-8 15:03
2
0
随便整理的,难免有误。如发现请跟贴指出,谢谢

已有算法分析的:

KeyGenMe 1-5

http://bbs.pediy.com/showthread.php?s=&threadid=33853

【原创】我的第6个CrackMe
http://bbs.pediy.com/showthread.php?s=&threadid=17037

对《我的第6个CrackMe》的算法详尽分析及注册机

http://bbs.pediy.com/showthread.php?s=&threadid=17428

【原创】我的第7个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=18049

【原创】happytown的“我的第7个CrackMe”算法分析

http://bbs.pediy.com/showthread.php?s=&threadid=18128

【原创】我的第九个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=21435

【原创】happytown第九个crackme的破解

http://bbs.pediy.com/showthread.php?threadid=21531

【原创】我的第10个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=25100

【原创】HappyTown 10th CrackMe 破解以及注册机

http://bbs.pediy.com/showthread.php?s=&threadid=25112

happytown的第11个CreakMe算法简单分析+KeyGen

http://bbs.pediy.com/showthread.php?s=&threadid=25518

【原创】HappyTown的第11个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=25504

【原创】HappyTown的第12个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=25862

【原创】HappyTown的第12个CrackMe分析_MD5
http://bbs.pediy.com/showthread.php?s=&threadid=26038

【原创】HappyTown的第13个CrackMe
http://bbs.pediy.com/showthread.php?s=&threadid=26103

CRC算法练习笔记(HappyTown兄弟的crackme_13)

http://bbs.pediy.com/showthread.php?s=&threadid=27510

【原创】HappyTown的第13个CrackMe分析[CRC32]

http://bbs.pediy.com/showthread.php?s=&threadid=26237

【原创】HappyTown的第14个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=29910

【原创】happytown兄的14th kgme

http://bbs.pediy.com/showthread.php?s=&threadid=29936

【原创】HappyTown的第16个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=31578

【原创】HappyTown的第16个CrackMe分析

http://bbs.pediy.com/showthread.php?s=&threadid=31610

【原创】CrackMe.happytown.VC.0018

http://bbs.pediy.com/showthread.php?s=&threadid=35157

【原创】CrackMe.happytown.VC.0018 简单算法分析

http://bbs.pediy.com/showthread.php?s=&threadid=35164

【原创】HappyTown的0018个CRACKME的详细分析(献给初学者)

http://bbs.pediy.com/showthread.php?s=&threadid=35176

【原创】CrackMe.happytown.VC.0019

http://bbs.pediy.com/showthread.php?s=&threadid=35158

【原创】CrackMe.happytown.VC.0019 算法分析

http://bbs.pediy.com/showthread.php?s=&threadid=35214

【原创】HappyTown的第21个CrackMe分析

http://bbs.pediy.com/showthread.php?threadid=33207

【原创】HappyTown的第21个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=32213

【原创】HappyTown的第22个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=32446

【原创】HappyTown的第22个CrackMe分析

http://bbs.pediy.com/showthread.php?s=&threadid=32541

【原创】HappyTown的第24个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=33208

【原创】HappyTown的第24个CrackMe分析

http://bbs.pediy.com/showthread.php?s=&threadid=33448

【原创】HappyTown的第26个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=33848

【原创】HappyTown的第26个CrackMe分析

http://bbs.pediy.com/showthread.php?s=&threadid=33854

【原创】HappyTown的第27个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=33850

HappyTown的第27个CrackMe分析

http://bbs.pediy.com/showthread.php?s=&threadid=33859

HappyTown的第28个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=33861

HappyTown的第28个CrackMe算法分析

http://bbs.pediy.com/showthread.php?s=&threadid=33887

【原创】CrackMe.happytown.VC.0029

http://bbs.pediy.com/showthread.php?s=&threadid=34166

CrackMe.happytown.VC.0029分析

http://bbs.pediy.com/showthread.php?s=&threadid=34916

【原创】CrackMe.HappyTown.VC.0033

http://bbs.pediy.com/showthread.php?s=&threadid=35744

Happytown第33个CrackMe(KeyGenMe)分析

http://bbs.pediy.com/showthread.php?s=&threadid=35761

【原创】Happytown的第35个crackme分析+注册机

http://bbs.pediy.com/showthread.php?s=&threadid=36414

【原创】CrackMe.HappyTown.VC.0035

http://bbs.pediy.com/showthread.php?s=&threadid=36153

【原创】Happytown's CrackMe_0038.exe 破解笔记

http://bbs.pediy.com/showthread.php?s=&threadid=36528

【原创】CrackMe.HappyTown.VC.0038

http://bbs.pediy.com/showthread.php?s=&threadid=36292

还没有分析的:

【原创】我的第8个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=19370

【原创】HappyTown的第17个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=31929

【原创】HappyTown的第20个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=32211

【原创】HappyTown的第23个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=33041

【原创】HappyTown的第25个CrackMe

http://bbs.pediy.com/showthread.php?s=&threadid=33406

【原创】CrackMe.happytown.VC.0030

http://bbs.pediy.com/showthread.php?s=&threadid=34691

【原创】CrackMe.happytown.VC.0031

http://bbs.pediy.com/showthread.php?s=&threadid=34692

【原创】CrackMe.happytown.VC6.0032

http://bbs.pediy.com/showthread.php?s=&threadid=35482

CrackMe[1].HappyTown.VC6.0034

http://bbs.pediy.com/showthread.php?s=&threadid=35896

【原创】CrackMe.HappyTown.VC.0039

http://bbs.pediy.com/showthread.php?s=&threadid=36427

【原创】CrackMe.HappyTown.VC.0040

http://bbs.pediy.com/showthread.php?s=&threadid=36631

最后一个是推荐看看:

【原创】HappyTown的第1个ReverseMe

http://bbs.pediy.com/showthread.php?s=&threadid=30089&perpage=15&highlight=&pagenumber=1
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-8 15:06
3
0
反调试技巧收集楼

年末似乎大家都很忙,某人问我最近怎么了,怎么都不更新了,我说都没人来做,怎么更新?看雪老大没有把HIDEOD加壳,也没使用任何反调试手段。很适合新人学习如何分析程序里面的插件,不过却没有一个人来做。今天考完试,看了一下,把HIDEOD最后两个未知的(反)反调试代码分析出来了。

给出几个相关链接,本地留一份,以后肯定用得着的:

http://bbs.pediy.com/showthread.php?s=&threadid=28929
查TEB和PEB成员会用到

http://www.pediy.com/bbshtml/bbs4/kanxue310.htm
查SEH成员

http://www.metasploit.com/users/opcode/syscalls.html
查系统调用号

关于IsDebuggerPresent,随便载入一个程序,用BP下断,从断点窗口就可以转到这个API的区域了,然后看到下面这段代码:

77E6191E >  64:A1 18000000  mov     eax, dword ptr fs:[18]
77E61924    8B40 30         mov     eax, dword ptr [eax+30]
77E61927    0FB640 02       movzx   eax, byte ptr [eax+2]
77E6192B    C3              retn

查找TEB和PEB的相关资料,可以知道这里其实就是检查PEB +2h处的BYTE。程序被调式时,这个BYTE为1,否则返回0。对付的方法很简单,把PEB +2h 的BYTE改成0就可以了。要注意到该反调试技巧其实可以不使用API,而是把代码移到自己的程序中。

关于SetUnhandledExceptionFilter,NtQueryInformationProcess,ZwQueryInformationProcess,第一个API是设置异常处理例程的,假如程序被调试,异常发生时该例程则不会被激活。

除了直接使用该API之外,还有可以这么用:

00455216    8B46 38         mov eax,dword ptr ds:[esi+38]  ;[esi+38]=SetUnhandledExceptionFilter
00455219    8B40 0B         mov eax,dword ptr ds:[eax+B]
0045521C    8908            mov dword ptr ds:[eax],ecx     ;ECX是程序自定义的SEH

现在用前面说过的方法看看SetUnhandledExceptionFilter

77E678A7 >/$  8B4C24 04     mov ecx,dword ptr ss:[esp+4]
77E678AB  |.  A1 4C04EC77   mov eax,dword ptr ds:[77EC044C]
77E678B0  |.  890D 4C04EC77 mov dword ptr ds:[77EC044C],ecx
77E678B6  \.  C2 0400       retn 4

API入口点+B的偏移便是需要设置的系统内部变量。该API实际就是设置这个变量。

当异常出现时,UnhandledExceptionFilter就会被激活。跟进这个函数,你会看到NtQueryInformationProcess,再跟进,是ZwQueryInformationProcess的调用。该函数其实就是查看EPROCESS中的DebugPort是不是一个有效的值。

将ZwQueryInformationProcess返回值(即EAX)改为0x80000000。就可以正常调试了。

反硬件断点(调试寄存器),异常发生时,进入SEH例程。这里有4个入口参数:

pExcept: --- EXCEPTION_RECORD结构的指针
pErr: --- 前面ERR结构的指针
pContext: --- CONTEXT结构的指针
pDispatch:---没有发现有啥意义

注意到CONTEXT结构:

iDr0 DWORD ? ; | +4
iDr1 DWORD ? ; | +8
iDr2 DWORD ? ; >调试寄存器 +C
iDr3 DWORD ? ; | +10
iDr6 DWORD ? ; | +14
iDr7 DWORD ? ; _| +18

显然可以人为制造异常,进入SEH,然后检查调试寄存器的值,甚至改变该调试寄存器的值让硬件断点失效。

当异常发生时,系统便会进入KiUserExceptionDispatcher,跟进里面可以看到RtlDispatchException,RtlExecuteHandlerForException,最后看到CALL ECX,ECX即SEH例程的入口地址。

也就是说HOOK RtlExecuteHandlerForException,在保存调式寄存器中的值之后清0。在SEH结束时,重新赋值。

这些都是怎么发现的?

希望你还记得第一期第三题,这会是其中一个方法。

CheckRemoteDebuggerPresent

最初由 叶飘萍 发布
OD载入一个程序,Ctrl+G:CheckRemoteDebuggerPresent
然后看到下面这段代码:
7C859B1E > 8BFF mov edi, edi
7C859B20 55 push ebp
7C859B21 8BEC mov ebp, esp
7C859B23 837D 08 00 cmp dword ptr [ebp+8], 0
7C859B27 56 push esi
7C859B28 74 35 je short 7C859B5F
7C859B2A 8B75 0C mov esi, dword ptr [ebp+C]
7C859B2D 85F6 test esi, esi
7C859B2F 74 2E je short 7C859B5F
7C859B31 6A 00 push 0
7C859B33 6A 04 push 4
7C859B35 8D45 08 lea eax, dword ptr [ebp+8]
7C859B38 50 push eax
7C859B39 6A 07 push 7
7C859B3B FF75 08 push dword ptr [ebp+8]
7C859B3E FF15 AC10807C call dword ptr [<&ntdll.NtQueryInform>; ntdll.ZwQueryInformationProcess
7C859B44 85C0 test eax, eax
7C859B46 7D 08 jge short 7C859B50
7C859B48 50 push eax
7C859B49 E8 1DF8FAFF call 7C80936B
7C859B4E EB 16 jmp short 7C859B66
7C859B50 33C0 xor eax, eax
7C859B52 3945 08 cmp dword ptr [ebp+8], eax
7C859B55 0F95C0 setne al
7C859B58 8906 mov dword ptr [esi], eax
7C859B5A 33C0 xor eax, eax
7C859B5C 40 inc eax
7C859B5D EB 09 jmp short 7C859B68
7C859B5F 6A 57 push 57
7C859B61 E8 4AF7FAFF call 7C8092B0
7C859B66 33C0 xor eax, eax
7C859B68 5E pop esi
7C859B69 5D pop ebp
7C859B6A C2 0800 retn 8

程序被调试时,eax为1,否则返回0。对付的方法,把7C859B5C 40 inc eax  //修改为: nop
就可以了


FindWindow,CreateToolhelp32Snapshot,Process32First/Next

详见该贴,另外看看该贴28楼,作为检查父进程的扩展,检查父进程是否在系统目录下,这样就不能通过简单修改程序名逃过检查了。
http://bbs.pediy.com/showthread.php?s=&threadid=4013&perpage=15&highlight=&pagenumber=1

对于FindWindow,可以修改程序的类。

对于父进程检查,我补充一下吧。跟踪CreateProcess,可以找到NtCreateProcess。它的定义如下

NtCreateProcess(

  OUT PHANDLE           ProcessHandle,
  IN ACCESS_MASK        DesiredAccess,
  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  IN HANDLE             ParentProcess,
  IN BOOLEAN            InheritObjectTable,
  IN HANDLE             SectionHandle OPTIONAL,
  IN HANDLE             DebugPort OPTIONAL,
  IN HANDLE             ExceptionPort OPTIONAL );

注意到ParentProcess,只要把EXPLORER的HANDLE传给它就OK了。

单步陷阱,API断点检测,时间检查
,SMC反单步跟踪,多线程anti-debug,CreateFile


详见这里:
http://www.pediy.com/practise/Paper.htm

文章比较旧了,对一些进行扩充。

API断点检测:不在入口点下断,而在别的什么地方,例如在该API里面的NATIVE API,当然你可以全程检查API的代码是否有断点,要注意的是,只要引发异常,调试器就能取得控制权,所以实际上也不一定用INT3(机械码CC),除0异常,非法访问内存等也是可以的。

更好的做法是全程模拟该API,放在自己的程序代码中。这样就无法在该API下断了,除非你找到它的位置,如果一个程序全部代码都看,也没必要在API下断了。假如你碰到模拟API的情况,如果它需要到某个NATIVE API,并且通过系统调用号来使用,在RING 3下最终是要访问SSDT的,可以在SSDT下访问断点,不过那是RING 0调试器才能做的事。

时间检查

这东西缺乏稳定性,试想你的程序在一台老机器上运行,或者你的用户正在打开很多程序,或者其他程序出现死循环等错误,然后你不得不放宽它的限制。太宽了就失去反调试的意思。当然你可以在时间检查超出预期范围时提示用户资源不足。

对付方法见:
http://bbs.pediy.com/showthread.php?s=&threadid=16913

CreateFile有两个,打开自己,由于很多DUMP工具都需要从原文件中读取PE头,所以打不开需要DUMP的程序文件就报错。另外就是确定某一个位置是否存在某个文件或者打开某个设备对象,一般用于检查驱动。

多线程anti-debug

这个可以用ICESWORD关线程,一次搞定,然后就可以ATTACH了。反正被加壳的程序不会校验其他线程是否存在。

ZwSetInformationThread

最初由 Ptero 发布
invoke ZwSetInformationThread,-2,17,0,0

这个native API将设置当前线程的调试端口为0,使调试器无法调试。
不知道除了hook这个API以外还有没有别的解决方法。


改PE信息,VM

http://www.pediy.com/bbshtml/bbs7/pediy7-707.htm

对于PE信息:

程序可能会使用PE信息解码。较方便的对付方法是,将EP修改为CC,EB FE(死循环)。然后ATTACH

特征码

一些壳侦察工具,都是使用特征码搜索,判断是什么壳的,人为加入这些特征码,便能让侦察工具误以为是别的壳了。同样地也可以用这个方法侦察一些逆向工具。从psapi.dll导出EnumProcesses,OpenProcess,ReadProcessMemory,然后搜索特征码。

ANTI DUMP

使用VirtualProtect改页面保护,破坏PE头和修改PEB中的imagesize,或者使用完代码就立刻清除。

对付前者,可从硬盘读取PE信息,对于后者,只有在清除前DUMP下来了。

检查一些调试器的驱动

通过注册表如“Software\Systems Internals\Filemon”或者使用EnumDeviceDrivers

OLLYDBG的字符处理BUG

无法处理%s%s和某些浮点数

前者除了常见的outputdebugstring之外,还可以把文件名改成包含%s%s的程序,同样可以让OLLYDBG崩溃。outputdebugstring的问题被PATCH了,但是随便找个程序,改成加上%s%s,仍然可以让主页上的OLLYICE崩溃。

后者在OLLYICE中已被修复

详见http://bbs.pediy.com/showthread.php?s=&threadid=33621

另类的查HOOK方法

在PEB+2H写入某个BYTE,然后调用IsDebuggerPresent,不等于你写入的那个BYTE。代表IsDebuggerPresent被HOOK了。

LDR_MODULE

PEB中的LDR_MODULE成员,指向一块内存。在NT系统中,程序被R3调试器调试,便会包含大量0xFEEEFEEE。我看到的例子是超过30h个0xFEEEFEEE就提示程序被调试,详见http://bbs.pediy.com/showthread.php?s=&threadid=36374

当然你也可以自己分析CREATEPROCESS的过程。

NtGlobalFlag

PEB中的NtGlobalFlag成员,它控制一些开关,R3调试器运行时,它便等于70h。

int3,int1

某些调试器(OLLYICE没问题)对这些处理得不够好,详见:http://bbs.pediy.com/showthread.php?s=&threadid=36369

PAGE_GUARD

OD使用这个作为内存断点,因此可以申请一块内存,在里面写入代码,设置该内存区域不可运行,然后运行那段代码。如果代码成功运行了,代表OD存在,如果进入我们的SEH例程,则OD不存在,该方法的缺陷是使用时,OD会莫名奇妙的中断下来。貌似使用VirtualProtect需要知道该内存页面原来的保护方式,或者我们可以通过该API设置自身页面属性来达到侦察内存断点的目的。

prefixes

OD对指令前缀支持得不太好,如果F9运行下面代码(EAX=0,会产生内存违规访问异常),能够正常进入SEH,但是单步的时候,便会跳过该异常,使用其他异常也是如此(正常指令不会被跳过)。

0040101A  |.  F3:64:        prefix rep:
0040101C      FF00          inc     dword ptr [eax]

hideod中的HeapFlags和ForceFlags
PEB中的/*018*/ HANDLE DefaultHeap
[DefaultHeap+10h]不为0则被调试
[DefaultHeap+0ch]不为2则被调式

注册表
检查SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug下的Debugger的内容

检查HKEY_CLASSES_ROOT下是否存在exefile\shell\Open with Olly&Dbg\command或者dllfile\shell\Open with Olly&Dbg\command

SetDebugPrivilege
这里主要是调试程序时,调试器提升了被调试程序的权限,因此可以通过打开系统进程(被调试前没有这个权限)来确定是否被调试。HIDEOD中的解决方法是先LookupPrivilegeValueA检查进程权限,权限不正常则OpenProcessToken打开进程令牌,然后用AdjustTokenPrivileges降低进程权限

雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
fonge 5 2006-12-8 16:02
4
0
建议发贴时选择[自动解析文字中的超链接]
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-8 16:25
5
0
在《加密与解密》第二版上330页介绍了18种反调试的方法。但有很多都是过时了,我列举几个还常用到的:
1、调用kernel32.dll输出函数IsDebuggerPresent()来检测是否有调试器存在
2、对比比较关键的API,可以检测是否被设置了BPX断点
3、利用ZwQueryInformationProcess()或NtQueryInformationProcess()检测使用Win32 Debug API的用户模式调试器
自己知道一点的还有:
1、程序自己模拟出一个调试器,自己调试自己,从而就不会被另一个调试器调试了
2、查找如OD的标题头等特征字串
3、时间校验
4、花指令

纯粹抛砖引玉,哈哈

2006-12-08 23:11
原来老大是这个意思啊。
通过学习,我再试试:
关于CheckRemoteDebuggerPresent 函数
CheckRemoteDebuggerPresent也是通过调用  NtQueryInformationProcess  函数查询调试端口实现的,其伪代码如下:

    BOOL CheckRemoteDebuggerPresent(HANDLE hProcess, PBOOL pbDebuggerPresent)
    {
      enum PROCESS_INFO_CLASS { ProcessDebugPort = 7 };

      if(hProcess && pbDebuggerPresent)
      {
        HANDLE hPort;

        *pbDebuggerPresent = NT_SUCCESS(NtQueryInformationProcess(hProcess, ProcessDebugPort, &hPort, sizeof(hPort), NULL)) ? TRUE : FALSE;

        return *pbDebuggerPresent;
      }
      return FALSE;
    }

OD载入一个程序,Ctrl+G:CheckRemoteDebuggerPresent
然后看到下面这段代码:
7C859B1E >  8BFF            mov     edi, edi
7C859B20    55              push    ebp
7C859B21    8BEC            mov     ebp, esp
7C859B23    837D 08 00      cmp     dword ptr [ebp+8], 0
7C859B27    56              push    esi
7C859B28    74 35           je      short 7C859B5F
7C859B2A    8B75 0C         mov     esi, dword ptr [ebp+C]
7C859B2D    85F6            test    esi, esi
7C859B2F    74 2E           je      short 7C859B5F
7C859B31    6A 00           push    0
7C859B33    6A 04           push    4
7C859B35    8D45 08         lea     eax, dword ptr [ebp+8]
7C859B38    50              push    eax
7C859B39    6A 07           push    7
7C859B3B    FF75 08         push    dword ptr [ebp+8]
7C859B3E    FF15 AC10807C   call    dword ptr [<&ntdll.NtQueryInform>; ntdll.ZwQueryInformationProcess
7C859B44    85C0            test    eax, eax
7C859B46    7D 08           jge     short 7C859B50
7C859B48    50              push    eax
7C859B49    E8 1DF8FAFF     call    7C80936B
7C859B4E    EB 16           jmp     short 7C859B66
7C859B50    33C0            xor     eax, eax
7C859B52    3945 08         cmp     dword ptr [ebp+8], eax
7C859B55    0F95C0          setne   al
7C859B58    8906            mov     dword ptr [esi], eax
7C859B5A    33C0            xor     eax, eax
7C859B5C    40              inc     eax
7C859B5D    EB 09           jmp     short 7C859B68
7C859B5F    6A 57           push    57
7C859B61    E8 4AF7FAFF     call    7C8092B0
7C859B66    33C0            xor     eax, eax
7C859B68    5E              pop     esi
7C859B69    5D              pop     ebp
7C859B6A    C2 0800         retn    8

程序被调试时,eax为1,否则返回0。对付的方法,把7C859B5C    40           inc eax  //修改为:   nop
就可以了

发帖量用完了,只好在这里编辑了

刚才又看到RoBa大虾翻译的检测OllyDbg的四种方法,在下面这个链接中,有兴趣的去看看嘛 http://bbs.pediy.com/showthread.php?threadid=4013
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-8 17:13
6
0
5楼。。。

我要的是实现方法以及反调试的方法。。。

我先开个头好了。
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
hawking 12 2006-12-8 22:43
7
0
先顶一下再仔细看。
雪    币: 267
活跃值: (44)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
hrbx 8 2006-12-8 23:19
8
0
【原创】HappyTown的第16个CrackMe的算法分析:
http://bbs.pediy.com/showthread.php?s=&threadid=31610
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-8 23:45
9
0
8楼THX,5楼还差2个,继续努力~~其实我的意思只是学会自己搜索需要的资料而已。如果你敢于自己探索,那更好。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-9 11:34
10
0
“其实我的意思只是学会自己搜索需要的资料而已”

能搜索的就行啊,好,我搜……
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-9 11:38
11
0
呵,我又找到几个反调试方法
1) int 3 异常
2) int 1 异常
3) 单步陷阱
4) API断点检测
5) debugger检测( ZwQuerySystemInformation )
6) 从注册表检查是否安装IceExt
7) debugger检测( CreateToolHelp32Snapshot,ProcessFirst,Process32Next )
8) debugger检测( CreateFile )
9) 执行时间检查
10) SMC反单步跟踪
11) 多线程anti-debug
呵呵,真多呀,有兴趣的自己学习理解去  
其链接在
http://www.pediy.com/practise/Paper.htm

现在第一题我过关了吗?
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-9 11:45
12
0
你去做下面的题目吧
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
Ptero 8 2006-12-10 09:53
13
0
invoke ZwSetInformationThread,-2,17,0,0

这个native API将设置当前线程的调试端口为0,使调试器无法调试。
不知道除了hook这个API以外还有没有别的解决方法。
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-10 09:56
14
0
除了HOOK还是HOOK,而且要HOOK到R0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
Ptero 8 2006-12-10 09:58
15
0
是啊。不过不知道为什么好多壳不用这个方法呢
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-10 10:08
16
0
shoooo曾经发过检查系统版本,然后直接用系统调用号使用ZwSetInformationThread的代码。

这样的ANTI,如果不用R0调试器,找起来有点麻烦
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
Ptero 8 2006-12-10 10:11
17
0
能否在这个函数上下硬件断点,然后中断后修改eip直接返回呢
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-10 10:24
18
0
直接用系统调用,而不用API

只能在SSDT上下硬件断点了

RING3调试器没有这个权限

如果使用STUB API,那下什么断点都没问题了。甚至把系统调用NOP掉

忘记哪个大牛在某贴回复里面给了查系统调用的网址了,再发上来,没有的本地收藏一份吧。检查系统,然后直接为相应的使用系统调用,无从下断。不过可以从最上层的CALL步过,然后一层一层的找出问题的地方。

http://www.metasploit.com/users/opcode/syscalls.html(点那个API可以查看详细的调用参数)

对于使用系统调用的情况,RING3的插件是对付不了的,要写驱动HOOK SSDT了
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
Ptero 8 2006-12-10 10:44
19
0
好东西,收藏了
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2006-12-10 21:02
20
0
我原来写的那篇时间检测的文章,道理倒是可行的,但ring0编程我不行,改页表项后经常蓝屏,只好关闭了
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
alpsdew 4 2006-12-10 22:49
21
0
楼上看看,到网上有没有源码的

我下了些源码,不过都是DOS下的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
walfer 2006-12-11 18:00
22
0
先顶了再说呀
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-11 22:34
23
0
叶飘萍 + 一下我QQ

今天才看到邮件,你很有潜力,交个朋友吧

发E MAIL不知道要等多少天了,就在这里跟帖说明一下了。

我也发不了论坛消息
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-12 07:53
24
0
承蒙抬爱,为谢
这两天比较忙,上论坛不是很多,有也是匆匆而过,所以现在才看到,回复得较晚了。不好意思
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
binbinbin 28 2006-12-13 12:52
25
0
非常好。极其好。版主-我爱你!!

我虽然也整理过一些但是还是版主认真负责。
游客
登录 | 注册 方可回帖
返回