【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
有这样一些场景,我们需要监控一些进程是否运行,内存数据是否正确。但是,与此同时,原来的程序不能被修改,或者无法修改,但是我们希望做一些监控操作。这个时候,就需要写一个内存监控程序了。今天,正好在网上看到类似的一篇文章,链接地址在这。主要用到了这么几个API,即
1、获取窗口句柄
FindWindowW
2、根据窗口句柄获取进程id信息
GetWindowThreadProcessId
3、根据进程id获取进程句柄
OpenProcess
4、读取进程中的内存数据
ReadProcessMemory
5、数据写入到对应的进程空间
WriteProcessMemory
其实不管什么进程,对于操作系统来说都是一样的。所以,一个进程如果想看另外一个进程的数据,从技术上来说没有什么难度。虽然不同程序的user space都差不多,只是tlb不同,但是只要os api支持,就没有什么问题。在实际开发中,我们发现可以通过gdb去调试和操作另外一个程序,原理和这个也差不多。
如果需要将某一个调试dll嵌入(有时候也叫注入)到别人的程序中,可以参考这个链接,主要的基本流程也是OpenProcess (打开插入进程)-> VirtualAllocEx(注意是其他process的句柄) -> WriteProcessMemory(同样是其他process的句柄) -> GetProcAddress(获取LoadLibraryW的地址) -> CreateRemoteThread (要求另外的process启动一个thread,主要功能就是用LoadLibraryW加载这个dll)-> WaitForSingleObject(等待线程结束) -> VirtualFreeEx (释放内存)-> CloseHandle(释放remote thread句柄) -> CloseHandle(释放进程句柄)。最关键的部分就是CreateRemoteThread 这个函数。
PS:
链接的这篇文章本来是做游戏辅助的。主要方法是通过游戏操作,在CheatEngine上面找到对应数值的地址,接着通过OD反汇编进一步确认原来可执行程序的基础地址(因为有可能不是静态地址,而是动态地址),而辅助程序就是通过定时检测操作来修改对应内存的数值,提升游戏体验。按照目前的法律,这种修改程序的行为是不合法的,希望大家还是用在正道上面。类似的程序还有伪装木马什么的,看看就好,不要乱用。