反调试的几种方法
本帖最后由 陌路人 于 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 了表示 进程有调试器 附加了
{:soso_e179:},太猥琐了 还有一个,把ETHREAD里某个成员的数值改乱也能达到同样的效果。。。
具体哪个不记得了,群里NPX说的。。。
不过,确实有些DBG开头的变量,不在PG的检测范围之内。 多线程互相加密解密也挺麻烦的.. 学习了!! Tesla.Angela 发表于 2015-5-2 15:20
还有一个,把ETHREAD里某个成员的数值改乱也能达到同样的效果。。。
具体哪个不记得了,群里NPX说的。。。 ...
线程有 一个ETHREAD->CrossThreadFlags值 该0 就不可以附加了,
主要 今天发现这个再网上 没有发现有介绍过的 看看什么猥琐的方法
Tesla.Angela 发表于 2015-5-2 15:20
还有一个,把ETHREAD里某个成员的数值改乱也能达到同样的效果。。。
具体哪个不记得了,群里NPX说的。。。 ...
哥 , 把帖子删了把 ,o(︶︿︶)o 唉 明天进步一点点 第一个Flags2-> ProtectedProcess 为1 OD还是附加成功了 我是用windbg改的 平台是 win7 x64
第一种方法测试无用
还有NoDebugInherit 附加后 没有变化... 好吧 只是只有记事本才有效果 其它程序位数不同 比如calc.exe 标志位不同 calc.exe的前12个为1
这时候设置把第13位设置成1 有能附加...不知什么问题 好吧!不是哪个程序的问题,有时候打开_eprocess 时 打开后的标志位不同
比如这次...这样如果把那个标志位改了没有效果 我尝试直接对地址写d800 也就是不出现上述标志位情况时显示的值(默认是d000,第13位为1后为d800)
还是能附加 不知什么原因... 线程的 那个东西是因为 调试流程中会用到= = 乱改 就发送不了调试消息了并且会设置dbgport为0
页:
[1]