40.x86游戏实战-找出XXX遍历周围的类型

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:39.x86游戏实战-c++代码遍历周围

上一个内容把附近的东西给遍历了出来,里面有怪物有附近建筑物有我们玩家角色,然后怪物肯定都是一个类型、角色肯定是一个类型、建筑物是一个类型,正常来说怪物、建筑物、角色会在某个偏移上的数据不同,然后怪物与怪物在某个偏移上相同,现在找的东西的特点就是怪物与怪物相同,怪物与建筑物、玩家角色不同的数据,然后找类型的方式,把怪物对象(对象指的是基址)、人物对象、附近建筑物对象从偏移0到偏移100、500的复制到文本文档中,详情看下方操作

首先写下图红框里的内容,把各种对象打印出来

写完上图红框的内容重新生成,然后以管理员打开OD并附加到游戏,然后以管理员打开Dbgview.exe,然后以管理员打开wctool.exe并注入刚刚重新生成玩的dll

然后 Dbgview.exe记得设置过滤关键字

然后遍历出了对象(地址)

然后记住下图红框的地址也就是0xCC91C00,然后来到OD

然后在OD跳转过去,如下图

然后从0一直选中到0x500多,然后复制,选中的方式首先鼠标点击偏移0位置的数据,然后往下滑到0x500偏移左右,然后按着键盘上的shift键,然后鼠标单击偏移0x500位置就可以选中了

然后粘贴到文本文档中

然后根据上方的步骤再找两个怪物的,在找我们玩家角色的,然后如下图红框,发现偏移0x90位置建筑物是0x21,怪物是0x211,玩家角色是0x111,这样就找出了类型

上方类型在对象的第一层,而有些游戏这种数据并不在第一层,然后还有些游戏偏移0x500并找不到类型,这怎么办?如果0x500找不到类型那就扩展到0x1000、0x2000这么大的一个范围还找不到,在去下一层找,下一层找的意思是,看下图红框,这些都是内存地址,找下一层也就是挨个取它们的值,把它们的值当做偏移0然后再从偏移0到偏移0x500、0x1000、0x2000这样挨个对比

找下一层也就是再写一个循环,如下图红框,如找下一层的下一层还是

找下一层的下一层,就写如下图红框的代码,下一层的下一层的下一层也是同理,继续往里添加for(循环)

MyStrust.cpp文件的修改:修改了 FindMaster函数

