[分享]重映射User32.dll调用MessageBox对话框

[原创]重映射User32.dll调用MessageBox对话框
链接:https://bbs.pediy.com/thread-140456.htm

#include <windows.h>

DWORD ReGetProcAddress(HMODULE hModule, HMODULE hOldModule, LPCSTR lpProcName)
{
        DWORD MyApiAddr;
        DWORD ApiOffset;
        DWORD ReApiAddr;


        MyApiAddr = (DWORD)GetProcAddress(hOldModule, lpProcName);
        ApiOffset = MyApiAddr - (DWORD)hOldModule;
        ReApiAddr = (DWORD)hModule + ApiOffset;

        return (ReApiAddr);
}

HMODULE RemapLibrary(LPCSTR lpModuleName)
{
        HMODULE hMod;
        DWORD ImageSize;
        BYTE* Virtual;
        PIMAGE_DOS_HEADER DosHeader;
        PIMAGE_NT_HEADERS NtHeader;

        hMod = GetModuleHandleA(lpModuleName);
        if(!hMod)
        {
                return (0);
        }

        DosHeader = (PIMAGE_DOS_HEADER)hMod;
        NtHeader = (PIMAGE_NT_HEADERS)((DWORD)DosHeader + (DWORD)DosHeader->e_lfanew);
        ImageSize = (DWORD)NtHeader->OptionalHeader.SizeOfImage;

        Virtual = (BYTE*)VirtualAlloc(NULL, ImageSize, MEM_COMMIT, PAGE_READWRITE);
        if(!Virtual)
        {
                return (0);
        }

        VirtualLock(Virtual, ImageSize);

        memcpy(Virtual, (PBYTE)hMod, ImageSize);

        return ((HMODULE)Virtual);
}

typedef DWORD (WINAPI *MSGBOX)(HWND,LPSTR,LPSTR,UINT);

void main()
{
        HMODULE hOldMod, hNewMod;
        MSGBOX MyMessageBox;

        printf("开始动态加载User32.dll\n");

        hOldMod = LoadLibrary("user32.dll");

        printf("User32.dll加载成功!\n");

        printf("开始重新映射User32.dll\n");

        hNewMod = RemapLibrary("user32.dll");

        printf("User32.dll重新映射成功!\n按任意键继续...\n");

        getchar();

        printf("开始释放原User32.dll\n");

        FreeLibrary(hOldMod);

        printf("User32.dll释放成功!\n按任意键继续...\n");

        getchar();

        MyMessageBox = (MSGBOX)ReGetProcAddress(hNewMod, hOldMod, "MessageBoxA");

        MyMessageBox(NULL, "ReMapLibrary OK!", "Test", 0);

        printf("调用MessageBoxA成功!");

}:
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值