【内核编程】电焊工自学内核;
本帖最后由 wushaominkk 于 2018-5-7 11:05 编辑学了很长世间内核,由于基础差一开始 看的脑袋大在内核级 混了一年依然啥也不会 但明白了该怎么写 但是由于基础差C语言都忘得差不多了 写出来的代码总是有错误,
下面贴一个 自己写的 inline 代码有问题我也找不出是哪里错了 MDL inline hook和一般的那种 设置CR0 的有点区别
#include<ntddk.h>
PULONG VA = { 0 };
ULONG VB;
typedefstruct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
}SSDT;
_declspec(dllimport) SSDT KeServiceDescriptorTable;
VOID Unload(PDRIVER_OBJECT driver)
{
}
VOID MY_CODE()
{
KdPrint(("%s",(CHAR*) PsGetCurrentProcess() + 0x16c));
}
__declspec(naked)
VOID MY_JMP_fuction()
{
_asm {
pushad
call MY_CODE
popad
mov ecx, dword ptr
mov edx, dword ptr
jmp VB
}
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING STRING)
{
#if DBG
_asm int 3;
#endif
CHAR source_copy;
PULONG Table_Base = { 0 };
CHAR MY_jmp;
PMDL P_mdl;
ULONG length = 1024;
ULONG jmp_length;
PULONG VA_address;
ULONG VC;
Table_Base =(PULONG) KeServiceDescriptorTable.ServiceTableBase;
P_mdl =IoAllocateMdl((PVOID)Table_Base, length, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(P_mdl);
MmMapLockedPagesSpecifyCache(P_mdl, KernelMode, MmCached, NULL, FALSE, HighPagePriority);
P_mdl->MdlFlags |= MDL_MAPPED_TO_SYSTEM_VA;
VA_address=MmGetSystemAddressForMdlSafe(P_mdl, HighPagePriority);
//VA = (PULONG)(((ULONG)VA_address) + 0x13);
VA = (PULONG)((ULONG)VA_address + 0x13);
VB = (ULONG)(((ULONG)VA )+ 0x6);
VC = VB;
jmp_length = (ULONG)MY_JMP_fuction - ((ULONG)VA) - 0x6;
MY_jmp = 0x90;
MY_jmp = 0xE9;
*(PULONG)&MY_jmp = (ULONG)jmp_length;
RtlCopyMemory((VOID*)(source_copy), (VOID*)VA, 6); //拷贝源 地址处的代码
RtlCopyMemory((VOID*)VA, MY_jmp, 6);//写入跳转代码
driver->DriverUnload = Unload;
return STATUS_SUCCESS; 本帖最后由 555hrc 于 2017-6-21 21:26 编辑
s3233431 发表于 2017-6-20 10:43
VOID MY_JMP_fuction()
{
由于 inline hook 要做的 就是在原 内核函数的 反汇编内加入跳转到自己的代码也就是要加入一句 jmp 我们的函数地址这句话 占用5个字节 那 我们就要把原来内核函数的代码改为这个 jmp函数地址但是这样破坏了原来函数的 栈和 运算所以 必须 要 在我们自己内的函数 实现 一下 在调回到 内核 被我们修改的下一句代码
这段代码 是有问题的 代码 问题我已经找到 下面放出 完整的代码 不过测试 在打开xuetr的时候不知道为什么不兼容 还是怎么得反正就是无法打开xuetr 一旦打开就会 计算机 就会进入 假死状态其他的 程序 还是没有问题的我已经做好 详细注释
VOID MY_JMP_fuction()
{
_asm {
pushad
call MY_CODE
popad
mov ecx, dword ptr
mov edx, dword ptr
jmp VB
}
}
这段我没看懂 好长时间没有沙发乐了 写的太好了,妈呀,就是俺看不懂啊{:1_907:} 厉害厉害呀 这个是用VB写的 我就只能看看 小工干三天,不如焊工点一点,焊工赚得多 厉害厉害呀 不明真相的围观群众路过……ʅ(´◔౪◔)ʃ
页:
[1]
2