作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个相当直接的目标(它很简单,因为它只是一个测试),将 DLL 注入(inject) hello_world 以更改它打印的内容,但不修改 hello_world.exe 来提供帮助。目的是让我学习如何将与 hello_world 不同的源代码与更大的应用程序相似。
我有一个创建 hello_world.exe 进程的 test.exe,并使用远程线程加载 hello_world.exe 中的 dll 库。所以现在的问题是如何处理 dll...这是 dll 和 hello_world 的来源。我在 hello_world 中有一个 Sleep(1000),这样 dll 在它被打印之前有时间更改值......但除此之外,目标是更改“str”而不更改 hello_world 源中的任何内容,只是动态链接库。
动态链接库:
#include <cstdio>
#include <windows.h>
void main(){
//this should be where i somehow get the "str" pointer from hello_world and change it
}
BOOL DllMain(HINSTANCE hInst,DWORD reason,LPVOID lpvReserved){
switch(reason){
case DLL_PROCESS_ATTACH:
main();
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Hello World :
#include <cstdio>
#include <windows.h>
char str[] = "Hello, world";
int main(){
Sleep(1000);
printf("%s\n",str);
return 0;
}
感谢所有回复的人。
最佳答案
幸运的是你不能那样做......即使Win32 DLLs are mapped into the address space of the calling process
char str[] = "Hello, world";
将被编译器标记为由加载程序加载到只读 内存区域,然后“即使”如果您设法获得指向字符串的指针,它也不会帮助您更改其内容。
关于c++ - 获取另一个进程中变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455200/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!