吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 53237|回复: 324
收起左侧

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

    [复制链接]
UpSir 发表于 2020-3-5 15:48
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 (1.35 KB, 下载次数: 196) (编译后会得到一个TestDll.dll)
功能控制完整代码: 功能.txt (3.32 KB, 下载次数: 190)
测试代码结果如图:


二、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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// 线程函数 透视
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<sum;i++)
        {
            // 获取敌人坐标
            ReadProcessMemory(handle,(void*)(0x223d24d4 + i * 0x10),&addr,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x348),&emBox[i-1].x,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x34c),&emBox[i-1].y,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x350),&emBox[i-1].z,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x22c),&emBox[i-1].ct,sizeof(DWORD),NULL);
 
            // 血量
            ReadProcessMemory(handle,(void*)(addr+0x9C),&emBox[i-1].hp,sizeof(DWORD),NULL);
 
            // 计算方框坐标tan(a-b) = [tan(a)-tan(b)]/[1+tan(a)tan(b)]
             
            ReadProcessMemory(handle,(void*)0x20326ec0,&mousePoint.x,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)0x20326ebc,&mousePoint.y,sizeof(DWORD),NULL);
            //tan(b)
            //判断象限
            if((emBox[i-1].x - selfBody.x) > 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矩阵图:
矩阵CE.png

红色的就是矩阵,矩阵特点:第一个值在不开镜的情况下,一般不会超过2不会小于-2且开局不动都是0;第一行第三个值不会变;有一行或列是比较大的数值。满足这几个条件一般都是矩阵~~


[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 线程函数 透视
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
    float matrixData[4][4] = {0};
    DWORD addr;
    while(F1_Statue)
    {
        int temp = 0;
        for(int k = 0;k < 4;k++)
        {
            for(int j = 0; j < 4;j++)
            {
                ReadProcessMemory(handle,(void*)(0x2048BC9C + temp * 0x4),&matrixData[k][j],sizeof(DWORD),NULL);
                temp++;
            }
         
        }
 
        // 读取自己信息
        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<sum;i++)
        {
            // 获取敌人坐标
            ReadProcessMemory(handle,(void*)(0x223d24d4 + i * 0x10),&addr,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x348),&emBox[i].x,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x34c),&emBox[i].y,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x350),&emBox[i].z,sizeof(DWORD),NULL);
            ReadProcessMemory(handle,(void*)(addr+0x22c),&emBox[i].ct,sizeof(DWORD),NULL);
 
            // 血量
            ReadProcessMemory(handle,(void*)(addr+0x9C),&emBox[i].hp,sizeof(DWORD),NULL);
 
            // 屏幕坐标
            emBox[i].cz = matrixData[2][0] * emBox[i].x + matrixData[2][1] * emBox[i].y + matrixData[2][2] * emBox[i].z + matrixData[2][3];
            emBox[i].cz = 1 / emBox[i].cz;
 
            // 通过矩阵数据转换为屏幕坐标
            emBox[i].cx = (box.width/2) + (box.width/2) * emBox[i].cz * (matrixData[0][0] * emBox[i].x + matrixData[0][1] * emBox[i].y + matrixData[0][2] * emBox[i].z + matrixData[0][3]);
            emBox[i].cy = (box.height/2) - (box.height/2) * emBox[i].cz * (matrixData[1][0] * emBox[i].x + matrixData[1][1] * emBox[i].y + matrixData[1][2] * emBox[i].z + matrixData[1][3]);
            emBox[i].ch = (box.height/2) - (box.height/2) * emBox[i].cz * (matrixData[1][0] * emBox[i].x + matrixData[1][1] * emBox[i].y + matrixData[1][2] * (emBox[i].z + 68) + matrixData[1][3]);
 
        }
         
        InvalidateRect(hwnd,NULL,true);
        Sleep(150);
    }
    return 0;
}


矩阵方式效果图:


免费评分

