555hrc 发表于 2017-6-20 08:44

【内核编程】电焊工自学内核;

本帖最后由 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:13

本帖最后由 555hrc 于 2017-6-21 21:26 编辑

s3233431 发表于 2017-6-20 10:43
VOID MY_JMP_fuction()
{


由于 inline hook 要做的 就是在原 内核函数的 反汇编内加入跳转到自己的代码也就是要加入一句 jmp 我们的函数地址这句话 占用5个字节   那 我们就要把原来内核函数的代码改为这个 jmp函数地址但是这样破坏了原来函数的 栈和 运算所以 必须 要 在我们自己内的函数 实现 一下 在调回到   内核 被我们修改的下一句代码
这段代码 是有问题的 代码   问题我已经找到 下面放出   完整的代码 不过测试   在打开xuetr的时候不知道为什么不兼容 还是怎么得反正就是无法打开xuetr 一旦打开就会   计算机 就会进入   假死状态其他的 程序 还是没有问题的我已经做好 详细注释

s3233431 发表于 2017-6-20 10:43

VOID MY_JMP_fuction()
{

      _asm {
               
               
                pushad
                call MY_CODE
                popad
                mov    ecx, dword ptr
                mov    edx, dword ptr
                jmp VB

      }
}

这段我没看懂

shaddwwalker 发表于 2017-6-20 09:03

好长时间没有沙发乐了

圣城至尊 发表于 2017-6-20 09:08

写的太好了,妈呀,就是俺看不懂啊{:1_907:}

While_Shark 发表于 2017-6-20 09:14

厉害厉害呀

waweiggfnh 发表于 2017-6-20 09:29

这个是用VB写的

伤or悲 发表于 2017-6-20 09:38

我就只能看看

弩哥一怒为红颜 发表于 2017-6-20 09:59

小工干三天,不如焊工点一点,焊工赚得多

sonnenschein 发表于 2017-6-20 10:36

厉害厉害呀

花生土豆 发表于 2017-6-20 13:33

不明真相的围观群众路过……ʅ(´◔౪◔)ʃ
页: [1] 2
查看完整版本: 【内核编程】电焊工自学内核;