c++如何找到进程中的输出表内存地址(OD的bp)

c++如何找到进程中的输出表内存地址(OD的bp),第1张

bp send

从PE文件的导出表里查询的吧。win32API GetProcAddress专门用来做这个,参数是模块名和函数名,这样可以获取到给定模块指定函数名的导出函数地址。

这个函数实质就是通过搜索内存中PE文件的导出表来实现的,所以非导出函数无能为力。

有兴趣可以去看PE结构,顺带去MSDN上看看相关API的说明,GetModuleHandle,GetProcAddress之类的。

电脑上的pe是;

Windows PE是一个设计用于为 Windows 安装准备的计算机最小 *** 作系统。它可以用于启动无 *** 作系统的计算机、对硬盘驱动器分区和格式化、复制磁盘映像以及从网络共享启动 Windows 安装程序。 利用Windows PE创建、删除、格式化和管理NTFS文件系统分区 ,  win pe

WinPE是简化版的Windows XP或Windows Server 2003,一般的说来WindowsPE用来安装系统,分区用的比较多。

把PE理解成一个:直接光盘运行的、功能强大的、精简版XP系统 Windows PE的全称是Windows Preinstallation Environment,即Microsoft Windows 预安装环境,是一个基于保护模式下运行的Windows XP Professional的工具,只拥有较少(但是非常核心)服务的Win32子系统。这些服务为Windows安装、实现网络共享、自动底层处理进程和实现硬件验证。特点是在光盘里,你可以随心的删除东西(大多数),包括你的系统,你就是把C盘格式化了都可以

CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建系统进程列表快照,返回一个快照的句柄。不懂快照、句柄是什么意思的话自己百度,简单的理解的话快照类似于数据库中的视图,而句柄就是一个无符号整数,相当于一个ID。

pedwSize=sizeof(PROCESSENTRY32); //这一句就是显式地指明PROCESSENTRY32结构体的大小,看似有些多余,但是MSDN上说不能省略,我自己测试的时候省略也会出错。

if(!Process32First(hSnapshot,&pe)) return 0; //这一句调用Process32First开始遍历快照中的进程列表,把进程的信息拷贝到pe这个数据结构中。如果失败返回FALSE,也就不需要执行后续的Process32Next遍历整个列表了。这个函数跟Process32Next配合可以逐个遍历进程列表,Process32Next参数跟Process32First一样,也同样失败返回FALSE,成功就会一个接一个逐个地把进程列表中快照中的进程的信息拷贝到pe这个数据结构中。值得一提的是,正是由于采用的是进程快照的方式获取进程的信息,所以如果在这个过程中某个或某些进程被其他程序关闭或者自己结束,或者进程队列中加入了新的进程,hSnapShot指向的快照中不会反映这个变化。SnapShot就好比给人拍张照,记录的只是一个人瞬间的样貌,但是从哲学上讲事物都是运动的,无法代表这个人的现状,同样这里的进程快照能够反映的也只是创建快照时系统的进程队列中全部进程的状况。使用快照的好处是什么呢?就是不需要在后面的获取进程的信息时每次都重新反复地获取系统中的进程的列表,而是以快照的方式存储起来,所以速度比较快,也利于保护数据。缺点就是没有实时性。但是一般情况下快照就够用了。

if(strcmp(peszExeFile,name)==0) //这个很好理解,就是比较peszExeFile和name是否一样,具体的比较方法是比较两者的ASCII码的差值,不懂ASCII码和strcmp的话自己百度,不解释。

id=peth32ProcessID;

return id;

这两句放在一起看作用就是返回进程的PID,就是CMD TASKLIST中看到的那个PID,是用来唯一标识进程的ID。后续的OpenProcess访问进程的 *** 作需要的就是这个ID。你用OpenProcess可以得到进程的句柄hProcess,然后调用TerminateProcess hProcess,0就能够强制结束一般的进程了。

中间的CloseHandle(hSnapshot); //这一句可以理解为垃圾回收,作用就是释放掉用CreateToolhelp32Snapshot创建的快照句柄标识的内存空间。

另外,楼下那位朋友说的很对,你的代码无法做到不区分大小写的比较进程名称。所以最好自己添加个处理过程统一下大小写。我给个不用CString的实现方法,仅供参考:

其实就是自己先编写个全部转换为大写的函数然后再比较。

//内联函数,用来返回空字符串。

inline char DefReturn()

{

char ret = new char[1];

ret[0] = '\0';

return ret;

}

char UCase(char chOri)

{

if(chOri == NULL) return DefReturn();

size_t nLen = strlen(chOri);

if(nLen)

{

char chRet = new char[nLen+1];

for(size_t index = 0; index<nLen; index++)

{

chRet[index] = toupper(chOri[index]);

}

chRet[index] = '\0';

return chRet;

}

else

{

return chOri;

}

}

//全部转化内大写后开始比较

if(strcmp(UCase(peszExeFile),UCase(name))==0)

{

id=peth32ProcessID;

break;

}

以上就是关于c++如何找到进程中的输出表内存地址(OD的bp)全部的内容,包括:c++如何找到进程中的输出表内存地址(OD的bp)、电脑上的PE是什么意思、VC++ 判断进程是否存在的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9557476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存