首页 > 代码库 > 过反调试

过反调试

重所周知,有破解就必有防破解,二者本为一体

破解技术就不要我多介绍了,下面我来介绍反调试技术 也就是所谓的防破解技术

反调试技术可以简单通俗的理解为:防止OD分析软件的技术,也就是反调试技术

那么反调试技术又有几种呢? 下面我介绍几种常用反调试技术

首先声明,下面有一部分内容来源百度,若有喷子觉得恶心,请自觉删除

  1. 1.       最常用的便是调用windows API 那么 windows API又如何检测OD呢?每一个API的作用是什么呢
  2. 2.       小编在百度上搜寻了一些文章来引用
  3. 3.        1.1IsDebuggerPresent探测调试器是否存在的最简单的API函数是IsDebuggerPresent。它查询进程环境块(PEB)中的IsDebugged标志。如果进程没有运行在调试器环境中,函数返回0;如果调试附加了进程,函数返回一个非零值。
  4. 解释:这里介绍的API是lsDebuggerPresent 他就是一个可以用来检测OD的函数,通过检测自身是否被附加,来检测OD,或者是在OD下运行也会被检测
  5. 5.        
  6. 1.2CheckRemoteDebuggerPresentCheckRemoteDebuggerPresent中的Remote并不意味着调试器必须驻留在不同的计算机上;相反,它表示调试器驻留在单独的并行进程中。 使用IsDebuggerPresent函数来检测调用进程是否在调试器下运行。
  7. 解释:这里介绍的是CheckRemoteDebuggerPresent,他很有实用性,不过可惜只能在XP版本使用,下面是来自网络的解释,CheckRemoteDebuggerPresent是另一个检测调试的api,只是可惜它似乎只能在winxp sp1版本以后使用。它主要是用来查询一个在winnt时就有的一个数值,其内部会调用NtQueryInformationProcess()
  8. 1.3NtQueryInformationProcess这个函数是Ntdll.dll中一个原生态API,它用来提取一个给定进程的信息。它的第一个参数是进程句柄,第二个参数告诉我们它需要提取进程信息的类型,例如将该参数置为ProcessDebugPort(值为0x7),将会告诉你这个句柄标识的进程是否正在被调试。如果进程正在被调试,则返回调试端口,否则返回0。
  9. 9.       解释:这个API函数是属于Ntdll里面的API,它主要可以提取进程信息来检测OD,如果OD信息全部被替换,则此API 检测不到
  10. 1.4GetLastError编写应用程序时,经常需要涉及到错误处理问题。许多函数调用只用TRUE和FALSE来表明函数的运行结果。一旦出现错误,MSDN中往往会指出请用GetLastError()函数来获得错误原因。恶意代码可以使用异常来破坏或者探测调试器。调试器捕获异常后,并不会立即将处理权返回被调试进程处理,大多数利用异常的反调试技术往往据此来检测调试器。多数调试器默认的设置是捕获异常后不将异常传递给应用程序。如果调试器不能将异常结果正确返回到被调试进程,那么这种异常失效可以被进程内部的异常处理机制探测。
    解释:这是利用OD处理异常信息检测的API,他可以通过异常来检测到OD
  11. 1.5对于OutputDebugString函数,它的作用是在调试器中显示一个字符串,同时它也可以用来探测调试器的存在。使用SetLastError函数,将当前的错误码设置为一个任意值。如果进程没有被调试器附加,调用OutputDebugString函数会失败,错误码会重新设置,因此GetLastError获取的错误码应该不是我们设置的任意值。但如果进程被调试器附加,调用OutputDebugString函数会成功,这时GetLastError获取的错误码应该没改变。
  12. 这个API名字叫OutputDebugString,他这个函数意思是  程序如果调用了这个API,就会在OD中显示一条字符串(由于API而生成的,非程序本身),然后用通过SetLastError函数,用来获取返回值(上文所说的错误值),如果被OD调试 则返回的便是真,没有被调试则为假
  13. 1.6对于DeleteFiber函数,如果给它传递一个无效的参数的话会抛出ERROR_INVALID_PARAMETER异常。如果进程正在被调试的话,异常会被调试器捕获。所以,同样可以通过验证LastError值来检测调试器的存在。如代码所示,0x57就是指ERROR_INVALID_PARAMETER。
  14. 解释:这个API名为DeleteFiber,他作用是抛出一个异常,众所周知,OD会自动处理异常(除非你手动设置),这时候,他便可以通过LastError  返回值来检测OD

 

 

