Image File Execution Options说熟悉又陌生年来大家谈起映像劫持都是它Debugger键值问题实现IFEO劫持只是在注册表写个键而已轻松到没技术含量然而系统到底是如何识别呢或者说系统这个功能是如何使它自己走入圈套呢?
早前给电脑报写了篇简单谈IFEO文章当时托大家找了些资料TK翻到MSDN里相关描述明确指出“当父进程不是作用子进程调试器时CreateProcess在其用户态部分检测Image File Execution Options项”当时就想在文章最后说下这点以及为什么那些系统关键进程是不会被IFEO影响但是来自己当时太菜根本不懂得去看CreateProcess代码来调试所以也自己确认不了同时那篇文章也是给般用户看无谓说些让他们坠入迷雾东西所以就作罢了
而最近这两 3天里由于前篇blog里提到看shellcodexor加密代码激励突然对汇编逆向调试感兴趣了于是整天盯着OD看反汇编代码今天又遇到个求助者他不慎将D盘在资源管理器下隐藏了于是教他从组策略里改回来最后随口说了句“系统应该是在FindFirstFile和FindNextFile用户态部分检查这个键值以隐藏驱动器吧不至于到NATIVE API甚至进ring0时才检测就像CreateProcess在用户态检测IFEO样”
于是突然有想法何不确认下?
自己写个小buttononclick里就简单地CreateProcess
打开注册表编辑器将SREngPS.exe给IFEO劫持到cmd.exe
OD载入运行忽略所有异常开工
先看了CreateProcessA、WinExec、ShellExecuteA这几个果然全都是内部了CreateProcessInternalA来完成而后者又了其UNICODE版本即CreateProcessInternalW来完成实际工作
在CreateProcessInternalW出口处下断断到了路跟下去这次重点在于找出“系统判断父进程是否为子进程调试器是则检测IFEO项”相应代码
也就是说要找到系统对dwCreationFlags进行检测并决定是否进入IFEO检测代码
父进程成为子进程调试器dwCreationFlags参数有两个:
DEBUG_PROCESS = 1;
DEBUG_ONLY_THIS_PROCESS = 2;
找了半天这要做步骤还真不是般多NATIVE API创建进程对象顺序就不仔细看了留待以后吧现在重点不是这些最后终于柳暗花明:
用断点红色标示这两句其中 ptr [ebp+20]正是传入dwCreationFlags和3进行test如dwCreationFlags中包含1或2则结果非零(ZF=0)这时就跳走绕过下面检测
这里我们用了0参数所以当F8到jnz时候会发现提示窗口写着“跳转未实现”
而下面这个检测就是跳到ntdll.dll导出LdrQueryImageFileExecutionOptions中了看看它是如何检测:
进入那个call中又是冗长大堆看得头痛拣其中些:
IFEO项地址IFEO路径所为串常量保存在ntdll.dll中
进行完这两个movesi中是指向SREngPS.exe全路径地址注意这时已经是UNC标准UNICODE(前面有\??\)
循环eax值指向全路径地址末尾每次向前推进直到找到"\"再跳出循环到最后这行
跳出循环到最后这行时eax保存便是指向相对路径("SREngPS.exe“)开头地址而[ebp-2d4]里则是前面文件
最新评论