【发布时间】:2014-06-17 21:00:38
【问题描述】:
我正在尝试从 exe 中获取 CreateProcessW 的 PROCESS_INFORMATION。
我正在做的是通过在该位置放置一个 jmp 来挂断呼叫
它符合我的功能
然后我记得 CreateProcessW 的方式与它在 exe 中的完成方式相同
然后我试图捕捉/记录数据
然后我 jmp 回来继续 exe 中的东西
我的问题是它没有记录PROCESS_INFORMATION 正确的
ProcessId与创建进程的PID不一样
这是我挂钩的功能 http://i.stack.imgur.com/tFZRn.png
然后我放置 hook/jmp
DWORD CreateProcessMidHookAddress = (DWORD)GetModuleHandleA("MyDll.dll") + 0x16F46;
DWORD CreateProcessMidHookRet = (DWORD)GetModuleHandleA("MyDll.dll") + 0x16F56;
placeJMP((BYTE*)CreateProcessMidHookAddress, (DWORD)CreateProcessMidHook, 16); // JMP from loader.dll + 0x16F46 to my function
然后这是我的功能 它被称为创建进程 只是ProcessId和创建的进程不是同一个processId
__declspec(naked) void CreateProcessMidHook()
{
PROCESS_INFORMATION ProcessInformation;
__asm
{
PUSH EDX; // 52
PUSH EBP; // 55
PUSH 0; // 6A 00
PUSH 5; // 6A 05
PUSH 0; // 6A 00
PUSH 0; // 6A 00
PUSH 0; // 6A 00
PUSH ECX; // 51
PUSH ESI; // 56
CALL EAX; // FF D0 CALLS CreateProcessW
// think problem is here
MOV ProcessInformation, EDX;
PUSHAD;
PUSHFD;
}
// Log function is just like printf, logs to text file
Log("ProcessId : 0x%X \n", ProcessInformation.dwProcessId);
__asm
{
POPFD;
POPAD;
JMP[CreateProcessMidHookRet];
}
}
【问题讨论】:
-
CreateProcessW获取指向PROCESS_INFORMATION的指针。你需要找到这个指针(它是 CreateProcessW 的第 10 个参数,所以当你的钩子获得控制时应该在 [esp] 处)然后取消引用它。 -
我在 ollybdg 中查看它并认为我在
[ESP + 0x1C]找到了它,但我不知道如何将其复制到我的PROCESS_INFOMATION对象MOV ProcessInformation, [ESP + 0x1C];没有工作 -
我看不到 CreateProcessW 如何在 [esp+0x1c] 找到它的第 10 个参数。无论如何,它是一个指针。所以你要定义
PROCESS_INFORMATION* ppi;然后mov ppi, [esp+0xWhatever],然后log ppi->dwProcessId。 -
你不能使用
mov ppi, [esp+0x1C]得到错误error C2415:不正确的操作数类型 -
是的,对不起,你不能
mov内存到内存。您需要使用寄存器在两个 'mov' 中执行此操作。而且我强烈怀疑堆栈和第 10 个参数有问题:挂钩函数中有一个局部变量,如果它在堆栈上分配,它将阻止实际的“ProcessInformation”(由调用者提供)从被传递给CreateProcessW,不是吗?
标签: c windows x86 inline-assembly detours