首页
社区
课程
招聘
[原创].net也能写内存挂
发表于: 2020-11-26 10:51 17953

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

2020-11-26 10:51
17953

最近在研究.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 这样就完整的跑通调用了。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-10-9 02:54 被mudebug编辑 ,原因:
上传的附件:
收藏
免费 11
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  caizz   +1.00 2022/03/03
最新回复 (34)
雪    币: 0
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享
2020-11-26 11:20
0
雪    币: 48
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
拿走了,c#写起来太舒服了
2020-11-26 17:11
0
雪    币: 48
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
额,纯c#不行吗
2020-11-26 18:00
0
雪    币: 300
活跃值: (2447)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2020-11-26 18:26
0
雪    币: 12314
活跃值: (5834)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
.net的dll依赖库应该挺多的吧,直接射进去和在别人家门口放鞭炮有啥区别
2020-11-26 18:56
0
雪    币: 57
活跃值: (2433)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
脱裤子放屁 多此一举
2020-11-26 20:32
1
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没用过c#写挂的飘过
2020-11-26 20:42
0
雪    币: 688
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
脱裤子放屁 多此一举
2020-12-24 11:01
0
雪    币: 6258
活跃值: (3320)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
非常棒,C#写起来香多了,冷嘲热讽的脑子大概是有坑,不管好坏总归是多了一种思路
2020-12-24 11:29
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
其实现在c#完全可以丢掉GC, 完全native, 参考https://github.com/MichalStrehovsky/SeeSharpSnake
2020-12-24 11:43
0
雪    币: 1319
活跃值: (1945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

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

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

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

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


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