陌路人 发表于 2015-5-2 15:04:12

反调试的几种方法

本帖最后由 陌路人 于 2015-5-3 17:46 编辑

调试器在附加进程的时候 会调用 这个函数 NtDebugActiveProcess
这个函数内部呢 有很多判断 ,
比如 判断+0x320 Wow64Process   : (null)   
这个是判断是不是 32位 进程,如果不等于0 表示是64位进程
如果 是32 位 进程 ,还 会判断目标进程 是不是 32位 进程
如果 32位进程 调试 64位 进程 就会 退出 无法附加 ,
所以 就会出现 od 无法 附加64位 程序

2判断 有很多 但是都不是重点, 下面主要说下这个域
//判断进程是否是受保护进程Flags2-> ProtectedProcess 是否为0
正常情况下 是0的,如果判断 不等于0就会退出 并返回错误码 return 0xc0000712;
//如果 我们 把它修改成 1,看看会发生什么情况
   +0x43c Flags2         : 0xd000
   +0x43c JobNotReallyActive : 0y0
   +0x43c AccountingFolded : 0y0
   +0x43c NewProcessReported : 0y0
   +0x43c ExitProcessReported : 0y0
   +0x43c ReportCommitChanges : 0y0
   +0x43c LastReportMemory : 0y0
   +0x43c ReportPhysicalPageChanges : 0y0
   +0x43c HandleTableRundown : 0y0
   +0x43c NeedsHandleRundown : 0y0
   +0x43c RefTraceEnabled: 0y0
   +0x43c NumaAware      : 0y0
   +0x43c ProtectedProcess : 0y0   
   +0x43c DefaultPagePriority : 0y101
   +0x43c PrimaryTokenFrozen : 0y1
   +0x43c ProcessVerifierTarget : 0y0
   +0x43c StackRandomizationDisabled : 0y0
   +0x43c AffinityPermanent : 0y0
   +0x43c AffinityUpdateEnable : 0y0
   +0x43c PropagateNode    : 0y0
   +0x43c ExplicitAffinity : 0y0
   +0x43c Spare1         : 0y0
   +0x43c ForceRelocateImages : 0y0
   +0x43c DisallowStrippedImages : 0y0
   +0x43c LowVaAccessible: 0y0
现在 已经改成 1了
+0x43c ProtectedProcess : 0y1


其次 在附加的过程中 会调用这个函数

DbgkpPostFakeThreadMessages
这个函数的内部 会遍历 目标进程的线程
其中有一个判断 就是判断线程的
判断 ETHREAD->CrossThreadFlags 第二 位 是否是0; 正常情况下是 1
如果改成 0的话 会附加失败;0x450 ThreadInserted   : 0y1
   +0x450 CrossThreadFlags : 0xa802
   +0x450 Terminated       : 0y0
   +0x450 ThreadInserted   : 0y1
   +0x450 HideFromDebugger : 0y0
   +0x450 ActiveImpersonationInfo : 0y0
   +0x450 Reserved         : 0y0
   +0x450 HardErrorsAreDisabled : 0y0
   +0x450 BreakOnTermination : 0y0
   +0x450 SkipCreationMsg: 0y0
   +0x450 SkipTerminationMsg : 0y0
   +0x450 CopyTokenOnOpen: 0y0
   +0x450 ThreadIoPriority : 0y010
   +0x450 ThreadPagePriority : 0y101
   +0x450 RundownFail      : 0y0
   +0x450 NeedsWorkingSetAging : 0y0
我们修改成 0 后


还有一个就是DbgkpSetProcessDebugObject 这个函数
这个函数 是把 调试对象 设置到 目标进程的调试端口的

附加进程后 进程的 eprocess->+0x440 NoDebugInherit会变成 1
正常情况下是 0;
+0x440 Flags            : 0x144d0801
   +0x440 CreateReported   : 0y1
   +0x440 NoDebugInherit   : 0y0    正常的情况下 是0 的
如果成为 1 了表示 进程有调试器 附加了

陌路人 发表于 2015-5-2 15:05:55

{:soso_e179:},太猥琐了

Tesla.Angela 发表于 2015-5-2 15:20:37

还有一个,把ETHREAD里某个成员的数值改乱也能达到同样的效果。。。

具体哪个不记得了,群里NPX说的。。。

不过,确实有些DBG开头的变量,不在PG的检测范围之内。

wird0r 发表于 2015-5-2 15:31:14

多线程互相加密解密也挺麻烦的..

laomaotx 发表于 2015-5-2 16:31:26

学习了!!

陌路人 发表于 2015-5-2 17:41:57

Tesla.Angela 发表于 2015-5-2 15:20
还有一个,把ETHREAD里某个成员的数值改乱也能达到同样的效果。。。

具体哪个不记得了,群里NPX说的。。。 ...

线程有 一个ETHREAD->CrossThreadFlags值 该0 就不可以附加了,
主要 今天发现这个再网上 没有发现有介绍过的

Yecate 发表于 2015-5-2 22:02:59

看看什么猥琐的方法

陌路人 发表于 2015-5-3 16:01:03

Tesla.Angela 发表于 2015-5-2 15:20
还有一个,把ETHREAD里某个成员的数值改乱也能达到同样的效果。。。

具体哪个不记得了,群里NPX说的。。。 ...

哥 , 把帖子删了把   ,o(︶︿︶)o 唉

upring 发表于 2015-5-4 09:08:53

明天进步一点点

kz丶cn 发表于 2015-8-5 21:37:23

第一个Flags2-> ProtectedProcess 为1 OD还是附加成功了 我是用windbg改的 平台是 win7 x64
第一种方法测试无用

kz丶cn 发表于 2015-8-5 21:37:57

还有NoDebugInherit 附加后 没有变化...

kz丶cn 发表于 2015-8-5 21:57:59

好吧 只是只有记事本才有效果 其它程序位数不同 比如calc.exe 标志位不同 calc.exe的前12个为1
这时候设置把第13位设置成1 有能附加...不知什么问题

kz丶cn 发表于 2015-8-5 22:25:52

好吧!不是哪个程序的问题,有时候打开_eprocess 时 打开后的标志位不同
比如这次...这样如果把那个标志位改了没有效果 我尝试直接对地址写d800 也就是不出现上述标志位情况时显示的值(默认是d000,第13位为1后为d800)
还是能附加 不知什么原因...

落笔飞花 发表于 2015-10-3 09:55:58

线程的 那个东西是因为 调试流程中会用到= = 乱改 就发送不了调试消息了并且会设置dbgport为0
页: [1]
查看完整版本: 反调试的几种方法