当我用dll注入读/写内存时进程崩溃

时间:2013-12-19 20:45:55

标签: c++ dll hook dll-injection

我写了一个hackme程序,我想挂钩它并使用暴力破解它(使用dll注入)。 问题是当我试图写入或读取内存时,进程崩溃(它不仅发生在hackme程序中,而且发生在每个程序中),尽管我使用VirtualProtect编写和阅读权限。

  • 如果我将消息框添加到dll,则消息框可以正常工作。

这里是应该阻止进程打印某些内容的dll(使用NOPing):

#include "DLL.h"
#include <windows.h>
#include <tlhelp32.h>

BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    switch (reason)
    {
        case DLL_PROCESS_ATTACH:
            DWORD threadId;
            CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadProc, NULL, 0, &threadId);
            break;

        case DLL_PROCESS_DETACH:
            break;

        case DLL_THREAD_ATTACH:
            break;

        case DLL_THREAD_DETACH:
            break;
    }
    return true;
}

DWORD ThreadProc(LPVOID lpdwThreadParam)
{
    VirtualProtect((LPVOID)0x00417D10, 5, PAGE_EXECUTE_READWRITE, NULL);
    *(char *)0x00417D10 = 0x90;
    *(char *)0x00417D11 = 0x90;
    *(char *)0x00417D12 = 0x90;
    *(char *)0x00417D13 = 0x90;
    *(char *)0x00417D14 = 0x90;
    return 0;
}

这里是关于我正在编写的流程中的地址的信息: http://prntscr.com/2bveja(与IDA合作)

dll,注入器和hackme编译为32位。 我正在使用win7 64b。

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. VirtualProtect无法在最后一个参数(旧权限)中收到NULL。 因此我给它指向DWORD变量。

  2. 我给了VirtualProtect一个永久地址,但它并不好,因为在Windows 7中,图像库每次执行都会改变,所以我找到了过程图像库并添加了偏移量{{ 1}}。

  3. 0x12d1