那么关键来了,我们要如何干掉这些检测呢???

  1. 用工具(推荐,简单快捷)
  2. 可以用类似XUTER 冰刃等软件,来挂钩此函数,至于如何挂钩,找到相关函数,如何右键-恢复
  3. 2.通过写源码 来HOOK此函数
  4. 这里就不过多介绍了,例子百度有一大堆
  5. 过API检测就这么简单,不过想要找到是哪个API  还是需要花费一番功夫的
  6. 常用的检测OD方法还有几种
  7. 1. 3.2查找窗体信息
    FindWindow函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。
  8. 这个比较简单过,只需要更改OD的窗口名称和类名,可以用精易助手编写
  9. 10.              5.判断父进程是否是explorer.exe
  10. 11.             这个进程是系统主要进程,一般进程的父进程都是这个
  11. 12.             如果用OD运行的话会改变父进程从而检测到软件被调试,过此方法很简单,OD附加即可
  12. 判断是否具有SeDebugPrivilege权限
    默认情况下进程是没有SeDebugPrivilege权限的,但是当进程通过调试器启动时,由于调试器本身启动了SeDebugPrivilege权限,当调试进程被加载时SeDebugPrivilege也就被继承了。所以我们可以检测进程的SeDebugPrivilege权限来间接判断是否存在调试器,而对SeDebugPrivilege权限的判断可以用能否打开csrss.exe进程来判断。
  13. 14.             SeDebugPrivilege权限可以理解为系统最高权限,相当与在美国和奥巴马一般,一般进程都获取不了这个权限,除非一些病毒用非法手段获取权限,OD运行时会获取此权限,从而他的子进程也会附带这个权限,所以可以通过检测是否有次权限来判断是否被调试,过检测方法很简单,一样是附加
  14. 15.             15.时钟检测
  15. 16.             这个很容易理解,就是在时钟里面添加检测代码,循环检测
  16. 17.             解决方法
  17. 18.             推荐工具 XUTER
  18. 右键-查看-查看进程定时器-移除
  19. 下面再来讲讲关于一些反调试进程的反调试
  20. 有些进程调用了一些检测模块
  21. 检测到OD会弹出
  22.           警告!   程序初始化失败!
  23.  
  24.            请关闭 调试工具 再试!
  25.  
  26.                软件破解逆向QQ群:xxxxxxx
  27. 首先声明:下列说明我已经调试过,所以无法截图,蓝屏太容易触发
  28. 然后迅速蓝屏,对于这种软件,我们应该怎么办?
  29. 首先第一个想到的方法便是附加,但是我们一打开OD他就马上检测,怎么办?,这样就说明他要么是时钟检测,要么就是循环检测,我们先看看时钟检测,用XUTER,查看定时器,哦  结果发现蓝屏,那怎么办呢?  下面教大家一招妙招
  30. 依然用到的是XUTER
  31.  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    1. 首先暂停该程序运行,然后便发现程序卡死了,然后再结束定时器,再点下方的恢复进程运行
    2. 好了,这下他的检测被我们解决了,我们就直接附加吧
    3. 结果发现,他隐藏了进程,没关系,我们用拖拽补丁,结果显示无法获取窗口,附加失败,那怎么办呢? 出现这种情况无疑就是程序调用了驱动,导致没有权限附加
    4. 这样我们依然用到XUter
    5. 我们跳到本工具配置,然后勾选禁止驱动加载,然后再运行进程,重复上面操作,然后打开OD附加
    6. 就发现成功了,这方法是我专门对付那些有驱动保护的,如果软件有检测驱动是否加载成功,可以用OD去掉
    7. 这就是我总结的一些方法,很简单很适用,至少我对于那些检测 我都有应付的办法
    8. 由于是自己写的  对于API知识不是很到位,所以难免会有差错,发现差错可以@我及时纠正,现在时间试:2016年10月23日03:55:23  我也要睡觉了,虽然是星期六 但还是要睡觉的
    9. 下面有时间再完善一下吧,谢谢大家的观看
    10. 吾爱破解论坛BY:Very-good

过反调试