首页
社区
课程
招聘
[分享]易语言重载内核!
2015-5-28 08:23 17765

[分享]易语言重载内核!

2015-5-28 08:23
17765
本菜鸟今天刚转正,成为正式会员,之前发现论坛基本没有关于易语言的帖子,今天就借这个机会发个易语言重载内核的源码! 由于我刚接触游戏保护,还有很多不懂的地方,请大牛给个研究保护的步骤,   我现在会重载内核,请问下一步该从哪儿入手呢?  

好了,直接上易语言重载内核代码!  对于易语言,大神们都别喷,能达目的的语言都是好语言  领附QQ: 564673226   欢迎伙伴一起成长!

.版本 2

.子程序 重载内核, 整数型
.局部变量 hFile, 整数型
.局部变量 文件信息, 文件标准信息
.局部变量 IoStatusBlock, IO_STATUS_BLOCK
.局部变量 FileOffset, LARGE_INTEGER
.局部变量 Date, 字节集
.局部变量 pDate, 整数型
.局部变量 Dosheader, IMAGE_DOS_HEADER
.局部变量 Ntheader, IMAGE_NT_HEADERS
.局部变量 Sectionheader, IMAGE_SECTION_HEADER, , "0"
.局部变量 i, 整数型
.局部变量 VirtualSize, 整数型
.局部变量 SectionSize, 整数型
.局部变量 新内核地址, 整数型

