首页
论坛
课程
招聘
[原创].net也能写内存挂
2020-11-26 10:51 8910

[原创].net也能写内存挂

2020-11-26 10:51
8910

最近在研究.net的内存挂。

写了很久的c++,发现c#写出来的东西实在太香。

折腾c#外挂已经有很长时间了。都是用socket和c++配合。

这个模式其实蛮成功的,用rpc调用的方式加上c#的天生await 非常好写逻辑

类似这样





最近想换个口味。注入托管dll到非托管进程

这样做只是为了解决我目前遇见的一个问题。

在一个多线程的程序上逆向,我挂了很多钩子,导致我读写数据和储存我自己的数据

非常容易出现多线程冲突问题,换到.net里以后

lock 和Monitor 在.net里是同线程不互锁。这样能让我不容易出现互锁现象。

 

 

有一段时间正在烦恼那些卖驱动的,只有读写功能为什么还能实现很多功能。

在我的认知里,要调用游戏部分函数才能更方便自己做出更有用的功能

当然这里确实有些外挂是只读取角色顶点就能绘制的。

后来细想一下其实不需要调用功能通过写入代码的方式获取执行就可以了。

 

就是只要有读写就可以了。

游戏外挂无非就是 读写和调用。 调用是可以通过写来实现。

比如hook某个dx的函数。或者修改虚函数表的地址,然后jmp 到自己的函数里

达到获取执行权限。

 

好比挂钩了GetTickCount  这个API ,然后目标游戏不断的调用这个API

我们在这里插入自己的调用逻辑就可以了。

 

 

想明白了这个,于是我就干起了注入托管dll 到游戏进程里的勾当

当然这个托管dll实在是太大了(因为会用Costura.Fody把第三方库都打包在一起)

想法是这样,注入到游戏进程里以后申请内存空间,然后通过asm编译成bytes

然后写入到内存后,再去调用他就可以了

这里要安利一个asm的库 

https://github.com/0xd4d/iced

这个库很香


在c#里写asm长这样子,大概就是写好asm以后编译成bytes的过程




然后要介绍在c#内怎么完成thiscall

 

游戏大部分是thiscall  所以我在内存中申请一段asm

然后通过c#去调用这个段代码就可以了

asm 的作用就是把传入的参数 push到堆栈然后call

之后返回eax 这样就完整的跑通调用了。


iced把asm生成好,然后通过c#的委托去调用这段asm代码即可

最后实现的效果类是这样




 

至于读写就更简单了。C#自带Marshal可以直接读写。

而且c#也支持不安全指针 直接 *(int*)(0x123456) = 100;

 

然后我们无限的包装自己的读写函数,比如byte float int string 之类的读写就可以

 

至于hook 也可以通过委托回调到自己的c#代码,hook在c#完成编译以后写入到目标地址

 

至此,完整的c#外挂需要的功能都实现了。

 


例子分3个工程

TestApp:测试工程模拟调用目标程序比如游戏

InjectionDLL:注入DLL,负责加载.net的dll,如果是远线程注入,就注入这个DLL即可,例子工程是主动loadlibrary

CShareLoadModule : c#的主要工作dll


附上源码一份

netInjection.rar

 



