ce了解
基础
应用层->微信,qq
驱动层->系统内核(驱动程序)
硬件层->内存,键盘,硬盘
个人理解
ce一般就是改内存值的,多用于游戏,现在客户端什么的,有时候也会用用
入门部分其实就是它自带的教程和游戏
主要是地址扫描、值的修改
进阶一点就是,基址查找、代码注入等、过驱动过检测。。。
这个都是之前的笔记了,知识点整理来自:https://space.bilibili.com/157504840
练手
首先写一个简单的c或cpp代码
#include<iostream>int num=2500;intmain(){while(1) { std::cout<<"Now the num is:---> "<<num;system("PAUSE"); num=num-10; }}运行后:Now the num is:---> 2500请按任意键继续. . . Now the num is:---> 2490请按任意键继续. . . Now the num is:---> 2480请按任意键继续. . . Now the num is:---> 2470请按任意键继续. . . Now the num is:---> 2460请按任意键继续. . .
那么用ce捕捉这个值,比如2490,因为没任何加密,可以轻松捕获,那么双击后修改该值为9999999
Now the num is:---> 2500请按任意键继续. . .Now the num is:---> 2490请按任意键继续. . .Now the num is:---> 2480请按任意键继续. . .Now the num is:---> 9999989请按任意键继续. . .
找到数据有什么用,该到对应代码(右键->找出是谁改写了这个->再运行程序->查看反汇编)得到
1.exe+15F8 - 83 E8 0A - sub eax,0A { 10 }把这个sub改成addNow the num is:---> 9999989请按任意键继续. . .Now the num is:---> 9999999请按任意键继续. . .Now the num is:---> 10000009请按任意键继续. . .Now the num is:---> 10000019请按任意键继续. . .
这只是一个基本操作,如果防御方加密怎么搞,一般都会自己自定义一个数据类型
因为对于int来讲,比如65535,四字节,那它就是ffff,在内存里会是 ffff0000, 是连续的值,如果想保护,那就在内存随机放置,这样在ce直接搜65535是搜不到的
动态分配内存,读取的时候再组合过来即可
这里有个缺陷就是,如果它存取的数值刚好是255或者以下呢?
也就是 ff000000,往小的值搜,不就可以直接搜到了
一样,那就可以去看代码了
当然,防御的话,异或一个随机值,那ce就找不到了
hook
钩子函数,一般代码都是按流程顺序执行,hook就是劫持这个流程,更改执行顺序
原流程:早起->上班->吃饭->下班->睡觉
hook完后:早起->下班->睡觉
用于跳过某个步骤,系统的驱动层也是这样的机制
情况1
再看一个流程
B攻击A->A扣血->判断A的血量>0
,否则A死亡
这里的hook是使得B攻击A->判断A的血量>0
,直接跳过扣血阶段
sub [edi+10],edi↓上行改为nop
情况2
但是有时候由于源代码缘故,比如两种角色可互相伤害,使用的是函数封装,方法调用
也就是说,主角A和敌人B都用同一种方法,这样ce一跳过的话(也就是使得关键代码为nop)A和B都变成一种假性无敌了
那么如何只使得A无敌,而B不无敌,主要依靠this指针(仅本例而言)
这样的话,要找到代表A的语句,cmp判断一下,是A,那就使得得到的伤害为0,比如:
cmp esi,4cef08 (是A)jmp 90000axor edi,edi (伤害为0)
但是有时候,由于指令太长写不了,那就要进行一个大范围hook
也即跳转到一个新的内存去完成一些指令->完成后再回去
将上面代码在新内存写入
900000 cmp esi,4cef08 (是A)900006 jmp 90000a900008 xor edi,edi (伤害为0)↓4321f4 sub [edi+10],edi -> jmp 9000004321f7 test....
还要完成代码的恢复,保证正常代码执行
90000a sub [edi+10],edi90000d mov eax,[esi+10]900010 jmp 4321f7
C改写汇编
如果从C语言的角度如何更改代码也很简单,把上面汇编语言对应的字节码获取到后,写到一个数组里,即硬写二进制
主要是jmp跳转地址那一块需要计算
调用内核去打开进程HANDLE hGame=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid)if (hGame){ 分配内存呗 LPVOID CodeA=VirualAllocEx(hGame,NULL,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);if (CodeA){ 主要是计算地址(利用基址和偏移),找到了就写进内存去 再实现最后一次的跳转 }}
我这只针对我开始的简单cpp进行一个hook
好像是直接写
#include<iostream>#include<windows.h>intmain(void){unsignedchar Code[]={0x83,0xc0,0x0a,0x00,0x00};//后面随便添加了两个unsigned Pid;printf("输入程序进程:rn");scanf("%d",&Pid); HANDLE hGame=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);if(hGame){//对目标地址写入数组的内容 BOOL Bret=WriteProcessMemory(hGame,(LPVOID)0x4015F8,Code,sizeof(Code)-2,NULL);if (Bret){printf("写入成功!"); }elseprintf("写入失败!"); }elseprintf("打开进程失败!");return1;}
反正是写入成功了,我看ce上对应的语句也改为了add
hook防御对抗
crc32
(就是计算出一个特征值,查看该特征是否变化)
原理:
因为它需要读取一个内存地址,从041fd40检测到041ff40这样一个范围,检测区域的任何一个代码改变都会被检测到
这里牵扯到内存地址的变化嘛,因为没hook之前是连续的地址,hook后(有内存跳转,跳到新内存地址再回来),这就会被检测到
绕过:
hook嵌套,hook检测crc32?
这里的思路时,既然它检测我的代码变动情况,那我就不变了
无痕hook
改字节码只是一种最基本的方式
改虚函数的表、导入表、导出表、操作系统本身异常机制
hash碰撞、md5
注入
例子1:
对没有源代码的程序进行二次开发
如果将我的内存插入到这个游戏的内存,内存合二为一,功能不就结合了
经典例子:
我家有电脑,你家也有电脑,我想玩你的电脑,那就是去你家
这个就是所谓,木马,病毒、外挂的本质
动态链接库,即DLL,因为一个人不可能包揽所有开发过程,所以需要模块化,各自分工,一个程序除了本身运行,也会加载模块化的DLL,如果有恶意的DLL,那不就实现了DLL注入
注入检测
多余加载的东西比如dll,这种进程情况,会发送到服务器,服务器对这些进行一个分析,保存下来 ,好好学习,搜集这个变化的过程,即大数据
监控与其有关的ip、账号做证据
当出现大量使用的行为的时候,就可以考虑封号了,之后这玩意儿再进行混淆、加壳,因为之前做了大数据,很容易分析出来特征
总结
为什么这种hook啊、注入啊起作用
以游戏为例,它不可能把所有东西都放到服务器,那么肯定有一部分放在本地,通过本地的修改影响服务器的一个目的
矛与盾都是见招拆招的过程
想要问什么样的矛好用,你得针对面对的是什么盾啊
总之学到了C和进程和汇编的关系,代码通过调用系统API函数,让系统内核对内存进行操作
参考
b站 郝英俊和易道云https://space.bilibili.com/157504840
https://blog.csdn.net/mrxiao23/article/details/137175004
个人补充
去特征
默认ce可能因为一些固有特征,会被检测到,所以这里尽量更改一下
主要是源码、图标,可以过一个客户端的检测,如果游戏有驱动保护,那要另说
当然了,特征码什么的
https://blog.csdn.net/mrxiao23/article/details/137175004
wpe
wpe也是对游戏的一个测试工具,它不同于ce的改值,一般是截获一段数据包,这一段就完成了一个行为,比如:
1.截获一段回城的行为,之后重复发这段包,那就是回城
2.可理解为发送一段指令,比如进副本打怪,可能就这样:截取第一个进图包,截取第一个遇怪包,截取第一个灭怪的经验包。重复发送这三段......那就自动打了
https://xz.aliyun.com/t/16391?time__1311=GuD%3D0IqGx%2BxUx0v4%2FDuBDcDmEzaUqK3x
漏洞点
我下载过一个游戏,坐标什么的确实可以改,副本里相当于单机了就是随便改,锁血等,但不是什么危害。被封了两个号了。。。(悲/(ㄒoㄒ)/~~
一般除了改具体值(攻击力等),改坐标(飞天、瞬移)
更多的是找ID,包括不限于人物id,物品id、技能id
这个一般就是模糊查询,
下面是月神师傅的一个公开文章内容
https://www.secpulse.com/archives/123776.html
比如人物id,先进到人物界面,随便选一个人物,选首次扫描
切换到其它人物,再变动的值,重复
一般不建议退出人物界面,因为退出了某个大功能后,内存地址很可能重新分配,导致了你列表中没有你要的内存地址
https://www.secpulse.com/archives/123776.html
漏洞案例:
https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2015-0143395
https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2014-048606
https://gh0st.cn/archives/2023-12-18/1
一般有很多只能模糊查询了,因为一般数据不会直接出。
这个反正有点意思,之前说的绿泡泡那个聊天记录修改就是这种方式,让转发的聊天内容以假乱真。
原文始发于微信公众号(羽泪云小栈):CE了解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论