#include "pch.h"
#include "MyStrust.h"void MyStrust::InitMy()
{//  [[0x1AB7CDC]+0x258] 名字/**这个符号表示地址,在c++中被称为指针或指针类型int表示4字节数字int*就表示指针类型的int(int*)0x1AB7CDC;这样表示0x1AB7CDC地址里的内容是4字节的数字*/int* address = (int*)0x1AB7CDC;/*取出地址中的值,也就是取出0x1AB7CDC里的内容*address这样在左边只写一个*表示取内存地址里的值也就是取address它的值,address是0x1AB7CDC,也就是取0x1AB7CDC它的值*/int addressValue = *address;/*(*(int*)addressValue)意思是把addressValue转成int*,也就是把addressValue的值当成内存地址,addressValue的值现在是[0x1AB7CDC]+0x258这个现在这个地址里面的值是名字的地址,所以在左边加了一个*让把名字的地址去除了出来取出来之后就得到了名字,名字是UNICODE类型,UNICODE又被称为宽字节,宽字节的数据是用两个字节描述一个文字或字母在c++里wchar_t类型就是UNICODE然后在c++中名字这种数据被称为字符串,如果要用字符串必须用指针类型也就是wchar_t*右边加上*让wchar_t变成指针类型的wchar_t,才能在c++中使用字符串*/this->My.Name = (wchar_t*)(*(int*)(addressValue+0x258));// 一般函数名后面是W就表示有UNICODE,也就是要用宽字节// OutputDebugStringW(this->My.Name);// L""这两个"之间表示字符串,L""表示这个字符串是宽字节(使用Unicode编码)call_logW(L"人物姓名=%ws,测试=%ws", this->My.Name,L" 52am");//  [[0x1AB7CDC]+0x18C]x坐标//  [[0x1AB7CDC]+0x190]y坐标/*取出地址中的值,也就是取出0x1AB7CDC里的内容*address这样在左边只写一个*表示取内存地址里的值也就是取address它的值,address是0x1AB7CDC,也就是取0x1AB7CDC它的值*/this->My.X= *(float*)(addressValue + 0x18C);this->My.Y = *(float*)(addressValue + 0x190);char buf[256] = { 0 };// 拼接文字,%f表示拼接一个小数(单浮点数)sprintf(buf, "x=%f;y=%f", this->My.X, this->My.Y);OutputDebugStringA(buf);// [[0x1AB7CDC]+0x36A0]血量this->My.Blood = *(int*)(addressValue + 0x36A0);// 拼接文字,%d表示拼接一个整数(32位的整数)sprintf(buf, "血量 = %d", this->My.Blood);OutputDebugStringA(buf);
}void MyStrust::UseObject(DWORD object)
{object += 3; // 背包物品序号/*try的作用如果__asm {pushadpush objectmov ecx, 0x1A5FB24 // 背包基址mov ecx, [ecx]mov eax, 0x7B9130 // 使用物品的函数地址call eaxpopad}这个代码运行过程中出现错误了,我不会让游戏崩溃,出现错误之后会执行catch (...) {OutputDebugStringA("MyStrust::UseObject error");}这个catch里面的代码,现在也就是执行OutputDebugStringA("MyStrust::UseObject error");这一行*/try { __asm {pushadpush objectmov ecx, 0x1A5FB24 // 背包基址mov ecx, [ecx]mov eax, 0x7B9130 // 使用物品的函数地址call eax popad}}catch (...) {OutputDebugStringA("MyStrust::UseObject error");}
}void MyStrust::ChangeBlooad(int v)
{try {__asm {pushadpush 0push 0push 0push vmov ecx, 0x1AB7CDC // 里面有我们玩家角色数据的基址mov ecx, [ecx]mov eax, 0x8174E0 // 修改血量的函数地址call eaxpopad}}catch (...) {OutputDebugStringA("MyStrust::ChangeBlooad error");}
}// 遍历怪物列表函数
void MyStrust::FindMaster()
{wchar_t* Tmp1;/* [[[[[0x1A5E258]+3*4+0xA8]+0x14]+0x88]+0x10]下方 ReadDword 函数通过 [[[[[0x1A5E258]+3*4+0xA8]+0x14]+0x88]+0x10] 这个取值算法得到附近列表(怪物列表)*/DWORD Tmp = ReadDword(ReadDword(ReadDword(ReadDword(ReadDword(0x1A5E258) + 0x3 * 4 + 0xA8) + 0x14) + 0x88) + 0x10);if (Tmp != 0) {// 如果是0说明没有找到怪物列表for (size_t i = 0; i < 100; i++)// 这里的100是随便写的{Tmp1 = (wchar_t*)ReadDword(ReadDword(Tmp + i * 4) + 0x258); // 0x258位置是名字if (Tmp1 == 0) {// 如果是0说明没有名字call_logW(L"wetool:NULL\n");}else {/*打印名字到 Dbgview.exe,其中 wetool这个是为了过滤 Dbgview.exe打印的一些跟我们不相关的日志*/ call_logW(L"wetool:%ws\n", Tmp1);}call_logW(L"wetool:第%d个对象:%x\n",i, ReadDword(Tmp + i * 4));}}else {call_loaA("wetool:Tmp error");}
}

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400498.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#】中IndexOf的用法

在 C# 中&#xff0c;IndexOf 方法是字符串和列表&#xff08;如 List<T>&#xff09;等数据结构中常用的方法&#xff0c;用于查找指定元素或子串首次出现的位置。以下是针对不同情况使用 IndexOf 的示例。 对于字符串 对于字符串类型&#xff0c;IndexOf 方法返回子字…

scanpy切换显示颜色总结

函数实现 import scanpy as sc adata sc.datasets.pbmc68k_reduced() print(adata) sc.pl.umap(adata,color["bulk_labels"])def change_show_color(adata,label,category_listNone,color_listNone):for i in range(len(color_list)):if(len(color_list[i])7):colo…

【人工智能】Transformers之Pipeline(九):物体检测(object-detection)

目录​​​​​​​ 一、引言 二、物体检测&#xff08;object-detection&#xff09; 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipel…

Chromium编译指南2024 - Android篇:前置要求(一)

1.引言 欢迎阅读《Chromium编译指南2024 - Android篇》。本指南旨在帮助开发者理解和掌握在Android平台上编译Chromium的全过程。Chromium是一个开源的浏览器项目&#xff0c;由Google主导开发&#xff0c;并为多个现代浏览器提供基础代码。Android作为全球使用最广泛的移动操…

[Meachines] [Medium] Magic SQLI+文件上传+跳关TRP00F权限提升+环境变量劫持权限提升

信息收集 IP AddressOpening Ports10.10.10.185TCP:22,80 $ nmap -p- 10.10.10.185 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 06:d4:89:bf:51:…

redis面试(九)锁重入和互斥

可重入 1&#xff09;如果一开始这个锁是没有的&#xff0c;第一次来加锁&#xff0c;这段lua脚本会如何执行&#xff1f; "if (redis.call(‘exists’, KEYS[1]) 0) then " "redis.call(‘hset’, KEYS[1], ARGV[2], 1); " "redis.call(‘pexpi…

[0CTF 2016]piapiapia1

打开题目 看到登录口 字符串绕过长度限制strlen($_POST[nickname]) > 10

C语言中的结构体和位移段

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;允许我们将不同类型的变量组合在一起&#xff0c;形成一个复合数据类型。结构体可以包含整型、浮点型、字符型等多种数据类型的成员。例如&#xff0c;我们可以定义一个表示人…

进程的退出函数及线程

函数wait (1)获取子进程退出状态 &#xff08;2&#xff09;回收资源销毁僵尸态子进程 #include <sys/types.h> #include <wait.h> int wait(int *status) 函数功能是&#xff1a;父进程一旦调用了wait就立即阻塞自己&#xff0c;由wait分析是否当前进程的某…

新160个crackme - 030-Acid Bytes.4

运行分析 需要破解Name和Serial PE分析 upx壳&#xff0c;32位 linux系统upx -d 脱壳 脱壳后发现是Delphi程序 静态分析&动态调试 ida搜索字符串&#xff0c;找到Your Name must be at least 6 Chars long !&#xff0c;双击进入 发现地址为红色&#xff0c;即函数未定义 选…

数据结构:顺序二叉树(堆)

目录 前言 一、堆的实现 1.1 头文件 1.2 堆的初始化及销毁 1.3 堆的插入 1.4 堆的删除 1.5 取堆顶数据和判空 前言 前面我们讲了二叉树有顺序结构和链式结构&#xff0c;今天就来讲一下顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间…

C:每日一题:二分查找

1、知识介绍&#xff1a; 1.1 概念&#xff1a; 二分查找是一种在有序数组中查找某一特定元素的搜索算法 1.2 基本思想&#xff1a; 每次将待查找的范围缩小一半&#xff0c;通过比较中间元素与目标元素的大小&#xff0c;来决定是在左半部分还是右半部分继续查找。 举个生…

servlet基础操作(get)

1&#xff0c;首先创建一个javaweb的项目 简历一般的java项目选中项目&#xff0c;双击shift出现搜索栏 找到这个框架&#xff0c;选择里面的javaweb&#xff0c;注意选择右侧版本显示为4.0的javaweb 之后部署Tomcat 我这里是本地&#xff0c;所以在本地选的是local 第一步实…

文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

期望薪资3k,面试官笑了但没说话

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

江科大/江协科技 STM32学习笔记P21

文章目录 ADC模数转换器ADC简介逐次逼近型ADCSTM32的ADCADC基本结构输入通道转换模式单次转换&#xff0c;非扫描模式连续转换&#xff0c;非扫描模式单次转换&#xff0c;扫描模式连续转换&#xff0c;扫描模式 触发控制数据对齐转换时间校准硬件电路电位器产生可调电压的电路…

DC-4靶机

扫描IP 端口扫描 目录扫描 访问80端口&#xff0c;发现一个登录界面 爆破密码 hydra -l admin -P rockyou.txt 192.168.254.153 http-post-form "/login.php:username^USER^&password^PASS^:Slogout" -F-l admin&#xff1a;指定用户名为 admin。 -P rockyou.t…

three.js 安装方法、基础简介、创建基础场景

threejs简介 Three.js是一个基于JavaScript编写的开源3D图形库&#xff0c;‌利用WebGL技术在网页上渲染3D图形。‌ 它提供了许多高级功能&#xff0c;‌如几何体、‌纹理、‌光照、‌阴影等&#xff0c;‌使得开发者能够快速创建复杂且逼真的3D场景。‌ threejs提供了丰富的功…

【Linux系列】known_hosts详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

通过Go示例理解函数式编程思维

一个孩子要尝试10次、20次才肯接受一种新的食物&#xff0c;我们接受一种新的范式&#xff0c;大概不会比这个简单。-- 郭晓刚 《函数式编程思维》译者 函数式编程(Functional Programming, 简称fp)是一种编程范式&#xff0c;与命令式编程(Imperative Programming)、面向对象编…