说到 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 == 到原始字符串
所以我想我的问题是
- 我如何找到进程的基本偏移量(我假设我可以使用 GetModuleHandle("HackMe.exe") 之类的东西在 DLL 中做)?
- 有没有办法在 OllyDbg 中查看基址偏移量(我认为这不是很有用,因为每次运行 exe 时基址很可能会发生变化)?
- 如何从基数找到字符串的 + 偏移量?
工作最终结果
#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);
}