本菜鸟今天刚转正,成为正式会员,之前发现论坛基本没有关于易语言的帖子,今天就借这个机会发个易语言重载内核的源码! 由于我刚接触游戏保护,还有很多不懂的地方,请大牛给个研究保护的步骤, 我现在会重载内核,请问下一步该从哪儿入手呢?
好了,直接上易语言重载内核代码! 对于易语言,大神们都别喷,能达目的的语言都是好语言 领附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)
返回 (新内核地址)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!