参与人数 130吾爱币 +117 热心值 +116 收起 理由
拉鲁哥受 + 1 谢谢@Thanks!
程晨 + 1 + 1 我很赞同!厉害
新手12138 + 1 + 1 我很赞同!
tryotry + 1 + 1 谢谢分享!!用心讨论,共获提升!
SilverBulletY + 1 + 1 我很赞同!
Waik + 1 我很赞同!
454503684 + 1 + 1 厉害厉害
时光稀释 + 1 + 1 热心回复!
西瓜爱吃西瓜呀z + 1 + 1 用心讨论,共获提升!
xiaobi + 1 + 1 谢谢@Thanks!
橘子味的喵 + 1 + 1 用心讨论,共获提升!
枕边嫌疑人 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
xiaokang6 + 1 热心回复!
苍生° + 1 我很赞同!
余弦 + 1 + 1 用心讨论,共获提升!
风流江小鱼 + 1 + 1 谢谢@Thanks!
小哥布林 + 1 热心回复!
王辰瑞 + 2 + 1 谢谢@Thanks!
liuhu1210 + 1 + 1 mark上了
特污兔 + 1 + 1 用心讨论,共获提升!
yy1457739021 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
deoplljj + 1 + 1 大佬
Alex1214 + 1 我很赞同!
西点军魂 + 1 + 1 用心讨论,共获提升!
7812562 + 1 我很赞同!
越行勤 + 1 谢谢@Thanks!
517185863 + 1 我很赞同!
livetome + 1 + 1 我很赞同!
z8850371 + 1 + 1 我很赞同!
wjooxx + 1 + 1 谢谢@Thanks!
紫剑锋 + 1 + 1 谢谢@Thanks!
zhuzhuxia111 + 1 + 1 我很赞同!
油炸煤气罐 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
aa2791298 + 1 + 1 谢谢@Thanks!
云岛鹤川 + 1 + 1 热心回复!
啊哈鹅 + 1 + 1 谢谢@Thanks!
MadDonkey + 1 + 1 用心讨论,共获提升!
反反复复发 + 1 + 1 我很赞同!
蹦蹦哒i﹏ + 1 + 1 我很赞同!
Snprszy + 1 + 1 太秀了 我得研究研究了 谢!
lovejingqing + 1 + 1 我一个小白 除了几个中文字,其他的一脸懵逼 膜拜大佬
52CXZ + 1 + 1 用心讨论,共获提升!
莎士卜 + 1 + 1 五体投地
Coptis2020 + 1 谢谢@Thanks!
温柔的一哥 + 1 + 1 用心讨论,共获提升!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
梁总 + 1 + 1 我很赞同!
爆炎 + 1 + 1 谢谢@Thanks!
huangzihang + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
opqrew99 + 1 + 1 谢谢@Thanks!
razor40K + 1 + 1 我很赞同!
华灯初上夜未央 + 1 热心回复!
不怕黑的夜晚 + 1 + 1 谢谢@Thanks!
米酷cool + 1 + 1 我很赞同!
zwp10200 + 1 + 1 我很赞同!
pumishuo + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xofeng锋 + 1 用心讨论,共获提升!
nut1999 + 1 用心讨论,共获提升!
qiaoyong + 1 + 1 谢谢@Thanks!
a1594324 + 1 + 1 谢谢@Thanks!
limpoamp + 1 + 1 我很赞同!
ciye7 + 1 + 1 谢谢@Thanks!
87832649 + 1 + 1 我很赞同!
Jale + 1 + 1 66666大神
BG沉默 + 1 + 1 谢谢@Thanks!
松晓 + 1 热心回复!
仅心 + 1 + 1 用心讨论,共获提升!
kefeijiajia + 1 我很赞同!
zswseu + 1 + 1 我很赞同!
爱凤凤呦 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
天尊小帅 + 1 + 1 谢谢@Thanks!
N0LL + 1 + 1 谢谢@Thanks!
太簇十七 + 1 + 1 谢谢@Thanks!
JaysonLee + 1 + 1 我很赞同!
一只梦蝶 + 1 + 1 谢谢@Thanks!
lypxynok + 1 + 1 谢谢@Thanks!
jimo + 1 我很赞同!
soyiC + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wbgame + 1 + 1 谢谢@Thanks!
我是小邹昂 + 1 + 1 谢谢@Thanks!
ggwwrr + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
DaKxhq54zDH + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Assembly + 1 + 1 我很赞同!
tony198911 + 1 + 1 谢谢@Thanks!
songshao + 1 鼓励转贴优秀软件安全工具和文档!
淮南哈密瓜 + 1 + 1 谢谢@Thanks!
耶稣 + 1 + 1 我很赞同!
血浸青衫 + 1 + 1 我很赞同!
御坂10032 + 1 + 1 我很赞同!
侽兒嘿 + 1 + 1 我很赞同!
魅夜 + 1 + 1 谢谢@Thanks!
我来白嫖 + 1 + 1 我很赞同!
孤丶宇 + 1 + 1 谢谢@Thanks!
9843635 + 1 + 1 热心回复!
zsky + 2 + 1 感谢大佬
天空藍 + 1 + 1 thanks!
隔壁老王酷酷哒 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
呲花bia + 1 + 1 膜拜大佬
poolychoi + 1 + 1 谢谢@Thanks!
黄sir + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| UpSir 发表于 2020-3-7 09:43
qaz003 发表于 2020-3-6 01:31
谢谢分享,附件无法下载,提示无法读取

稍后我补链接,我也不知道为啥无法读取~

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
qaz003 + 1 + 1 谢谢。。。

查看全部评分

 楼主| UpSir 发表于 2020-3-8 22:11
qaz003 发表于 2020-3-6 01:31
谢谢分享,附件无法下载,提示无法读取

已经可以下载了,如果好不可以,我发你邮箱

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
qaz003 + 1 + 1 热心回复!

查看全部评分

121890575 发表于 2020-3-5 17:33
Xw丶小威 发表于 2020-3-5 17:16
技术贴!支持!
GerMInChars 发表于 2020-3-5 17:42
很好的帖子,感谢楼主
sujifei 发表于 2020-3-5 18:05
帖子很棒,非常感谢
BY丶显示 发表于 2020-3-5 18:15
文章说明很详细,方法也不错,谢谢分享。
安澜良 发表于 2020-3-5 18:24
这样讲解让我这个小白都有一些摸到门路了
l101 发表于 2020-3-5 19:07
666,很强大,但是迷迷糊糊的感觉Σ( ̄。 ̄ノ)ノ
aixiaodemj 发表于 2020-3-5 19:26
讲解细腻 特别喜欢你的教程 加油
boy7928 发表于 2020-3-5 19:30
太技术了。膜拜
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-7-27 04:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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