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]。

    评论

报告相同问题?

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行