12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 234|回复: 0

C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)

[复制链接]

345

主题

345

帖子

700

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
700
发表于 2021-7-18 18:41:35 | 显示全部楼层 |阅读模式
C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)前言:家好,我是向上先生,嘿嘿~最近在学习逆向、反汇编等等,首先我在非常感谢52pojie这个平台,差不多很多学习资源都是在这个平台得到的,也学到了非常多的知识;才申请会员通过,这是第一篇帖子。


一、植物大战僵尸辅助(远程线程注入)
主要讲解一个刷僵尸call,其他的功能自行学习,不懂的联批评后解答,首先通过CE和OD分析,通过搜索场上僵尸数目,作为突破口


我们来到OD通过CTRL+G来到41de07这里,首先我们分析一下,刷僵尸这个call应该需要哪些参数,应该会有刷在那里,刷什么僵尸,大概不会有参数,直接在call里通过代码随机生成等等情况;然后下断点,找到上一层调用的地方,观察堆栈变化根据返回地点找到调用的call;






由于栈是先进后出,调用关系就是由上到下,我们找的时候就应该由上往下跟随











将原来的eax==1 esi == 0  改为 eax == 2  esi == 1,后面又来了两次改为eax == 2  esi == 3,得出eax为行数,esi为范例




接下来就简单了,我们需要edi的值,去CE中直接直接搜索edi的值,下访问断点是要保证od必须脱钩,否则不可以。结果edi的值为 [[6a9ec0 ]+ 0x768]。


代码讲解:
1、dll代码:
DWORD WINAPI readCount(LPVOIDlParam)是本身dll里创建线程的回调函数
BOOL APIENTRY DllMain(HANDLE hModule,,DWORD ul_reason_for_call,,LPVOID lpReserved) 是Dll的入口





功能代码讲解:
getProcessHandleByName(char* name);根据进程名获取PID

injectDll(HANDDLE handle,char* key,int address);通过远程线程注入Dll


莳植无CD线程函数

刷僵尸功能

主函数,入口



Dll完整代码:dll.txt(编译后会得到一个TestDll.dll)
功能控制完整代码:功能.txt
测试代码结果如图:


二、fps游戏 CS方框透视原理(矩阵+传统坐标转换)
我接纳的是GDI窗口绘制,需要干的事就是创建一个窗口,这个窗口透明而且具有穿透效果和置于顶层等特点。然后就是根据仇人和本身坐标点绘制方框。


第一种方式:传统型转换坐标原理:

CE搜索本身和仇人坐标标的基址,我喜欢找z坐标,然后x、y坐标就是z坐标地点 -8、-4;x、y、z坐标不会东一个西一个,由于在3d游戏中坐标都是通过向量Vector3存储,我们找的很多都是游戏引擎规定好了的东西。就不带着大家去找了,给大家说一下方法就行了,把握方法;
本身坐标:
CE搜索方法:通过搜索z坐标,CE选择未知的初始值,改变Z坐标,然后改变了或者增长了或者减少了,不动时未改变不断过滤;说的迷迷糊糊~~哈哈
本身坐标基址:0x223d24d4
Z坐标:+ 0x350
X坐标:+ 0x348
Y坐标:+ 0x34c


仇人坐标:
CE搜索方法:通过本身坐标位置,然后搜索值大于,值小于,改变,未改变,不断过滤。
第一个仇人基址:0x223d24e4
Z坐标:+ 0x350
X坐标:+ 0x348
Y坐标:+ 0x34c


鼠标:
CE搜索方法:通过移动鼠标,搜索改变了,未改变,不断过滤。
鼠标X: 0x20326ec0
鼠标Y: 0x20326ebc

传统坐标换算关键代码:
[C] 纯文本检察 复制代码// 线程函数 透视DWORD WINAPI ThreadProc(LPVOID lpParam){        DWORD addr;        while(F1_Statue)        {                // 读取本身信息                ReadProcessMemory(handle,(void*)(0x223d24d4),&addr,sizeof(DWORD),NULL);                ReadProcessMemory(handle,(void*)(addr+0x348),&selfBody.x,sizeof(DWORD),NULL);                ReadProcessMemory(handle,(void*)(addr+0x34c),&selfBody.y,sizeof(DWORD),NULL);                ReadProcessMemory(handle,(void*)(addr+0x350),&selfBody.z,sizeof(DWORD),NULL);                ReadProcessMemory(handle,(void*)(addr+0x22c),&selfBody.ct,sizeof(DWORD),NULL);                ReadProcessMemory(handle,(void*)(addr+0x9C),&selfBody.hp,sizeof(DWORD),NULL);                for(int i = 1;i 0)                        {                                // 一四象限                                if((emBox[i-1].y - selfBody.y) > 0)                                {                                        // 一 坐标转换代码                                        float tanA = tan((mousePoint.x*3.1415/180.0));                                        float tanB = (emBox[i-1].y - selfBody.y)/(emBox[i-1].x - selfBody.x);                                        emBox[i-1].cx = (box.width/2) + (box.width/2)*((tanA - tanB)/(1+tanA*tanB)) -10;                                        float sqrtX = sqrt((emBox[i-1].x - selfBody.x)*(emBox[i-1].x - selfBody.x) + (emBox[i-1].y - selfBody.y)*(emBox[i-1].y - selfBody.y));                                        tanA = tan((-mousePoint.y*3.1415/180.0));                                        tanB = (emBox[i-1].z - 68 - selfBody.z)/sqrtX;                                        emBox[i-1].cy = (box.height/2) + (box.height/2)*((tanA - tanB)/(1+tanA*tanB)) + 50*tanA;                                        tanB = (emBox[i-1].z - selfBody.z)/sqrtX;                                        emBox[i-1].ch = (box.height/2) + (box.height/2)*((tanA - tanB)/(1+tanA*tanB)) + 50*tanA;                                }                        }                }                                InvalidateRect(hwnd,NULL,true);                Sleep(150);        }        return 0;}


传统方式效果图:



第二种方式:矩阵转换坐标
原理:
所谓矩阵就是关于游戏摄像机的一组数据,一样平常都是4*4和4*3,这是游戏引擎决定的;然后根据这组数据套用公式直接可以得到屏幕坐标,至于公式怎么来的,这里一下子也说不清,感爱好的可以本身去学习一下,有点复杂,就是一些列的矩阵盘算。
公式:
Temp = 矩阵[2][0] * 仇人X坐标 + 矩阵[2][1] * 仇人Y坐标 + 矩阵[2][2] * 仇人Z坐标 + 矩阵[2][3];
盘算比例 = 1 / Temp;
屏幕X坐标 = 屏幕/2  + (屏幕/2 )* 盘算比例 *  (矩阵[0][0] * 仇人X坐标 + 矩阵[0][1] *  仇人Y坐标 + 矩阵[0][2] * 仇人Z坐标  + 矩阵[0][3]);
屏幕Y坐标 = 屏幕/2  + (屏幕/2 )* 盘算比例 *  (矩阵[1][0] * 仇人X坐标 + 矩阵[1][1] *  仇人Y坐标 + 矩阵[1][2] * 仇人Z坐标  + 矩阵[1][3]);

CE搜索方法:
通过一把狙,不要也行~~,未知初始值,移动鼠标改变,不动未改变,开镜改变,收镜改变,不断过滤~~哈哈也是迷迷糊糊。主要我形貌不清楚,还是要通过视频,本身在网上找一些

CS矩阵图:

本帖子中包含更多资源

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

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-4-29 14:28 , Processed in 0.156250 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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