jacket 发表于 2025-8-14 12:02:32

通过游戏学指针系列12

本帖最后由 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={17,3,47,8,12}; int* p=(int*)&guizi; 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; //+0x726 这个里面的值就是当前血值 int* roleBase=(int*)temp1; //当前血值的地址 int* roleCurBlood=(int*)(*roleBase+0x726); //最大血值的地址 int* roleMaxBlood=(int*)(*roleBase+0x726+8); //+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]
查看完整版本: 通过游戏学指针系列12