dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 21|回复: 0

[C/C++基础] 通过游戏学指针系列12

[复制链接]
  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 61 天

    [LV.6]常住居民II

    10

    主题

    466

    帖子

    1132

    积分

    技冠群雄

    Rank: 6Rank: 6

    积分
    1132

    发表于 2 小时前 | 显示全部楼层 |阅读模式
    程序人生
    课程方向: C/C++ 
    课程类型: 汇编/嵌入式/物联网 

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 jacket 于 2025-8-14 12:03 编辑

    编码修改游戏人物名称(字符数组实战)
    一.确认游戏人物名称地址
    1.打开ce,将游戏名字输入进去得到游戏名字的地址
    2.od中使用db [游戏地址]+24此公式确定人物名称的地址的数据
    二.理解字符数组本质
    表示一个字符串
    char a[]={a,b,c,\0};
    char a[]=abc;
    三.理解指针与字符串本质
    char a[]=abc;
    char* p=a;
    四.字符串长度
    //获取角色名称的长度
    int GetStrLen(char* p)
    {
    int i=0;
    while(*p!=0)
    {
      i++;
      p++;
    }
    return i;
    }
    五.字符串复制

    六.字符串比较

    七.字符串连接
    八.综合,判断如果游戏中角色名称是azaz,则根据指定的名称(前缀和后缀)改变角色名称

    九.完整代码
    //获取人物血值地址
    void GetRolelnfo(byte* arrAddr,byte* queryBlood)
    {
    for(int i=0;i<16;i++)
    {
      if(memcmp(arrAddr+i+0,queryBlood,sizeof(queryBlood))==0)
      {
       DebugViewPrintf("血值的地址=%x",arrAddr+i);
      }
    }
    }

    //获取角色名称的长度
    int GetStrLen(char* p)
    {
    int i=0;
    while(*p!=0)
    {
      i++;
      p++;
    }
    return i;
    }


    //StrCopy(roleName,a)
    char* StrCopy(char* p1,char* p2)
    {
    char* start=p1;
    while(*p2!=0)
    {
      *p1=*p2;
      p2++;
      p1++;
    }
    *p1=0;
    return start;
    }

    void CWGForm::OnButton1()
    {

    int guizi[5]={17,3,47,8,12};
    int* p=(int*)&guizi[0];
    int i=0;
    for(i=0;i<5;i++)
    {
      DebugViewPrintf("%d个元素是:%d,%d个元素的地址是:%x",i,*(p+i),i,p+i);
    }

    HMODULE h=GetModuleHandle("GameClient.exe");
    int temp1=(int)h+0x5882EC;
    //[17B82EC]+0x726 这个里面的值就是当前血值
    int* roleBase=(int*)temp1;
    //当前血值的地址
    int* roleCurBlood=(int*)(*roleBase+0x726);
    //最大血值的地址
    int* roleMaxBlood=(int*)(*roleBase+0x726+8);
    //[17B82EC]+24 这个里面的值就是人物角色名称
    char* roleName=(char*)(*roleBase+0x24);
    DebugViewPrintf("temp1=%x,当前血值和最大血值是:%d,%d,角色名称:%s",temp1,*roleCurBlood,*roleMaxBlood,roleName);


    byte* arrAddr=(byte*)roleCurBlood;//int----DWORD   char    WORD

    byte queryBlood[]={0x1B,0x00,0x00,0x00};
    for(i=0;i<16;i++)
    {

    一个字节
      if(*(arrAddr+i+0)==0x00)
      {
       DebugViewPrintf("血值的地址=%x",arrAddr+i);
      }

    两个字节
      if((*(arrAddr+i+0)==0x00)&&(*(arrAddr+i+1)==0x00))
      {
       DebugViewPrintf("血值的地址=%x",arrAddr+i);
      }

    四个字节
      if((*(arrAddr+i+0)==0x00)&&(*(arrAddr+i+1)==0x00)&&(*(arrAddr+i+2)==0x00)&&(*(arrAddr+i+3)==0x00))
      {
       DebugViewPrintf("血值的地址=%x",arrAddr+i);
      }
      if(memcmp(arrAddr+i+0,queryBlood,sizeof(queryBlood))==0)//第三个表示要比较的内容的长度
      {
       DebugViewPrintf("血值的地址=%x",arrAddr+i);
      }
    }
    群号:1044504834,加群时请备注:“游戏逆向”。以便老师及时向您沟通
    温馨提示:
    1、本站所有内容均为互联网收集或网友分享或网络购买,本站不破解、不翻录任何视频!
    2、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意!
    3、本站资源仅供本站会员学习参考,不得传播及用于其他用途,学习完后请在24小时内自行删除.
    4、本站资源质量虽均经精心审查,但也难保万无一失,若发现资源有问题影响学习请一定及时点此进行问题反馈,我们会第一时间改正!
    5、若发现链接失效了请联系管理员,管理员会在2小时内修复
    6、如果有任何疑问,请加客服QQ:1300822626 2小时内回复你!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2025-8-14 14:56 , Processed in 0.101300 second(s), 11 queries , Redis On.

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表