自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 X64寄存器

rax,rcx,rdx,r8,r9,r10,r11是易改的,不用特别保护(push)其余寄存器需要保护(push)x86下只有eax,ecx,edx是易改的。rbx, r12,r13,r14,r15 (scratch),系统可以随时改写的寄存器,程序自己使用的时候需要通过栈备份。rcx rdx r r9 用来传参 :fastcall 寄存器多,尽可能把参数丢寄存器里了,x86只用了2个。通用寄存器:rax, rbx. rcx, rdx。源变址和目标变址寄存器:rsi,rdi。栈寄存器:rsp,rbp。

2023-05-28 21:54:59 477

原创 虚拟机两次寻址

CR3->PDPTR的基地址 通过2位的值找到页目录表base => 页目录表通过9位找到页表基地址 => 页表基地址通过页表项找到物理地址base => 再+12位的OFFSET得到物理地址。CR3寄存器指向页目录表(PDE)的基地址 => 通过PDI找到PTE的基地址 => 通过PTI找到物理内存的起始地址,物理地址的base + 线性地址的OFFSET就是对应的物理地址。双层地址翻译: 虚拟机地址 => (gpt页表)虚拟机物理地址=> (PET页表)真实机器物理地址。

2023-05-28 21:30:41 914

原创 调试与反调试

1.DebugPort2.KdDisableDebugger, 禁用内核调试 KdEnableDeu

2022-05-27 00:23:39 495 1

原创 Windbg调试

visual studio上虽然也能调试内核,但太麻烦了。很臃肿,本身就是内嵌了一个WindbgWindbg F1按下F1就会跳出一个帮助手册,是学习Windbg非常好的参考手册这个里面就有 Windbg的命令 有使用方法,使用例子三类命令 元命令,扩展命令和命令Commands 命令Mera Commands里的是以. 开头的 叫元命令Extension Commands 是以!开头的 是扩展命令因为Windbg既可以调试应用层程序 也可以调试...

2022-05-26 23:46:52 747

原创 漏洞预防

内核驱动漏洞原因和七大忠告不要使用MMIsAddressValid函数,这个函数对于校验内存结果是UNreliable的 首先,他只能判断一个字节地址的有效性 比如:​​​​​​ if(MmIsAdressValid(p1)){ memcmp(p1,p2,len); } 攻击者只需要传递第一个字节在有效页,而第二个字节在无效页的内存就会导致系统崩溃。比如0x7000是有效也 0x8000是无效也 传入0x7fff 其次,MmIsAddressValid对于 pageout的页面不能准..

2022-05-25 23:05:30 217

