【问题标题】:Get PROCESS_INFORMATION from CreateProcess从 CreateProcess 获取 PROCESS_INFORMATION
【发布时间】: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


【解决方案1】:

我最终解决了这个问题

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

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

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

还有其他方法可以做到这一点 但这是我可以开始工作的方法

非常感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2014-01-28
    • 2017-04-28
    • 1970-01-01
    • 2013-02-07
    • 2012-01-21
    相关资源
    最近更新 更多