weixin_43697323 2019-07-14 10:26 采纳率: 0%
浏览 172

C语言植物大站僵尸修改阳光地址地址失败

图片说明
#include“stdio.h”
#include”stdlib.h“
#include“windows.h”
int main()
{

HWND h1=FindWindow(NULL,L"植物大战僵尸中文版");

if(h1==0)
{
    printf("该游戏没有打开\n");
}
HANDLE hProcess;
DWORD pid;
GetWindowThreadProcessId(h1,&pid);
if (pid == 0)
{
    printf("获取游戏进程失败\n");
    printf("程序结束\n");
    return 0;
}
hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
if(hProcess==NULL)
{
    printf("打开进程失败\n");
    return 0;
}
int modifySunshine;
printf("输入修改阳光");
scanf_s("%d", &modifySunshine);
getchar();
SIZE_T Size;
WriteProcessMemory(hProcess,(LPVOID)"18OBEBD0", &modifySunshine, sizeof(DWORD),&Size);
CloseHandle(hProcess);  //关闭句柄

}

  • 写回答

1条回答 默认 最新

  • 程序老六 2022-06-30 23:32
    关注
       阳光值一般是放在堆空间,并不是一个静态地址,他是由程序创建后声明的,是一个动态值,但是可以被算出的。所以要找出阳光数据,就需要先找到数据偏移量和静态地址,这个就是考验学指针的知识
    

    ,至于怎么找,我一般都是用CE,找到偏移量要有汇编基础。
    一般不止一重指针,正常来说是一个静态指针变量的值指向另一个指针,另一个会有可能偏移一个固定的量,偏移后再指向其他指针,一直的指向然后偏移,最后找到阳光的地址。
    为什么会有这么多的指针呢?
    让我们模拟一下,我们在用C++开发植物大战僵尸,我会先写一个单例模式MainManager类,用来管理游戏所有的事务,然后再写一个关卡类,用来保存当前的当前关卡的状态 ,再创建一个用户当前信息类,存放一些选的植物、阳光值。
    我们创建了这么多类,如果我们在其他地方引用阳光值,就要从MainManager的单例对象开始逐步引0x1557=0什么会有这么多指针的原因。
    假如我算出了静态地址0x1557,偏移量[4,8,16]
    我会先ReadProcessMemory函数取出
    静态地址的值,也就是(1阶指针地址)-4,然后添加偏移量4就是1阶指针地址,然后再取出1阶指针的值就是(2阶指针地址)-8。如果我把中括号代表取出中括号内的值,那么阳光的数值就等于[[[[0x1557]+4]+8]+16]。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题