本文章函数介绍部分大量引用寻梦&之璐的一篇文章

FindWindow
GetWindowThreadProcessId
OpenProcess
ReadProcessMemory
WriteProcessMemory
具体代码实现

FindWindow

函数功能

函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串,这个函数不搜索子窗口。
第一个是要找的窗口的类,第二个是要找的窗口的标题。

函数声明

FindWindowW(_In_opt_ LPCWSTR lpClassName,_In_opt_ LPCWSTR lpWindowName);

在搜索的时候不一定两者都知道,但至少要知道其中的一个。

第一个参数

lpClassName,输入参数,指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。

第二个参数

如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。

返回值

如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。

如果函数执行失败,则返回值为NULL。可以通过调用GetLastError函数获得更加详细的错误信息。

GetWindowTreadProcessId

函数功能

该函数返回创建指定窗口线程的标识和创建窗口的进程的标识符,后一项是可选的。得到窗口句柄后我们可以通过GetWindowsTreadProcessId来获得窗口所属进程ID和线程ID,从而判断创建窗口的进程和线程。

  • 进程ID是系统内唯一标识,可以根据ID找到进程句柄
  • 根据线程ID可以找到线程句柄

函数声明

GetWindowThreadProcessId(_In_ HWND hWnd,_Out_opt_ LPDWORD lpdwProcessId
);

第一个参数

输入参数,hWnd,窗口句柄。

第二个参数

输出参数,lpdwProcessld,接收进程标识的32位值的地址。如果这个参数不为NULL,GetWindwThreadProcessld将进程标识拷贝到这个32位值中,否则不拷贝,输出参数是进程ID地址。

返回值

返回值为运行窗口的线程标识,返回的是窗口所属线程ID

OpenProcess

函数功能

根据进程ID打开对应进程,并返回进程的句柄。

函数声明

第一个参数

输入参数,dwDesiredAccess 想拥有的该进程访问权限。

PROCESS_ALL_ACCESS //所有能获得的权限
PROCESS_CREATE_PROCESS //需要创建一个进程
PROCESS_CREATE_THREAD //需要创建一个线程
PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION /获得某些信息的权限,如果获得
PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限
/
PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE//读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE //等待进程终止

第二个参数

输入参数,bInheritHandle表示所得到的进程句柄是否可以被继承

第三个参数

输入参数,dwProcessId被打开进程的PID

返回值

如果函数调用成功将返回一个进程句柄值,否则将返回NULL
注意:在使用完所获得的进程句柄后一定要调用==CloseHandle(handle)==来关闭进程的句柄。

ReadProcessMemory

函数功能

读取进程内存

函数声明

第二个参数就是基址,第三个参数用来存放基址的值,因为基值是固定的,但基址的值是不固定的,用这个值加上偏移就是一级偏移地址。

参数

hProcess
目标进程的句柄,该句柄必须对目标进程具有PROCESS_VM_READ 的访问权限。
lpBaseAddress
从目标进程中读取数据的起始地址。 在读取数据前,系统将先检验该地址的数据是否可读,如果不可读,函数将调用失败。
lpBuffer
用来接收数据的缓存区地址。
nSize
从目标进程读取数据的字节数。
lpNumberOfBytesRead
实际被读取数据大小的存放地址。如果被指定为NULL,那么将忽略此参数。
返回值
如果函数执行成功,返回值非零。
如果函数执行失败,返回值为零。

WriteProcessMemory

该函数与readProcessMemory的参数基本相同,只不过第三个参数lpBuffer为要写入进程的内容。

具体代码实现

#include<stdio.h>
#include<windows.h>
#include<stdbool.h>
int main(void) {HWND hwnd=FindWindow(NULL, L"植物大战僵尸中文版");//获取窗口句柄if (hwnd == NULL) {printf_s("获取窗口句柄失败");}printf_s("窗口句柄=%d   ",(int)hwnd);HWND ProcessID = NULL;GetWindowThreadProcessId(hwnd, &ProcessID);//获取进程ID,系统内进程唯一标识if (ProcessID == NULL) {printf_s("获取进程ID失败");}printf_s("ProcessID=%d   ", (int)ProcessID);HWND HProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);//根据进程ID获取进程访问权限和句柄if (HProcess == NULL) {printf_s("获取进程句柄失败");}int jizi = 0X006AA00C;//基址int jiziNuber = 0;//基址值int dwSize = 0;//保存实际读取字节大小ReadProcessMemory(HProcess, jizi, &jiziNuber, sizeof(int), dwSize);//读取基址,dwSize可以用NULL替代int firstSize = 0X768;//一级偏移int firstSizeNuber = 0;//一级偏移值ReadProcessMemory(HProcess, jiziNuber + firstSize, &firstSizeNuber, sizeof(int), dwSize);//一级偏移,dwSize可以用NULL替代int cecondSize = 0X5560;//二级偏移int cecondSizeNuber = 0;//二级偏移值ReadProcessMemory(HProcess, firstSizeNuber + cecondSize, &cecondSizeNuber, sizeof(int), dwSize);//二级偏移,dwSize可以用NULL替代printf("%d", cecondSizeNuber);int sunNuber;//保存新阳光值printf("输入新的阳光值\n");scanf_s("%d", &sunNuber);WriteProcessMemory(HProcess, (LPVOID)(firstSizeNuber + cecondSize), &sunNuber, sizeof(int), dwSize);//写入数值CloseHandle(HProcess);return 0;
}

