c - 从 CreateProcess 获取 PROCESS_INFORMATION

标签 c windows x86 inline-assembly detours

我正在尝试从 exe 的 CreateProcessW 获取 PROCESS_INFORMATION。
我正在做的是通过在 nopping 字节的位置放置一个 jmp 来 Hook 调用 它跳转到我的功能 然后我记忆起 CreateProcessW,就像在 exe 中完成的一样
然后我试图捕捉/记录数据
然后我跳回去继续exe中的东西

我的问题是它没有正确记录 PROCESS_INFORMATION ProcessId 与创建进程的 PID 不同

这是我 Hook 的功能 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];
    }
}

最佳答案

我最终解决了这个问题

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

然后我制作了一个类来保存我需要的数据,并放置了一个 void 以跳转到我需要的位置 BYTE void[0xAddress];

然后我将数据移到我的类中 MOV pClass, ESP;

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

谢谢你的帮助

关于c - 从 CreateProcess 获取 PROCESS_INFORMATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406751/

相关文章:

c++ - winapi用鼠标点击事件在屏幕上显示图标

C++ 打开一个文件并写入文件的任意位置

c - 将x86代码从x64进程注入(inject)到x86进程中

linux x86 汇编语言 sys_read 调用的第一个参数应该为 0 (stdin)

assembly - 继续获取 e8 00 00 00 00 作为机器代码以在汇编中调用函数

c - 预处理器指令的语言与 C 的语法弱相关是什么意思?

c - 在循环内的动态数组中分配的运行时堆栈大小

c - 在c中使用exec*执行二进制文件

c - 寻找用于打印的轻量级文档描述语言

windows - 如何从批处理例程中输出特定行?