我编写了一个简单的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
}
#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
评论
您不应该在DllMain中创建线程,建议不要使用blogs.msdn.microsoft.com/oldnewthing/20070904-00/?p=25283 blogs.msdn.microsoft.com/oldnewthing/20040127-00/?p=40873