原创 NTModel(1

API从应用层到内核调用流程在应用层调用的API一般来说是被封装在 kernel32.dll或者gdi32.dll或者User32.dll这些动态链接库里的比如CreateFile这个应用层API kernel32里的API又会进一步封装到Ntdll.dll,在Ntdll中会对应一个NtCreateFile或是ZwCreateFile 应用层的是被封装在kernel中的函数 实际上就是调用这个里面的函数,kernel32里的又被封到Ntdll中 一般称为native API 就原生函数,原生函数会通

2022-05-23 00:20:08 166

原创 角色管理功能的通信分析(1)

角色删除数据包的分析删除发送的数据:删除发送又会收到个当前人物数据包前面是名字,后面不知道是啥,首先猜测这后面没有用,一看是看不出这个包是个啥,后面倒是有点规律换个号看看 发现后面没啥变化先试一下直接06 这一串能不能bool NetClient::delRole(wchar_t* rolename){ CString _name = L"zzz"; int len = _name.GetLength()+1; len = len * 2; len

2022-05-21 04:07:09 167

原创 二进制插桩与DTA

二进制插桩所谓插桩,其实就是在二进制程序指定位置(指令,函数)插入监控代码,类似hook,静态二进制插桩(Static Binary Instrumentation,SBI,反汇编,会修改磁盘文件)和动态二进制插桩(Dynamic Binary Instrumentation, DBI,对动态指令流进行修改,慢4倍)。常用框架有Intel Pin或者valgrind。(虚拟机对指令流进行修改)DTA动态污点分析(Dynamic Taint Analysis,DTA)也称为数据流追踪(Data F

2022-05-20 01:40:21 1221

原创 C++17

使static_assert的文本信息可选static_assert(sizeof(void*)==4, “64 - bit not supported”);//C++11引入,无需被调用 编译器报错assert(sizeof(b)==sizeof(a));//运行期间 必须被调用删除trigraphs#\^[]{}|~每个字符用其他三个字符代替 比如??=嵌套命名空间的定义namespace X::Y{ ... }代替namespace X{ namespace Y{ ... } }

2022-05-18 02:31:02 315

原创 C++14标准

lambda的参数可以使用autoint ret = [](int input){return input* input;}{10}; //C++11auto func = [](auto input){return input*input;};cout<<func(11)<<' '<<func(3.14)<<endl;constexpr支持if switch和循环...constexpr函数是一种编译期和运行期都能被调用执行的函数。用一套代

2022-05-18 01:44:20 294

原创 游戏网络通信数据解析-3

设计一个或几个类来解读数据:部分实现:class EnCode{private: char un[2]{};//解决内存对齐public: char index = 0; char op = 0; union { char dataPool[0x8]; int lenth; char byte; short stval; int val; float fval; double dbval; long long lval{}; }; char* po

2022-05-14 17:11:59 487

原创 游戏网络通信数据解析--2

登录数据包的监视与模拟添加一个类#pragma once//登录数据typedef struct DATA_LOGIN{ int op = 0x300; char buff[0x10]{}; int lenId{}; char Id[0x10]{}; int lenpass = 0x10; char Pass[0x10]; int lenCode = 0x10; char Code[0x10]; int eop = 0x01;}*PDATALOGIN;因为上次分析

2022-05-12 04:22:45 338

原创 C++11 杂项

列表初始化C++11中为了同一初始化方式,提出了列表初始化的概念在C++11中初始化列表可以作用于任何类型对象的初始化struct Point { int x; int y; }a = {1,2}; int b{ 3 }; int c = { 3 }; int* d = new int{ 3 }; double b = double{ 12.12 }; int* arr = new int[] {1, 2, 3}; std::map<int, int>map_

2022-05-11 05:42:19 200

原创 游戏网络通信数据解析_1

网络数据分析原理与依据软件中通过网络发送数据来通信,而通信的数据包要由发送方编码组织,由接收方进行解读,因此在软件开发之处,发送方和接收方就有着约定的编码与解码规则我们就通过数据包分析来确定它的编码规则网络通信编码解码的两种架构1、数据结构约定数据组织的时候本身有一个结构体,写代码的时候就定义在头文件里2、数据解析约定:发送的就是一段数据 比如01:char 02 short 03 bool 04 int 05 float....有一个编码表对于解码约定需要通过分析大量数据包,来..

2022-05-11 04:22:10 673

原创 std::function类模板

可调用实体和仿函数可调用实体(callable target),C++中包含了几种可调用对象:函数,函数指针,lambda表达式,std::bind创建的对象,以及实现了()操作符的类(仿函数类)仿函数(functor)又称为函数对象(function object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样(函数无状态,仿函数可有状态),作为仿函数的类,必须实现operator()运算符。struct functor{ int operator()(int a,

2022-05-10 02:40:06 865

原创 C++11:Lambda

C++11开始支持lambda(匿名函数或闭包):函数A中的匿名函数,可以直接访问(不需要传参)函数A的上下文环境才可见的变量(比如局部变量)Lambda的结构: [捕获列表](参数列表)(修饰符)->返回类型{匿名函数体};捕获列表:捕获调用者上下文环境的需要访问的变量,可按值捕获或按引用捕获lambda函数代码的可读性更好,尤其是对于小函数,不会污染任何名字的空间(本身就没名字)目的:就地书写,就地使用,...

2022-05-10 01:37:10 265

原创 STL容器改进

forward_liststd::forward_list是C++11中引入的单向链表或叫正向链表。foeward_list具有插入、删除速度快、消耗内存空间少的特点,但只能向前遍历。与其他序列容器(vector deque等)相比,forward_list允许在序列的任何一处位置以O1的方式插入或删除元素。forward_list可以看作是对C语言风格的单链表的封装,仅提供有限的接口,和C中它的实现相比,基本不会有任何开销,当不需要双向迭代的时候,与std::list相比,该容器具有更高的空间利用率.

2022-05-03 03:24:00 287

原创 C++11对类定义的改进

=default,=deletedefault显示声明该函数自动生成函数体,即默认函数,仅适用于类的特殊成员函数delete 禁用该函数,比如若不想使用默认的拷贝函数或赋值函数,可以使用delete一旦基类中使用=delete 来声明基类的某个成员函数为删除的,那么派生类中的对应函数也会自动的变成删除的就可以用delete来禁用函数而不是private因为就可以保证在同一个类也不能调用这些方法 如果用private 就会在链接的时候报错如果要把private的改成= delete的 就.

2022-04-30 01:21:41 856

原创 C++11:智能指针

智能指针:是指用于存储和封装指针的类,被存储的指针指向了从堆上动态分配的对象,能够在适当的时间自动删除指向的对象。智能指针在面对异常的时候能确保正确的销毁动态分配的对象。也可以用于跟踪被多用户共享的动态分配对象 使用operator-> 和 operator* 来生成原始指针,看上去就像一个普通指针auto_ptr<T> ptr(new T);*ptrptr->value 不用手动delete实现一个最简单的智能指针:template<typename T..

2022-04-29 00:51:43 2542

原创 C++11:类型推断

auto&decltypeC++98:auto int a = 10;//自动变量(相对于static, register,extern,可以省略) //新标准废弃这种用法C++11:int a = 10;auto 仅仅是一个占位符,并不是一个真正的类型。根据初始化的值推断变量的类型auto的作用1.代替较长的声明std::vector<std::string>strary;for(std::vector<std::str...

2022-04-28 23:43:51 1444

原创 C++11:移动语义

一个带指针的类拷贝构造函数没使用深拷贝,浅拷贝会导致野指针的问题直接指向析构的一块区域导致出问题 用深拷贝解决这个问题:(必须传引用)如果我们实现拷贝构造函数的时候,不传引用传值,会引起拷贝的死循环,拷贝的时候会把我们的对象传给拷贝构造函数,因为会生成一个临时对象,又会把实参拷贝给这个临时对象,这个过程又会重复调用拷贝构造函数,就会导致死循环A getA(){ A a; return a;}A x = getA();拿到getA的返回值的时候...

2022-04-28 04:45:39 146

原创 C++11:右值

在template的声明式中,class和typename没区别但如果要在模板参数内部,要typename定义嵌套从属类型的时候 就要typename指定从属类型比如模板函数里面还有一个类型比如 T::const_iterator* x;如果没用typename的话就可能会被编译器识别为静态成员,就会有二义性,为了让这个T::const_iterator成为T中的一个类型,而不是静态成员就要直接在前面加个typename:template<typename T>void Func(

2022-04-28 03:31:18 363

原创 网络通信数据包分析工具--2

设计数据发送结构实现更复杂的数据发送重新封装一下这个结构 方便以后扩展struct COPY_DATA{ time_t ltime;//时间 unsigned MsgType;//数据类型 unsigned len; char buff[0x2000];};过程略...到时候就可以屏蔽特定消息这玩意一个登录数据就这么一大片,肯定是要过滤的开始写这个小工具...其实无非就是框架控件的使用void CSetMsg::OnBnClickedOk(){

2022-04-28 00:52:32 237

原创 网络通信数据包分析工具 1

如果没有工具我们就创造工具一个数据包是怎么组织、解读的,可以通过逆向分析去分析,但是通过逆向分析去分析只适用于一两个数据,大量的数据分析的话成本太高了。技术这个东西从语法会了,再到追求技巧,代码怎么写速度快,再往后就开始追求感觉上的东西,到后面看一眼,猜一下,就能知道个八九不离十。--第六感拿到一段数据,客户端解读,不同的数据客户端解读方式不太可能不一样,有解读方式那肯定要有解读的图纸,没有提前的规划那也要有系统性的解读如果用的是图纸:A数据包用的a号图纸去解读 把这个数据包定义成结构体,放

2022-04-27 01:31:14 712

原创 游戏网络架构逆向分析--2

游戏底层功能对接类GameProc的实现这是一个函数的虚函数,这个ecx和发送数据&接收数据都有很大关系,这里截取主要就是要拿到ECX,其实更好的方法就是去找它的基址,但基址不好分析,有一大堆函数指针和虚函数,还和Lua有交互,找基址就套浪费时间了。edx就是这里虚表的地址可以直接在虚函数这做一个HOOK,通过改虚表来直接调 直接改这 10617c90的数据就能改变eax结果,就可以跳到任何想去的地方这个类原型名字就叫 GameWinSock ::Connect(char* ip..

2022-04-24 04:56:37 409

原创 游戏网络架构逆向分析--1

测试需求和拆解网络游戏客户端与服务端协同形式:一般分为两种情况:UI操作->吃药-> 生命值增加-> 发送服务器 (发送结果型) UI操作->吃药->发送请求吃药->服务器验证->服务器完成吃药->客户端同步显示发送结果型:首先在界面里按了吃药的操作,按下吃药的操作以后,生命值增加,客户端会看有没有药水,有没有cd 能不能吃,生命值就增加了,然后把这个血量发送给服务器,但发送给服务器前的这个是可以改的比如直接改成999999,这不就无敌了..

2022-04-23 11:28:59 3607

原创 网络通信封包解析--3

网络完成端口模型的流程对于接收数据,如果是recv函数那就是开一个多线程一个while循环不停收数据然后解密数据 在投递数据 进入 处理队列,另外一个线程再通过队列去处理数据但WSASend 和 WSARecv就不一样了又变成了单线程操作比如WSASend函数 前面进行的组包,加密再调用这个函数,一调用这个函数马上就结束了,数据并没有发送完成, 发送这个东西是由WSASend和操作系统协作去完成的,如果需要发送失败或者发送成功的消息WSASend会接到通知 (当然是利用回调函数这一类操作),接到.

2022-04-19 04:41:41 783

原创 网络通信封包分析--2

数据包组织与发送过程分析一般碰到复杂的就不去看,但这个太重要了,得硬着头皮上了,如果遇到是在处理不来的就直接还原成C++代码就能看懂了首先就是看edi是从哪来的这个函数是有可能会改变edi的这里edi已经是可以看作是一个类了,这个数据包可以看作是一个独立的类往上看看这个edi是从eax来的 正好是调用了这个edx的函数edi又来自 12A3AB0 这个是NET类这个edi是NET类的一个指针edx是从ebx+24得到的如果eax和ecx不复杂 ,能看明白..

2022-04-19 03:11:24 326

原创 游戏启动流程的逆向分析与多开的实现

游戏启动的一般架构登录器程序 启动游戏主程序 游戏中完成登录 登录器完成登录 传送token至游戏客户端 游戏根据token 登入账号 客户端直接启动为什么不能直接启动呢?而必须要通过登录器来启动?网络游戏面对很多的情况。游戏的版本,登录器启动的情况下就可以验证一下版本 版本不行就可以更新一下,自己更新自己是不太好,当然也有一种就是热更新,但是热更新中间也是有跳板来做的,更新的文件,如果是更新这个程序,热更新也是很难去操作的 主程序可能会被别人破坏 如果是做了硬件补丁 登录器可以把文件读

2022-04-17 20:04:28 3052 1

原创 网络通信封包解析

项目需求:为游戏聊天功能制作增强功能,能够使用户在脱离游戏界面的情况下使用窗口化助手进行聊天,能够设置自动回复,记录关键聊天记录,自动说话等 游戏聊天功能本身比较不容易找到切入点,类似这种不容易找到切入点的功能,我们都可以通过解析网络游戏的通信系统,来找到切入点,另外一个软件或者网络的通信系统是一个程序的核心命脉,全面解读通信系统有助于我们二次开发首先是网络通信系统的解读和还原应用程序网络通信的经典流程组织数据-> 加密数据 -> 发送数据 接收数据 -&gt...

2022-04-15 03:16:16 809

原创 游戏窗口化助手

需求:在游戏窗口化时,能够在游戏之外弹出一个窗口,可以隐藏或者显示游戏窗口,显示游戏人物的基本状态,以及其他重要的信息游戏窗口句柄的获取 游戏窗口坐标的获取 游戏移动事件的HOOK 人物所在地图数据的逆向分析 人物升级所需经验数据的逆向分析...

2022-03-29 23:49:56 3383

原创 高性能服务器 异步通信模块

现在所有的基础模块已经差不多了,我们可以开始核心模块的开发 到了这里,我们将逐渐接触到业务层的逻辑了 前面的模块是比较通用的模块,所以我们几乎可以完全不谈业务逻辑。业务:不具备通用性的,用户定制的需求。比如某种操作流程、界面特点样式/图案/样式/标志、行业规范/单位/限制等等。这些东西往往不具备可移植性和移植的必要性但是后面的模块 ,后面都需要直接和业务层打交道,所以我们需要逐步考虑业务层的需求了。要谈异步,首先我们就要谈同步。 一般情况下,我们的通信模块都是同步的创建套接字->监

2022-03-28 01:52:27 439

原创 物品使用策略

需求可以通过自动化助手指定物品的使用策略,比如:当HP小于20%时,使用加血药物当MP小于20%时,使用加蓝药物装备耐久度低于1时,使用回城卷轴或者替补装备分析物品的使用 分析物品的交换 分析物品的堆叠 分析物品的丢弃 分析物品与装备的互换 设计策略结构...

2022-03-26 03:56:02 444

原创 背包数据的获取

需求:在自动化助手的UI界面中,能够实时的显示玩家背包中的数据,以及重要的属性信息,比如数量,名称等1、分析物品数据属性,还原C++类2、分析物品基址或者基址获取方法物品数据的初步分析:搜索背包的物品数据 初步猜测是数组 相邻的差值都一样发现改变背包的物品位置,数据也被copy了,直接搜字符串发现这个地址离太远了,不可能和别的构成数组 ,说明物品是没名字的,而是有物品种类再由这个数据有一个算法来指向名字...

2022-03-21 15:45:25 541

原创 角色数据的获取

需求:读取游戏玩家的重要属性,血量/最大血量 魔法/最大魔法 经验 等级 技能点灯 并且显示在自动化助手的UI界面中。拆解:一、分析游戏角色数据,并且还原成C++类二、分析并且锁定游戏玩家基址角色数据的分析与C++还原:这个类头就是在1D5CE984...

2022-03-08 22:52:13 7526

原创 自动化助手的添加(红字公告的逆向分析&C++实现函数调用以及菜单呼出)

买东西 会有红字 购买成功字样发现怎么改都改不了,按道理只要这个要显示 内存里都是有的但这个东西内存里有 就是改不了 有可能这个内容是服务器发送过来的这个地方通过封包的函数还是可以处理掉的还可以试试看改写,但看了看发现不行。但这个红色公告和之前的普通公告都是类似的,都是显示公告在这下断点看看有没有被触发,发现没有,就往下找,这地方是生成类的在这儿下断买个东西 发现触发了断点 ,然后往上找 看看他对数据的调用是什么样的发现到了这个地方 和之前白色公告...

2022-03-05 01:22:39 4370

原创 自动化助手的添加(2字符串读取类的还原&公告的逆向)

首先确定改内存是可行还是不可行,首先看复杂度高不高。正常情况下在内存中是一定有的首先直接在内存中搜索,换了几次格式 搜到了三个容易看出是第三个,只要改这个就行,但此时还没访问这个地方,所以要触发访问来改变UI显示的信息。可以修改快捷键来触发,就发现修改完了。这个地方是一定要读取这个字符串的,查看是什么访问,再改快捷键这是第一种读取的情况。在打开调试工具下一个条件断点向上跟进入函数这就是个字符串读取的函数函数返回...

2022-03-03 23:44:41 151

原创 自动化助手的添加(1 分析&接管)

需求:为游戏增加VIP功能 - 自动化助手。游戏中原本的自动药水设定功能,如果是非VIP使用,则依然使用游戏原本自动药水功能,如果是VIP,则替换游戏中的自动药水功能为我们 提供的自动化助手功能同时对于VIP修改菜单,自动药水设定为自动化[VIP]对于非VIP,使用自动化药水功能时,弹出提示 ,可以开通vip使用高级的自动化助手功能找到游戏本身的药水设定函数,跳转到我们自己的接口函数中 找到菜单字符串访问函数,搜索菜单文字是如何加载的,修改对应文字 找到游戏中的信息提示接口,实现显示我们

2022-03-01 09:29:23 6772

原创 高性能服务器开发 -》需求实现5 数据库模块设计

下面我们可以开始设计数据库模块了一个正常的服务器,多半是需要数据库功能的。 当时在C++环境下,好的数据库代码并不多什么是好的数据库代码?满足数据库的接入要求 使用方便简洁 自动化程度高 适配性广泛这里我们将一起研究一下,如何实现一个好的数据库模块,方便我们的使用需求说明现在我们要搞清楚,数据库到底有哪些接入要求。 首先,我们需要有一个能灵活修改的数据结构,方便我们去适配数据库中各种表的内容 这意味着我们需要一个动态可调表类。其次,我们需要表的创建、查询SQL语句自动化生成功

2022-01-22 00:03:17 832

原创 高性能服务器开发 -》需求实现 4 任务模块

现在我们有了一个线程池模块、一个日志模块,下面我们就可以开始着手任务模块了需求说明为什么要有任务模块?任务是针对相对复杂的情况,而设定的。比如我们要建立一个服务器,不可能像日志模块一样,直接将整个服务器通过参数给投递进去。此外还要准备接入大量的客户端。每个客户端要处理的内容也不尽相同有的客户端在连接,有的客户端在发送数据,有的客户端在接收数据,有的客户端已经下线,等等。数万乃至十万用户,都在进行着格子不同的操作 客户端之间可能还会发生设计关联的操作,或者服务器和客户端之间,服务器与数

2022-01-20 20:00:37 449

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除