发表于 2020-3-2 13:20

申请会员ID:UpSir【申请通过】

1、申 请 I D:UpSir2、个人邮箱:463264208@qq.com3、原创技术文章:C语言实现植物大战僵尸辅助原理讲解、fps CS方框透视(传统坐标转换、矩阵)、无后座等、C语言实现PE查看器

大家好,我是向上先生,嘿嘿。最近在学习逆向、反汇编等等,首先我在非常感谢52pojie这个平台,差不多很多学习资源都是在这个平台得到的,也学到了非常多的知识,不管申请过不过我都非常感谢;本人技术较菜,希望能够加入该平台和大牛们一起学习,分享自己的一些经验。最近在写加密壳(二进制壳)还没完成~~


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

我们来到通过CTRL+G来到41de07这里,首先我们分析一下,刷僵尸这个call应该需要哪些参数,应该会有刷在哪里,刷什么僵尸,也许不会有参数,直接在call里通过代码随机生成等等情况;然后下断点,找到上一层调用的地方,观察堆栈变化根据返回地址找到调用的call;由于栈是先进后出,调用关系就是由下往上,我们找的时候就应该由上往下跟随我们将原来的eax==1 esi == 0改为 eax == 2esi == 1,后面又来了两次改为eax == 2esi == 3,得出eax为行数,esi为类型
接下来就简单了,我们需要edi的值,去CE中直接直接搜索edi的值,下访问断点是要保证od必须脱钩,否则不可以。结果edi的值为 [+ 0x768]。
代码讲解:
dll代码:DWORD WINAPI readCount(LPVOIDlParam)是自己dll里创建线程的回调函数,BOOL APIENTRY DllMain(HANDLE hModule,,DWORD ul_reason_for_call,,LPVOID lpReserved) 是Dll的入口
控制功能代码:
Dll完整代码:(编译后会得到一个TestDll.dll)功能控制完整代码:
测试代码结果如图:
大家可以去找找种植call,实现全屏种植
二、fps游戏 CS方框透视原理(矩阵+传统坐标转换)我采用的是GDI窗口绘制,需要干的事就是创建一个窗口,这个窗口透明并且具有穿透效果和置于顶层等特点。然后就是根据敌人和自己坐标点绘制方框。第一种方式:传统型转换坐标原理:CE找自己坐标的基址,我喜欢找z坐标,然后x、y坐标就是z坐标地址 -8、-4;x、y、z坐标不会东一个西一个,因为在3d游戏中坐标都是通过向量Vector3存储,我们找的很多都是游戏引擎规定好了的东西。就不去找了,自己坐标:CE搜索方法:通过未知的初始值,然后改变了,增加了,减少了,未改变不断过滤自己坐标基址:0x223d24d4Z坐标:+ 0x350X坐标:+ 0x348Y坐标:+ 0x34c 敌人坐标:CE搜索方法:通过自己坐标位置,然后搜索值大于,值小于,改变,未改变,不断过滤。第一个敌人基址:0x223d24e4Z坐标:+ 0x350X坐标:+ 0x348Y坐标:+ 0x34c 鼠标:CE搜索方法:通过移动鼠标,搜索改变了,未改变,不断过滤。鼠标X: 0x20326ec0鼠标Y: 0x20326ebc
代码:由于抽出放方框透视,导致代码有点乱,下次整理后更新传统:
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.x,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x34c),&emBox.y,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x350),&emBox.z,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x22c),&emBox.ct,sizeof(DWORD),NULL);                        // 血量                        ReadProcessMemory(handle,(void*)(addr+0x9C),&emBox.hp,sizeof(DWORD),NULL);                        // 计算方框坐标tan(a-b) = /                        ReadProcessMemory(handle,(void*)0x20326ec0,&mousePoint.x,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)0x20326ebc,&mousePoint.y,sizeof(DWORD),NULL);                        //tan(b)                        //判断象限                        if((emBox.x - selfBody.x) > 0)                        {                              // 一四象限                              if((emBox.y - selfBody.y) > 0)                              {                                        // 一 坐标转换代码                                        float tanA = tan((mousePoint.x*3.1415/180.0));                                        float tanB = (emBox.y - selfBody.y)/(emBox.x - selfBody.x);                                        emBox.cx = (box.width/2) + (box.width/2)*((tanA - tanB)/(1+tanA*tanB)) -10;                                        float sqrtX = sqrt((emBox.x - selfBody.x)*(emBox.x - selfBody.x) + (emBox.y - selfBody.y)*(emBox.y - selfBody.y));                                        tanA = tan((-mousePoint.y*3.1415/180.0));                                        tanB = (emBox.z - 68 - selfBody.z)/sqrtX;                                        emBox.cy = (box.height/2) + (box.height/2)*((tanA - tanB)/(1+tanA*tanB)) + 50*tanA;                                        tanB = (emBox.z - selfBody.z)/sqrtX;                                        emBox.ch = (box.height/2) + (box.height/2)*((tanA - tanB)/(1+tanA*tanB)) + 50*tanA;                              }                        }                }                              InvalidateRect(hwnd,NULL,true);                Sleep(150);      }      return 0;}矩阵:// 线程函数 透视DWORD WINAPI ThreadProc(LPVOID lpParam){      float matrixData = {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,sizeof(DWORD),NULL);                              temp++;                        }                              }                for(int i = 1;i<sum;i++)                {                        // 获取敌人坐标                        ReadProcessMemory(handle,(void*)(0x223d24d4 + i * 0x10),&addr,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x348),&emBox.x,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x34c),&emBox.y,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x350),&emBox.z,sizeof(DWORD),NULL);                        ReadProcessMemory(handle,(void*)(addr+0x22c),&emBox.ct,sizeof(DWORD),NULL);                        // 血量                        ReadProcessMemory(handle,(void*)(addr+0x9C),&emBox.hp,sizeof(DWORD),NULL);                        // 屏幕坐标                        emBox.cz = matrixData * emBox.x + matrixData * emBox.y + matrixData * emBox.z + matrixData;                        emBox.cz = 1 / emBox.cz;                        // 通过矩阵数据转换为屏幕坐标                        emBox.cx = (box.width/2) + (box.width/2) * emBox.cz * (matrixData * emBox.x + matrixData * emBox.y + matrixData * emBox.z + matrixData);                        emBox.cy = (box.height/2) - (box.height/2) * emBox.cz * (matrixData * emBox.x + matrixData * emBox.y + matrixData * emBox.z + matrixData);                        emBox.ch = (box.height/2) - (box.height/2) * emBox.cz * (matrixData * emBox.x + matrixData * emBox.y + matrixData * (emBox.z + 68) + matrixData);                }                        InvalidateRect(hwnd,NULL,true);                Sleep(150);      }      return 0;}不知道什么原因不能上传,昨天报503,今天报493,直接粘贴代码太多,上传会报错,我就只贴关键部分的代码,剩下的下次一起更
结果图:传统:
矩阵:
三、PE查看器(这也不更了,下次一起,这次太多了)简单的界面截图

Hmily 发表于 2020-3-3 21:11

I D:UpSir
邮箱:463264208@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

ps:登录后把文章整理一下发布到软件调试区吧

UpSir 发表于 2020-3-4 00:30

来了,来了。账号已经拿到了,感谢大佬。明天在整理帖子到软件调试区,现在才发现好乱啊

一年又一年 发表于 2020-3-6 15:52

欢迎新会员
页: [1]
查看完整版本: 申请会员ID:UpSir【申请通过】