hFile = 文件_打开 (“C:\Windows\system32\ntkrnlpa.exe”, #读写, #无限制)
.如果真 (hFile = 0)
    DbgPrint (“打开文件失败”)
    ZwClose (hFile)
    返回 (0)

.如果真结束
文件信息 = 文件_取信息 (hFile)
FileOffset.LowPart = 0
文件_读取数据 (hFile, Date, , FileOffset)
pDate = 取变量地址_字节集型_ (Date)
.如果真 (读内存字节_ (pDate, 0) ≠ 77)
    DbgPrint (“错误->读内存字节_ (pDate, 0) ≠ 77”)
    ZwClose (hFile)
    返回 (0)
.如果真结束
' RtlMoveMemory_IMAGE_DOS_HEADER_1 (Dosheader, pDate, 64)
memcpy_Dos (Dosheader, pDate, 64)
.如果真 (Dosheader.e_magic ≠ 23117)
    DbgPrint (“错误->Dosheader.e_magic ≠ 23117”)
    ZwClose (hFile)
    返回 (0)
.如果真结束
memcpy_Nt (Ntheader, pDate + Dosheader.e_lfanew, 248)
.如果真 (Ntheader.Signature ≠ 17744)
    DbgPrint (“Ntheader.Signature ≠ 17744”)
    ZwClose (hFile)
    返回 (0)
.如果真结束
重定义数组 (Sectionheader, 假, Ntheader.FileHeader.NumberOfSections)
.变量循环首 (0, Ntheader.FileHeader.NumberOfSections - 1, 1, i)
    memcpy_cection (Sectionheader [i + 1], pDate + Dosheader.e_lfanew + 248 + i × 40, 40)
    VirtualSize = 位与 (Sectionheader [i + 1].Misc, 65535)
    SectionSize = GetAlignedSize (Sectionheader [i + 1].VirtualAddress + 选择 (Sectionheader [i + 1].SizeOfRawData > VirtualSize, Sectionheader [i + 1].SizeOfRawData, VirtualSize), Ntheader.OptionalHeader.SectionAlignment)
    Ntheader.OptionalHeader.SizeOfImage = 选择 (SectionSize > Ntheader.OptionalHeader.SizeOfImage, SectionSize, Ntheader.OptionalHeader.SizeOfImage)
.变量循环尾 ()

' 新内核地址 = 申请_内存 (Ntheader.OptionalHeader.SizeOfImage)

新内核地址 = ExAllocatePool (0, Ntheader.OptionalHeader.SizeOfImage)

.如果真 (新内核地址 = 0)
    DbgPrint (“错误->申请内存失败”)
    ZwClose (hFile)
    ExFreePool (新内核地址)
    返回 (0)
.如果真结束
memcpy (新内核地址, pDate, Dosheader.e_lfanew + 248 + Ntheader.FileHeader.NumberOfSections × 40)
.计次循环首 (Ntheader.FileHeader.NumberOfSections, i)
    memcpy (新内核地址 + Sectionheader [i].VirtualAddress, pDate + Sectionheader [i].PointerToRawData, Sectionheader [i].SizeOfRawData)
.计次循环尾 ()
基址重定位 (新内核地址)
ZwClose (hFile)
DbgPrintInt (“新内核地址=%X”, 新内核地址)
NewImage = 新内核地址
SSDT重定位 (NewImage)
返回 (新内核地址)

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (35)
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
evionmzs 2015-5-28 08:34
2
0
不知道用起来简单不?感觉没有C++的基础,很难读懂这段代码
雪    币: 750
活跃值: (2692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tmflxw 2015-5-28 08:56
3
0
把代码复制到易语言界面就清楚了,这上面确实不好看,
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Anzun 2015-5-28 09:35
4
0
居然完全看不懂。
雪    币: 10309
活跃值: (2270)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tomtory 2015-5-28 09:35
5
0
麻烦LZ把自定义数据类型, DLL声明都贴一下吧。
上源代码更好
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aait 2015-5-28 09:41
6
0
咋还有
    DbgPrint (“错误->申请内存失败”)
    ZwClose (hFile)
    ExFreePool (新内核地址)
    memcpy (新内核地址, pDate, Dosheader.e_lfanew + 248 + numberOfSections × 40)
这些英文函数呢?
要是是下面这样的话就好了。
    输出调试信息(“错误->申请内存失败”)
    关闭句柄 (hFile)
    释放内存池(新内核地址)
    复制内存(新内核地址, pDate, Dosheader.e_lfanew + 248 + numberOfSections × 40)
如果是这样,我想没学过编程的,也能看懂个大概。
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
onebody 2015-5-28 09:51
7
0
还在比较容易理解的
雪    币: 256
活跃值: (48)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
kz丶cn 2015-5-28 09:58
8
0
这叫源码...笑了 基址重定位 和修复SSDT的函数是关键好吗  你怎么得到KiFastCallEntry函数地址? 硬编码?
不是喷易语言 你这只是把某段代码用易语言翻译了一遍吧.
雪    币: 168
活跃值: (193)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
猪头三 3 2015-5-28 11:01
9
0
看着满满的WIN API,我也是醉。你的 memcpy ,应该改用 内存复制, 用中文比较好,一堆英文,谁看得懂呀。
雪    币: 4581
活跃值: (942)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
b23526 2015-5-28 11:25
10
0
好吧哥还是忍不住笑了
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
友情zyj 2015-5-28 13:34
11
0
在易语言上面真是瞎费功夫
雪    币: 20
活跃值: (242)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
GeekCheng 2 2015-5-28 13:37
12
0
我要笑喷了
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hnllhuihui 2015-5-28 15:54
13
0
呵呵,想不笑喷都难哪!
不说易语言调用Win32 API,相关函数和关键变量重定位也没有...
况且只在Ring3层折腾能做到想要的操作吗?
雪    币: 168
活跃值: (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bunnyrene 2015-5-28 16:13
14
0
看着看着就醉了
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xazjg 2015-5-28 16:29
15
0
楼主辛苦了,,
雪    币: 1626
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
红颜世家、 2015-5-28 16:49
16
0
感觉看着好乱...
雪    币: 750
活跃值: (2692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tmflxw 2015-5-28 16:59
17
0
哎,发这个果然是挨喷啊,既然有人说这是r3的,那我就干脆好人做到底,明早下班回来直接传源码,包括hook  kifastcallentry  基址重定位  ssdt重定位的   需要的顶下,大家就别喷易语言了  比c的就是编译文件大点   其他感觉挺方便的……
雪    币: 750
活跃值: (2692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tmflxw 2015-5-28 17:18
18
0
你看下哪里有win32?兄弟没玩过易语言吧??
雪    币: 277
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Kernal 2015-5-28 17:50
19
0
楼主真是NB哄哄啊!
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伴心与暖 2015-5-28 23:03
20
0
啥也不说期待源码。能用就行不分语言
雪    币: 6816
活跃值: (8580)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
无名侠 12 2015-5-28 23:41
21
0
还不如c看着舒服
雪    币: 2171
活跃值: (1819)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
方小小小真 2015-5-29 01:57
22
0
新人表示不会,看不懂
雪    币: 56
活跃值: (643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ratmyy 2015-5-29 03:55
23
0
就这代码怎么看出来不是R3?要是靠一堆所谓的模块,来完成R0操作。这代码有什么价值?这叫懂了?R0地下C都嫌麻烦,很多地方直接就汇编了,用这个封装再封装,还不知道里面封了啥的东西?对蓝屏就那么有爱?

如果还是驱动+api,那为什么不用更高效灵活底层的C实现?

PS:十分想知道出了问题楼主怎么调试,还是说楼主天赋异禀代码根本不用调试。
雪    币: 56
活跃值: (643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ratmyy 2015-5-29 03:58
24
0
你觉得涉及到r0的操作,不直接用api,用这些封装的私有函数很高明?别这样求求你了。
雪    币: 750
活跃值: (2692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tmflxw 2015-5-29 07:00
25
0
我只能感叹句,易语言真不容易啊,内核函数换了个名字而已就没人认识了变成封装了,其实除了不支持指针,自定义数据类型要自己计算大小,编译出来后多了个外壳程序,其他真跟c没啥区别啊……至于调试么,直接代码中间   置入代码(204),这命令就可以了,然后windbg跟起走……
游客
登录 | 注册 方可回帖
返回