打开dnf并不需要使用辅助软件,只需要启动根目录下start文件夹吓得dnfchinaexe即可,一般就不会出现楼主所出现“打开进程失败”的这类问题的。如果不能启动,建议你重新安装客户端即可,很有可能缺失什么文件导致的。
Module32First中MODULEENTRY32结构里modBaseAddr就是主程序模块的起始地址
最简单的方法是使用进程快照CreateToolhelp32Snapshot,列举所有的进程,然后枚举找到你所需要的进程,用Module32First获取其起始地址,然后用Module32Next获取下一个进程的基址也就是上一个进程的结束地址。
具体还是自己查一下MSDN,或者百度一下枚举所有进程的方法
关键的问题是你是需要DLL在目标进程中的基址,而且你自己的写的程序并没有加载那个DLL,所以你总是得到0,所以你需要把自己的程序注入到进程中,才能得到你所要的DLL在目标进程中的基地址。
DLL注入比较常用的方法是利用OpenProcess得到目标进程的句柄,然后利用CreateRemoteThread调用LoadLibrary函数,加载你自己的DLL,在这个DLL的DLLMain里面遍历所有的DLL找到你想要的。这个程序在网上很多,你自己Google就可以找得到了。
//创建目标进程模块快照
HANDLE md_Handle;
md_Handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProPID);
if (!md_Handle){
printf("CreateToolhelp32Snapshot failed \n");
return false;
}
MODULEENTRY32 md;
mddwSize = sizeof(md);
bool ex = Module32First(md_Handle, &md);
while (ex){
printf("sz module %s\n", mdszModule);
ex = Module32Next(md_Handle, &md);
}
这明显是dll里的一个基址。
简单说就是dll里的一个全局变量。但是要注意的一点是,dll里的模块基址可能会变的,这就导致了你说的情况。
这里,你可以计算出这个变量到模块基址的偏移,这个值是不会变的,再用它加这次打开游戏时coreclientdll的模块基址,就可以得到具体的地址。
写程序的话,你直接可以用Win32API得到模块加载时的基址。
另外说一句,看看汇编和OD吧。。。这么玩是玩不转的,局限性太大。
exe这个应该是模块基址,执行模块一般是0x0040 0000,8BBC1C是相对于进程空间的绝对地址。也就是8BBC1C这可能存放的是一个全局变量(或对象或结构体),这个变量映射在内存空间中的虚地址应为0x0040 0000 + 8BBC1C,你可以定位到这个内存地址值,然后根据上面的偏移找到存放血量的内存地址。
以上就是关于求dnf开挂打开进程失败无法自动获取基址 大神求解全部的内容,包括:求dnf开挂打开进程失败无法自动获取基址 大神求解、API怎么获取外部进程的起始内存地址、如果获取其它进程的DLL内存地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)