C语言 植物大战僵尸修改阳光值 代码实现相关推荐

  1. ce逆向修改——植物大战僵尸针对“阳光值”

    ce逆向修改--植物大战僵尸 一.实验目的 为熟悉CE的使用和对软件逆向分析有进一步的了解. 二.实验设备 Cheat Engine 6.8.植物大战僵尸 三.实验内容 1.针对"阳光值&q ...

  2. vs c/c++ 用win32api写出植物大战僵尸的阳光值修改器

    一.工具如下: 1.植物大战僵尸1(直接下载逗游游戏盒可以直接下载,网上资源很乱) 2.vs2017(使用vs win32的接口) 3.cheat engine(附下载链接https://www.cr ...

  3. CE实战:植物大战僵尸修改阳光并制作辅助(小试牛刀)

    该教程为新手入门教程,大牛借过不要浪费时间 在学习CE基础篇内容时,我们一直是对CE提供给我们的Tutorial-i386.exe来完成练习的,是不是感觉没有啥意义呢,接下来的实战篇,将带领你把这些关 ...

  4. C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问题

    C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问 ...

  5. C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址

    C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问 ...

  6. C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现

    C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问 ...

  7. CE实战:修改植物大战僵尸中阳光数值

    CE实战:修改植物大战僵尸中阳光数值 游戏版本:植物大战僵尸中文版( PlantsVsZombies ) Cheat Engine 版本:Cheat Engine 7.0 一.打开游戏 二.打开CE并 ...

  8. c语言游戏call调用,C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)...

    C语言-植物大战僵尸-刷僵尸call:fps游戏CS-方框透视(矩阵+传统)前言:大家好,我是向上先生,嘿嘿~最近在学习逆向.反汇编等等,首先我在非常感谢52pojie这个平台,差不多很多学习资源都是 ...

  9. 汉化版植物大战僵尸修改器

    1,自己用c#调用api写了一个植物大战僵尸修改器: 2,可以修改阳光值,金钱,花肥,杀虫剂,树肥,巧克力等属性: 3,自动拾取(冒险模式有效),无等待建造: 4,可以选择不同模式的跳关: 5,僵尸游 ...

  10. VB版 植物大战僵尸修改器

    植物大战僵尸这个小游戏做的还真不错,我看到了几个版本的植物大战僵尸修改器,如C++版,C#版,所以就改写了一个VB版本的,以下是源码 '界面中有两个按钮,分别是cmdSunUnlimited(capt ...

最新文章

  1. 只有这种AI芯片才能拯救人工智能?
  2. vue axios拦截器的封装
  3. linux中系统调用和库函数的区别
  4. break和continue特殊玩法“标签”
  5. .NET Core 控制台应用程序使用异步(Async)Main方法
  6. HTML5本地存储之Web Storage篇
  7. scp带密码后台传输
  8. python修改python unittest的运行顺序
  9. linux运维、架构之路-Kubernetes本地镜像仓库+dashboard部署
  10. android 大牛播放组件,大牛直播Android播放端SDK说明
  11. python教程 马哥_python教程马哥
  12. 诺基亚、罗永浩,中国手机2014八大关键词
  13. LVGL|lvgl中文教程手册(lvgl中文文档学习教程)
  14. python plot画图另存jpg_Python Plot+Bokeh画图并保存为图片或网页
  15. 动态规划:走楼梯问题——01
  16. 诛仙服务器技能修改,诛仙玩家浅析诛仙3技能修改所带来的轰动
  17. 【简单详细】为Unity游戏制作开场动画video,新手必看
  18. 微信公众号的纯文本链接设置
  19. 【数据库】多表查询二----嵌套查询(子查询)
  20. PostgreSQL全局替换字符串函数

热门文章

  1. 高德地图点击不同的标记,动态传入参数创建信息窗体
  2. npm -i 与npm install -s与-d的区别
  3. 未能加载文件或程序集“FastReport
  4. linux永久挂载nas存储,Linux下自动挂载NAS
  5. 合肥工业大学计算机保研,合肥工大(合肥工业大学保研去向)
  6. 手把手教你搭建一个OPCDA/UA服务器
  7. echart 自适应屏幕大小
  8. 阿里云ECS云服务器实例重置-更换操作系统
  9. windows media player 服务器运行失败
  10. 想搞 AI,没导师指导、没 GPU ,怎么搞?好主意分享