从CreateProcess获取PROCESS_INFORMATION

时间:2014-05-01 11:25:29

标签: c windows x86 inline-assembly detours

我试图从exe中获取CreateProcessW的PROCESS_INFORMATION 我正在做的是通过在一个nopping字节的位置放置一个jmp来挂钩调用 它对我的功能有所帮助 然后我回忆起CreateProcessW与它在exe中完成的方式相同 然后我试图捕获/记录数据
然后我回来继续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与创建的进程

不同
__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];
    }
}

1 个答案:

答案 0 :(得分:0)

我最终解决了这个问题

我所做的是我在ESP中找到了存储数据的位置

然后我创建了一个类来保存我需要的数据,将jmp放到我需要的位置 BYTE void[0xAddress];

然后我将数据移到我的班级 MOV pClass, ESP;

还有其他方法可以做到这一点 但这就是我可以解决的问题

感谢您的帮助