找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 40227|回复: 56

[半原创]六一儿童节礼物:恢复Kernel Inline Hook(第一季)

 火... [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-5-24 17:05:26 | 显示全部楼层 |阅读模式
有不少儿童被Inline Hook弄得很不爽,又不懂得如何恢复。
于是我特地写了个DLL和SYS,用来恢复任意Inline Hook(给出地址就行)。
有重定位代码,不用担心出错。里面的DLL和SYS暂不开源,可直接IDA+F5。
======
遇到什么问题请回帖,我考完试去旅游前会统一作答。
pic.JPG

exe.rar

27.88 KB, 下载次数: 31

售价: 1 水晶币  [记录]

src.rar

32.46 KB, 下载次数: 56

售价: 10 水晶币  [记录]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-5-24 17:05:51 | 显示全部楼层
沙发自己占。

16

主题

81

回帖

0

精华

银牌会员

积分
611
发表于 2010-5-24 22:17:14 | 显示全部楼层
全被你抢去了,断人活路啊

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-5-25 22:30:53 | 显示全部楼层
很神奇的东西。。
本网站最菜的人 该用户已被删除
发表于 2010-5-28 22:21:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
本网站最菜的人 该用户已被删除
发表于 2010-5-28 22:51:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-5-28 23:32:12 | 显示全部楼层
unhook.sys没有什么技术含量,copymemory而已。
dll.dll才是精髓,逆了一下,dll函数的原型应该是:
Declare Sub ReInlineInit Lib "dll.dll" Alias "#2" ()
Declare Sub GetByte Lib "dll.dll" Alias "#1" (ByVal 目标地址 As Long, ByRef 返回的字节 As Byte)
如果说错了,还请HD指教啊。
本网站最菜的人 该用户已被删除
发表于 2010-5-29 22:20:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-5-30 20:09:15 | 显示全部楼层
回复 10# 本网站最菜的人


回拜

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 15:11:25 | 显示全部楼层
unhook.sys没有什么技术含量,copymemory而已。
dll.dll才是精髓,逆了一下,dll函数的原型应该是:
Decl ...
乔丹二世 发表于 2010-5-28 23:32


逆向得很正确,不愧是学校研发中心的人。
顺便说一下,ReInlineInit在Form_Load中调用一次就可以了,不能多次调用,否则适得其反。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 15:31:17 | 显示全部楼层
既然都被人逆向出来了,那我就公布vb部分的源码吧:

  1. Option Explicit

  2. Private Declare Sub ReInlineInit Lib "dll.dll" Alias "#2" ()
  3. Private Declare Sub GetByte Lib "dll.dll" Alias "#1" (ByVal TargetAddr As Long, ByRef rtb As Byte)
  4. Private DrvController As New cls_Driver

  5. Private Type stUNHOOK
  6.     TarAddr As Long
  7.     Length As Long
  8.     OrigiData(260) As Byte
  9. End Type

  10. Private Sub Command1_Click() '得到内核函数机器码
  11.     On Error Resume Next '需要ulong,但是vb没有ulong,所以会出现dll调用约定错误,不过无所谓
  12.     'get bytes
  13.     Dim kfb As Byte, i As Long
  14.     Dim TarAdr As Long: TarAdr = Val("&H" & Text1.Text)
  15.     List1.Clear
  16.     For i = 0 To CLng(Text2.Text) - 1
  17.         Call GetByte(TarAdr + i, kfb)
  18.         List1.AddItem String(2 - Len(Hex(kfb)), "0") & Hex(kfb)
  19.     Next
  20.     'restore
  21.     Dim xx As stUNHOOK
  22.     xx.Length = CLng(Text2.Text)
  23.     xx.TarAddr = Val("&H" & Text1.Text)
  24.     For i = 0 To xx.Length - 1
  25.         xx.OrigiData(i) = Val("&H" & List1.List(i))
  26.     Next
  27.     With DrvController
  28.         .IoControl .CTL_CODE_GEN(&H801), VarPtr(xx), Len(xx), 0, 0
  29.     End With
  30. End Sub

  31. Private Sub Form_Load() '初始化
  32.     ReInlineInit '重定位
  33.     With DrvController '加驱动
  34.         .szDrvFilePath = Replace(App.Path & "\UNHOOK.sys", "\", "")
  35.         .szDrvLinkName = "UNHOOK"
  36.         .szDrvDisplayName = "UNHOOK"
  37.         .szDrvSvcName = "UNHOOK"
  38.         .InstDrv
  39.         .StartDrv
  40.         .OpenDrv
  41.     End With
  42.     If DrvController.OpenDrv = False Then MsgBox "驱动加载失败", 64, "": End
  43. End Sub

  44. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  45.     With DrvController
  46.         .StopDrv
  47.         .DelDrv
  48.     End With
  49. End Sub
复制代码

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 15:41:40 | 显示全部楼层

好人做到底,连dll的代码一起公布了吧。

dll.cpp:

  1. #include "stdafx.h"
  2. #include "dll.h"
  3. #include "ntdll.h"
  4. typedef struct _MODULES
  5. {
  6.    ULONG    NumberOfModules; //模块个数
  7.    SYSTEM_MODULE  Modules[MAX_PATH];//偷懒
  8. } MODULES, *PMODULES;
  9. HMODULE hKernel;
  10. ULONG KernelBase;
  11. BOOLEAN bInit=FALSE;

  12. ULONG Reloc(ULONG lpBase, ULONG VirtualAddress )
  13. {
  14. PIMAGE_DOS_HEADER  pDosHeader;
  15. PIMAGE_NT_HEADERS  pNtHeader;
  16. PIMAGE_BASE_RELOCATION pRelocTable;
  17. ULONG i,dwOldProtect;
  18. pDosHeader = (PIMAGE_DOS_HEADER)lpBase;
  19. if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
  20.   return 0;
  21. pNtHeader =(PIMAGE_NT_HEADERS)( (ULONG)lpBase + pDosHeader->e_lfanew );//厉行检查
  22. if (pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)//是否存在重定位表
  23. {
  24.   pRelocTable=(PIMAGE_BASE_RELOCATION)((ULONG)lpBase + pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
  25.   do
  26.   {
  27.    ULONG numofReloc=(pRelocTable->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2;
  28.    SHORT minioffset=0;
  29.    PUSHORT pRelocData=(PUSHORT)((ULONG)pRelocTable+sizeof(IMAGE_BASE_RELOCATION));
  30.    for (i=0;i<numofReloc;i++)//循环,或直接判断*pData是否为0也可以作为结束标记
  31.    {
  32.     PULONG RelocAddress;//需要重定位的地址
  33.     //重定位的高4位是重定位类型,
  34.     if (((*pRelocData)>>12)==IMAGE_REL_BASED_HIGHLOW)//判断重定位类型是否为IMAGE_REL_BASED_HIGHLOW
  35.     {
  36.      //计算需要进行重定位的地址
  37.      //重定位数据的低12位再加上本重定位块头的RAV即真正需要重定位的数据的RAV
  38.      minioffset=(*pRelocData)&0xFFF;//小偏移
  39.      //模块基址+重定位基址+每个数据表示的小偏移量
  40.      RelocAddress=(PULONG)(lpBase+pRelocTable->VirtualAddress+minioffset);

  41.      //直接在RING3修改:原始数据+基址-IMAGE_OPTINAL_HEADER中的基址
  42.      VirtualProtect((PVOID)RelocAddress, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);//因为是R3直接LOAD的 所以要修改一下内存权限
  43.      *RelocAddress=*RelocAddress+VirtualAddress-pNtHeader->OptionalHeader.ImageBase;
  44.      VirtualProtect((PVOID)RelocAddress, 4, dwOldProtect, NULL);
  45.     }
  46.     //下一个重定位数据
  47.     pRelocData++;
  48.    }
  49.    //下一个重定位块
  50.    pRelocTable=(PIMAGE_BASE_RELOCATION)((ULONG)pRelocTable+pRelocTable->SizeOfBlock);
  51.   }while (pRelocTable->VirtualAddress);
  52.   return TRUE;
  53. }
  54. return FALSE;
  55. }

  56. ULONG GetKernelPath(char * Kernel)
  57. {
  58. MODULES Drivers;
  59. ULONG Count;
  60. NTSTATUS status=NtQuerySystemInformation(SystemModuleInformation,&Drivers,sizeof(Drivers),&Count);
  61. if (NT_SUCCESS(status))
  62. {
  63.   if (Kernel)
  64.   {
  65.    lstrcpyA(Kernel,Drivers.Modules[0].ImageName+Drivers.Modules[0].ModuleNameOffset );
  66.   }
  67.   return (ULONG)Drivers.Modules[0].Base;
  68. }
  69. return FALSE;
  70. }

  71. BOOL Init()
  72. {
  73. CHAR szKernelName[MAX_PATH];
  74. KernelBase=GetKernelPath(szKernelName);
  75. if (KernelBase)
  76. {
  77.   hKernel=LoadLibraryExA(szKernelName, 0, DONT_RESOLVE_DLL_REFERENCES);
  78.   if (hKernel)
  79.   {
  80.    Reloc((ULONG)hKernel,KernelBase);//重定位
  81.    return TRUE;
  82.   }
  83. }
  84. return FALSE;
  85. }

  86. ULONG   htoi(char   *str)   
  87. {   
  88. ULONG   i=0,   j,   dec=0,   t;   
  89. j=strlen(str);   
  90. if(*str=='0')   i=2;   
  91. while(i<j)   
  92. {   
  93.   dec<<=4;   
  94.   t=*(str+i++);   
  95.   if(t<58)   t-=48;   
  96.   if(t>64&&t<71)   t-=55;   
  97.   if(t>96&&t<103)   t-=87;   
  98.   dec|=t;   
  99. }   
  100. return   dec;   
  101. }   

  102. DLL_API VOID ReInlineInit()
  103. {
  104. if(bInit==FALSE)
  105. {
  106.   Init();
  107.   bInit=TRUE;
  108. }
  109. }

  110. DLL_API VOID GetByte(ULONG TarAddr, PBYTE rtb)
  111. {
  112. ULONG tmpaddr=TarAddr-KernelBase+(ULONG)hKernel;
  113. *rtb=*(PBYTE)tmpaddr;
  114. }
复制代码

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 15:42:38 | 显示全部楼层

好人做到底,连dll的代码一起公布了吧。

dll.h:

  1. #ifdef DLL_EXPORTS
  2. #define DLL_API __declspec(dllexport)
  3. #else
  4. #define DLL_API __declspec(dllimport)
  5. #endif
  6. DLL_API VOID ReInlineInit();
  7. DLL_API VOID GetByte(ULONG TarAddr, PBYTE rtb);
复制代码
本网站最菜的人 该用户已被删除
发表于 2010-6-5 19:13:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 20:08:22 | 显示全部楼层
回复  Tesla.Angela

学习 + 膜拜
PS1:重定位的代码........
PS2:对某种WS的HOOK无效
本网站最菜的人 发表于 2010-6-5 19:13


PS1:这个是拼凑的,算是半原创吧。
PS2:SSDT HOOK ZwCreateFile。
本网站最菜的人 该用户已被删除
发表于 2010-6-5 20:22:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 20:23:39 | 显示全部楼层
回复 18# 本网站最菜的人

Inline Hook IoCreateFile。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 20:26:06 | 显示全部楼层
回复  Tesla.Angela
我是指对某种INLINE HOOK 方式无效
本网站最菜的人 发表于 2010-6-5 20:22



刚才没看到“方式”二字。
以前好像听谁说过,某种Inline Hook,一恢复就会把函数完全搞乱。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-6-5 21:41:34 | 显示全部楼层
膜拜一下......完全看不懂@_@
我就是嗷嗷叫的老马了......

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-6-5 23:18:32 | 显示全部楼层
本帖最后由 Tesla.Angela 于 2010-6-5 23:20 编辑

还有驱动的源码:

  1. #include <NTDDK.H>
  2. #include <windef.h>

  3. #define NT_DEVICE_NAME              L"\\Device\\UnHook"
  4. #define DOS_DEVICE_NAME             L"\\DosDevices\\UnHook"
  5. #define IOCTL_UnHook                                CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)

  6. typedef struct _Unhook {
  7.    ULONG        TarAddr; //目标地址
  8.    ULONG        Length;        //需要覆盖的长度
  9.    BYTE                OrigiData[MAX_PATH];//原始数据
  10. } UNHOOK, *PUNHOOK;

  11. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
  12. NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
  13. NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
  14. VOID UnloadDriver(IN PDRIVER_OBJECT DriverObject );


  15. void MemOpen()
  16. {
  17.         __asm {   
  18.                 cli
  19.                         mov  eax,cr0
  20.                         and  eax,not 10000h
  21.                         mov  cr0,eax
  22.         }
  23. }


  24. void MemClose()
  25. {
  26.         __asm {   
  27.                 mov  eax,cr0
  28.                         or   eax,10000h
  29.                         mov  cr0,eax
  30.                         sti
  31.         }
  32. }


  33. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
  34. {

  35.         UNICODE_STRING   uniDeviceName;
  36.         UNICODE_STRING   uniSymLink;
  37.         NTSTATUS         ntStatus;
  38.         PDEVICE_OBJECT   deviceObject = NULL;

  39.         RtlInitUnicodeString(&uniDeviceName, NT_DEVICE_NAME);
  40.         RtlInitUnicodeString(&uniSymLink, DOS_DEVICE_NAME);

  41.         DriverObject->MajorFunction[IRP_MJ_CREATE] =
  42.                 DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
  43.         DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
  44.         DriverObject->DriverUnload = UnloadDriver;

  45.         ntStatus = IoCreateDevice(DriverObject, 0,&uniDeviceName,FILE_DEVICE_UNKNOWN,
  46.                                                                 FILE_DEVICE_SECURE_OPEN, FALSE,&deviceObject);

  47.         if (!NT_SUCCESS(ntStatus)) return ntStatus;

  48.     ntStatus = IoCreateSymbolicLink(&uniSymLink, &uniDeviceName);

  49.         if (!NT_SUCCESS(ntStatus))
  50.         {
  51.                 IoDeleteDevice(deviceObject);
  52.                 return ntStatus;
  53.         }

  54.         //DbgPrint("driver loaded!\n");
  55.     return STATUS_SUCCESS;
  56. }


  57. NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
  58. {
  59.         pIrp->IoStatus.Information = 0;
  60.         pIrp->IoStatus.Status = STATUS_SUCCESS;
  61.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  62.         return STATUS_SUCCESS;
  63. }


  64. NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT pDevObj,IN  PIRP pIrp)
  65. {
  66.         
  67.         NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;//STATUS_UNSUCCESSFUL;//
  68.         PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  69.         ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  70.         ULONG inBufLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
  71.         ULONG outBufLength =pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
  72.                
  73.         PVOID OutputBuffer = pIrp->UserBuffer;
  74.         PVOID InputBuffer  = pIrp->AssociatedIrp.SystemBuffer;

  75.         switch(uIoControlCode)
  76.         {
  77.                 case IOCTL_UnHook:
  78.                         {
  79.                                 UNHOOK UnHook={0};

  80.                                 memcpy(&UnHook,InputBuffer,sizeof(UNHOOK));

  81.                                 MemOpen();
  82.                                 memcpy((PVOID)UnHook.TarAddr,UnHook.OrigiData,UnHook.Length);
  83.                                 MemClose();
  84.                                 ntStatus = STATUS_SUCCESS;
  85.                                 break;
  86.                         }
  87.         }

  88.         pIrp->IoStatus.Status = ntStatus;
  89.         //pIrp->IoStatus.Information = outBufLength;
  90.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  91.         return ntStatus;
  92. }


  93. VOID UnloadDriver( IN PDRIVER_OBJECT DriverObject )
  94. {
  95.         PDEVICE_OBJECT    deviceObject = DriverObject->DeviceObject;
  96.         UNICODE_STRING    uniSymLink;

  97.         RtlInitUnicodeString(&uniSymLink, DOS_DEVICE_NAME);
  98.         
  99.         //DbgPrint("driver unloaded.\n");
  100.         IoDeleteSymbolicLink(&uniSymLink);
  101.         IoDeleteDevice(deviceObject);
  102. }
复制代码

需要说的是,这样子修改内核数据蓝屏的可能性很大,建议大家参考MySystemDebugControl修改内核数据的方法。

2

主题

46

回帖

0

精华

铜牌会员

积分
61
发表于 2010-6-7 22:01:58 | 显示全部楼层
感謝大牛分享@@

16

主题

81

回帖

0

精华

银牌会员

积分
611
发表于 2010-6-8 20:59:38 | 显示全部楼层
木有那么多钱

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-6-10 14:02:52 | 显示全部楼层
楼上没钱!?!

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-6-16 16:17:11 | 显示全部楼层
回来看看
HD还是这么猛

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-6-16 19:27:48 | 显示全部楼层
OK大哥,很久不见了!
听说你最近学汇编去了?
如果附件无法下载,请点击这里
本网站最菜的人 该用户已被删除
发表于 2010-6-16 20:22:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

8

回帖

0

精华

初来乍到

积分
18
发表于 2010-7-19 15:17:49 | 显示全部楼层
下载回来看看,谢谢分享。。。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-7-19 19:28:04 | 显示全部楼层
回复 29# bigwahaha


读取内核文件原始数据的方式不底层,很容易被bypass。

0

主题

20

回帖

0

精华

初来乍到

积分
0
发表于 2010-7-23 21:32:52 | 显示全部楼层
多重跳hook也行?

0

主题

9

回帖

0

精华

初来乍到

积分
0
发表于 2010-7-31 12:48:44 | 显示全部楼层
Inline有几个我都不知道。‘ms太可恶了,有一大打不开源

0

主题

34

回帖

0

精华

铜牌会员

积分
44
发表于 2010-8-4 07:57:01 | 显示全部楼层
膜拜下!~·······

2

主题

17

回帖

0

精华

铜牌会员

积分
35
发表于 2010-9-7 02:20:32 | 显示全部楼层
没钱,下不了。。我表示很无奈..!

评分

参与人数 1水晶币 +10 收起 理由
马大哈 + 10 送你10分:)

查看全部评分

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表