关于RE,我是一个新手,但我正在尝试进入。我有C / C ++的背景知识,因此在开发方面应该轻而易举(除了必须使用汇编的情况之外,在那里很生锈)。我只需要指出有关RE事物的正确方向,就能从那里拿起东西。

我编写了一个简单的CLI程序(HackMe.exe),使用OllyDbg来练习RE。它只有一个字符串(“ change me”),我正在尝试通过DLL更改(补丁?)。 />
到目前为止的DLL源是裸露的

#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;
}


到目前为止,我所做的是


将OllyDbg附加到运行HackMe.exe进程
搜索所有引用的文本字符串,然后跟随“更改我”字符串

跟随字符串将我带到找到该字符串的位置



因此,如果我输入错误或不包含某些内容,请纠正我,但我认为我需要


查找基地址的过程和到字符串地址的偏移量
用一个新的字符串len在len + =处修补基址+偏移量到原始
>

如何找到进程的基本偏移量(我假设我可以使用类似GetModuleHandle(“ HackMe.exe”)的东西在DLL中进行操作)?
是否可以在OllyDbg中查看基准偏移量(我想不是很有用,因为每次运行exe时基准都可能会改变)?是从字符串开始?

工作最终结果

#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
}


评论

您不应该在DllMain中创建线程,建议不要使用blogs.msdn.microsoft.com/oldnewthing/20070904-00/?p=25283 blogs.msdn.microsoft.com/oldnewthing/20040127-00/?p=40873

#1 楼



如何找到进程的基本偏移量(我假设我可以使用类似GetModuleHandle(“ HackMe.exe”)的东西在DLL中进行操作)?



进程没有基本偏移量;我相信您的意思是主要模块的基地址。要获得该地址,您可以使用GetModuleHandle(NULL)。每次运行exe
时都要更改)吗? >

如何从基数中找到字符串的+偏移量?一种方法是使用IDA或BinText之类的工具来查找字符串的虚拟地址,然后从中减去默认的HackMe.exe基址。

评论


std :: string change_me是不是原始字符串的堆栈/堆/副本?更改exe中的原始字符串就足够了吗?更改cout()输出的字符串?

– blabb
16-3-22在22:43

是的,我的意思是基地址。感谢您的回答。

–th3v0id
16-3-22在22:56