第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2020-11-26 10:56 被mudebug编辑 ,原因:
上传的附件:
收藏
点赞4
打赏
分享
最新回复 (32)
雪    币: 0
活跃值: 活跃值 (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhaobisheng 活跃值 2020-11-26 11:20
2
0
谢谢分享
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万神fake 活跃值 2020-11-26 17:11
3
0
拿走了,c#写起来太舒服了
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万神fake 活跃值 2020-11-26 18:00
4
0
额,纯c#不行吗
雪    币: 137
活跃值: 活跃值 (415)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 活跃值 2020-11-26 18:26
5
0
mark
雪    币: 5593
活跃值: 活跃值 (1823)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
hhkqqs 活跃值 1 2020-11-26 18:56
6
0
.net的dll依赖库应该挺多的吧,直接射进去和在别人家门口放鞭炮有啥区别
雪    币: 67
活跃值: 活跃值 (486)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
qiusuper 活跃值 2020-11-26 20:32
7
1
脱裤子放屁 多此一举
雪    币: 205
活跃值: 活跃值 (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yy虫子yy 活跃值 2020-11-26 20:42
8
0
没用过c#写挂的飘过
雪    币: 686
活跃值: 活跃值 (137)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flarejune 活跃值 2020-12-24 11:01
9
0
脱裤子放屁 多此一举
雪    币: 1076
活跃值: 活跃值 (387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chinasmu 活跃值 2020-12-24 11:29
10
0
非常棒,C#写起来香多了,冷嘲热讽的脑子大概是有坑,不管好坏总归是多了一种思路
雪    币: 1099
活跃值: 活跃值 (322)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loqich 活跃值 2020-12-24 11:43
11
0
其实现在c#完全可以丢掉GC, 完全native, 参考https://github.com/MichalStrehovsky/SeeSharpSnake
雪    币: 568
活跃值: 活跃值 (1043)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
库尔 活跃值 2020-12-24 11:57
12
0

如果做成一个项目的话,规范很重要,这种高级语言自带的规范能加快开发效率!题主想表达的是这个意思。反正我是赞成的,不然你用C写没异常没协程,项目一复杂的话,加上阅历不深。很有可能走进重新造轮子的坑。

最后于 2020-12-24 11:59 被库尔编辑 ,原因:
雪    币: 200
活跃值: 活跃值 (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Otoboku 活跃值 2020-12-25 14:37
13
0

1.我以为可以脱离c的直接托管代码注入了。

2.c#的代码实在太没安全感了,玩g的没几个人喜欢自己费了牛劲的找到的基址,call,就被别人一个反汇编轻松抢走了


最后于 2020-12-25 14:43 被Otoboku编辑 ,原因:
雪    币: 11
活跃值: 活跃值 (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Cohen 活跃值 2020-12-28 20:48
14
0
国外的LOL脚本都是C#做的吧,
雪    币: 1667
活跃值: 活跃值 (2404)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
舒默哦 活跃值 1 2020-12-28 23:23
15
0
.net都没动静了,感觉都快销声匿迹了。最近还想跟着那些前辈逆向.net的内核,现在感觉没动力了。楼主能给点建议吗
雪    币: 5611
活跃值: 活跃值 (740)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 活跃值 2020-12-29 09:20
16
0
在c#里写asm ,人才 ,长见识了 
雪    币: 191
活跃值: 活跃值 (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cyberspace 活跃值 2021-1-3 21:59
17
1
舒默哦 [em_31].net都没动静了,感觉都快销声匿迹了。最近还想跟着那些前辈逆向.net的内核,现在感觉没动力了。楼主能给点建议吗
现在 net 不是已经开源了吗?
雪    币: 31
活跃值: 活跃值 (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
靴子 活跃值 2021-1-3 22:24
18
0
666
雪    币: 949
活跃值: 活跃值 (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
血易燃奇难了 活跃值 2021-1-15 02:40
20
0
@mudebug   私信您了 请教个问题 看下私信消息 谢谢
雪    币: 2862
活跃值: 活跃值 (1150)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mudebug 活跃值 2021-1-17 16:35
21
0
血易燃奇难了 @mudebug 私信您了 请教个问题 看下私信消息 谢谢
不打算搞外掛呢。
雪    币: 1076
活跃值: 活跃值 (387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chinasmu 活跃值 2021-1-17 23:55
22
0
大佬请问下C#如何向非托管写入数据啊,例如我hook了一个api,其一个参数是指向字符串的指针,我想直接在这个指针指向的地址写字符串覆盖掉旧的,不在内存里新建,除了WriteProcessMemory还有其他方便的办法吗,Marshal.Copy一直失败
雪    币: 2862
活跃值: 活跃值 (1150)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mudebug 活跃值 2021-1-18 01:56
23
0
chinasmu 大佬请问下C#如何向非托管写入数据啊,例如我hook了一个api,其一个参数是指向字符串的指针,我想直接在这个指针指向的地址写字符串覆盖掉旧的,不在内存里新建,除了WriteProcessMemory ...
如果已经注入了。你直接修改参数的地址就好了啊。指向你自己的字符串地址。
雪    币: 949
活跃值: 活跃值 (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
血易燃奇难了 活跃值 2021-1-21 04:32
24
0
mudebug 不打算搞外掛呢。
老板是有其他项目合作和游戏无关
雪    币: 1192
活跃值: 活跃值 (3054)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
supperlitt 活跃值 2021-1-21 17:12
25
0
点赞。
游客
登录 | 注册 方可回帖
返回