|
本帖最后由 陌路人 于 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 了 表示 进程有调试器 附加了
|
|