过反调试

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

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

反调试技术可以简单通俗的理解为:防止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. 软件破解逆向QQ群:xxxxxxx
  25. 首先声明:下列说明我已经调试过,所以无法截图,蓝屏太容易触发
  26. 然后迅速蓝屏,对于这种软件,我们应该怎么办?
  27. 首先第一个想到的方法便是附加,但是我们一打开OD他就马上检测,怎么办?,这样就说明他要么是时钟检测,要么就是循环检测,我们先看看时钟检测,用XUTER,查看定时器,哦  结果发现蓝屏,那怎么办呢?  下面教大家一招妙招
  28. 依然用到的是XUTER
    1. 首先暂停该程序运行,然后便发现程序卡死了,然后再结束定时器,再点下方的恢复进程运行
    2. 好了,这下他的检测被我们解决了,我们就直接附加吧
    3. 结果发现,他隐藏了进程,没关系,我们用拖拽补丁,结果显示无法获取窗口,附加失败,那怎么办呢? 出现这种情况无疑就是程序调用了驱动,导致没有权限附加
    4. 这样我们依然用到XUter
    5. 我们跳到本工具配置,然后勾选禁止驱动加载,然后再运行进程,重复上面操作,然后打开OD附加
    6. 就发现成功了,这方法是我专门对付那些有驱动保护的,如果软件有检测驱动是否加载成功,可以用OD去掉
    7. 这就是我总结的一些方法,很简单很适用,至少我对于那些检测 我都有应付的办法
    8. 由于是自己写的  对于API知识不是很到位,所以难免会有差错,发现差错可以@我及时纠正,现在时间试:2016年10月23日03:55:23  我也要睡觉了,虽然是星期六 但还是要睡觉的
    9. 下面有时间再完善一下吧,谢谢大家的观看
    10. 吾爱破解论坛BY:Very-good
时间: 2024-08-15 12:27:51

过反调试的相关文章

修改Android手机内核,绕过反调试

0x1.手机设备环境 Model number: Nexus 5 OS Version: Android 4.4.4 KTU84P Kernel Version: 3.4.0-gd59db4e 0x2.Android内核提取 查找Android设备的boot分区文件.高通芯片的设备可以通过下面的命令进行查找. cd /home/androidcode/AndroidDevlop/modifyNexus5Boot adb shell ls -al /dev/block/platform/msm_s

Windows 下常见的反调试方法

稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态. if (IsDebuggerPresent()) //API接口 { AfxMessageBox(L"检测到调试器"); } else { AfxMessageBox(L&qu

反调试技术

反调试技术在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术,首先我们来看看反调试技术. 一.Windows API方法 Win32提供了两个API, IsDebuggerPresent和CheckRemoteDebuggerPresent可以用来检测当前进程是否正在被调试,以IsDebuggerPresent函数为例,例子如下: BOOL ret

源码编译绕过反调试

参考师弟的贴子修改的, 基本我一次就弄好了, 没有遇到啥问题, 下面我主要是补充下他的帖子 http://bbs.pediy.com/showthread.php?t=213481 一. 环境搭建 (1). 环境介绍: 手机:nexus 5 ubuntu版本:15.10 android版本:4.4.4 android源码官网(这里有很多相关的资料,基本上按照官网的来就可以编译想编译的任何版本了) http://source.android.com/source/ (2). 环境配置 配置环境得好

SEH反调试的实现与调试

SEH用于反调试或者用于注册码的隐藏时.在没有异常时永远都是错误的注册码,只有当触发异常时,程序才走到注册成功的地方-- 代码如下: void CSehDlg::RegSuc() { HWND hWnd = ::GetDlgItem(NULL, IDC_STC_TIP); ::SetWindowText(hWnd, "Success!!"); } void CSehDlg::RegFail() { HWND hDlgWnd = AfxGetApp()->GetMainWnd()-

浅谈Android反调试 之 PTRACE_TRACEME

反调试原理: 关于Ptrace:  http://www.cnblogs.com/tangr206/articles/3094358.html ptrace函数 原型为: #include <sys/ptrace.h>long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);ptrace有四个参数:  1). enum __ptrace_request request:指示了ptrace要执行的命

Android逆向之旅---应用的&quot;反调试&quot;方案解析(附加修改IDA调试端口和修改内核信息)

一.前言 在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了.但是有时候必须要借助动态调试方可破解,就需要进行操作了.现阶段反调试策略主要包括以下几种方式: 第一.自己附加进程,先占坑,ptrace(PTRACE_TRACEME, 0, 0, 0)!第二.签名校验不可或缺的一个选择,本地校验和服务端校验双管齐下!第三.借助系统api判断应用调试状态和调试属

强大反调试cm的奇葩破解

系统 : Windows xp 程序 : Crackme-xp 程序下载地址 :http://pan.baidu.com/s/1slUwmVr 要求 : 编写注册机 使用工具 : OD & IDA 可在看雪论坛中查找关于此程序的破文:传送门 这是一个拥有强大反调试机制的cm,无法查询到关键子串.下获取窗口文本的断点没用,设置对按钮下消息断点都没用. 然后用IDA打开后却发现了函数表里有: .................. 这个懂点英文的人都能看出来是 注册按钮的处理函数吧?所以前面那么多防护

Linux下的反调试技术

Linux下的反调试技术 2014年01月30日 ⁄ 综合 ⁄ 共 2669字 ⁄ 字号 小 中 大 ⁄ 评论关闭 转自  http://wangcong.org/blog/archives/310 如何防止自己的程序被调试器跟踪,这是一个很有趣的话题,也是反逆向工程中的一个重要话题.这里简单介绍一下Linux平台上的反调试技术. (本文主要参考:http://blog.txipinet.com/2006/10/05/37-tecnicas-anti-debugging-sencillas-pa