使用 DLL 注入和 OllyDbg 修补字符串

逆向工程 ollydbg C++ 记忆 dll注入
2021-06-27 03:09:18

说到 RE,我是新手,但我正在努力学习。我有 C/C++ 背景,所以做开发方面的事情应该是轻而易举的(除了必须使用汇编的时候,我在那里生锈了)。我只需要为 RE 事物指明正确的方向,并且能够从那里开始学习。

我使用 OllyDbg 编写了一个简单的 CLI 程序 (HackMe.exe) 来练习 RE。它只有一个字符串(“改变我”),我试图通过一个 DLL 改变(补丁?)。

这是 CLI prog 源

#include <iostream>
#include <string>
#include <Windows.h>

int main(int argc, char** argv) {
    char* change_me = "change me";

    while(true) {
        std::cout << change_me << std::endl;
        Sleep(3000);
    }

    return 0;
}

以及到目前为止的 DLL 源代码

#include <Windows.h>
#include <fstream>
#include <iostream>

VOID attach();

BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {

    switch(reason) {
        case DLL_PROCESS_ATTACH: {
            CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&attach, 0, 0, 0);
            break;
        }
    }

    return TRUE;
}

VOID attach() {
    // patching code will go here
}

到目前为止我所做的是

  • 将 OllyDbg 附加到运行 HackMe.exe 进程
  • 搜索所有引用的文本字符串并遵循“更改我”字符串

沿着绳子把我带到发现绳子的地方

在此处输入图片说明

因此,如果我错了或不包括某些内容,请纠正我,但我相信我需要

  • 找到进程的基地址和字符串地址的偏移量
  • 用一个新的字符串修补 base + offset 处的内存,即 len is == 到原始字符串

所以我想我的问题是

  1. 我如何找到进程的基本偏移量(我假设我可以使用 GetModuleHandle("HackMe.exe") 之类的东西在 DLL 中做)?
  2. 有没有办法在 OllyDbg 中查看基址偏移量(我认为这不是很有用,因为每次运行 exe 时基址很可能会发生变化)?
  3. 如何从基数找到字符串的 + 偏移量?

工作最终结果

#include <Windows.h>

VOID attach();

BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) {

    switch(reason) {
        case DLL_PROCESS_ATTACH: {
            attach();
            break;
        }
    }

    return TRUE;
}

VOID attach() {

    DWORD old;
    DWORD base   = (DWORD)GetModuleHandle(NULL);
    DWORD offset = 0x01CC80;

    char* ptr = reinterpret_cast<char*>(base + offset);
    const size_t length   = 10;
    char buffer[ length ] = "changed:)";

    VirtualProtect(ptr, length, PAGE_EXECUTE_READWRITE, &old);
    memcpy(ptr, buffer, length);
    VirtualProtect(ptr, length, old, nullptr);
}
1个回答
  1. 我如何找到进程的基本偏移量(我假设我可以使用 GetModuleHandle("HackMe.exe") 之类的东西在 DLL 中做)?

进程没有基础偏移量;我相信你的意思是主模块的基地址。要获取该地址,您可以使用GetModuleHandle(NULL).

  1. 有没有办法在 OllyDbg 中查看基址偏移量(我认为这不是很有用,因为每次运行 exe 时基址很可能会发生变化)?

Alt+E将显示每个加载模块的基址。

  1. 如何从基数找到字符串的 + 偏移量?

有无数种方法可以做到这一点,但一个简单的方法是使用 IDA 或BinText 之类的工具来查找字符串的虚拟地址,然后从中减去 HackMe.exe 的默认基址。