挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运IOS签名/udid证书出售/送证书加群1040456405 ██【我要租此广告位】██
... .
查看: 10216|回复: 7
打印 上一主题 下一主题

[转载] 在HS下可读写内存的驱动

[复制链接]
4中级会员
320/600

320

积分

110

主题

6

听众
已帮网友解决0 个问题
好评
0
贡献
210
海币
2942
交易币
0
跳转到指定楼层
楼主
发表于 2015-2-13 21:41:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


  1. #include<ntddk.h>
  2. /*
  3. 初学驱动  参读堕落天才ssdt hook 对抗inline hook
  4. 哪里有错或者有比这个还简单的方法还请大神指点一下 好让我从中得到启发 thx
  5.                                               By Bleach=darkmax
  6. */
  7. typedef unsigned char BYTE;




  8. typedef struct _SYSTEM_MODULE_INFORMATION {
  9.     ULONG reserved[2];
  10.     PVOID Base;
  11.     ULONG Size;
  12.     ULONG Flags;
  13.     USHORT Index;
  14.     USHORT Unknown;
  15.     USHORT LoadCount;
  16.     USHORT ModuleNameOffset;            
  17.     CHAR ImageName[255];  
  18. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;  // ZwQuerySystemInformation需要的数据结构

  19. NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(
  20.   ULONG num,
  21.   PVOID SystemInformation,
  22.   ULONG SystemInformationLength,
  23.   PULONG ReturnLength
  24. );



  25. typedef struct _SERVICE_DESCRIPTOR_TABLE
  26. {
  27.   PVOID   ServiceTableBase;
  28.   PULONG  ServiceCounterTableBase;
  29.   ULONG   NumberOfService;
  30.   ULONG   ParamTableBase;
  31. }SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了
  32. extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数

  33. /////////////////////////////////////
  34. VOID Hook();
  35. VOID Unhook();
  36. VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
  37. //////////////////////////////////////
  38. ULONG JmpAddress;//跳转到NtOpenProcess里的地址
  39. ULONG JmpAddress1;
  40. ULONG JmpAddress2;
  41. ULONG OldServiceAddress;//原来NtOpenProcess的服务地址
  42. ULONG OldServiceAddress1;
  43. ULONG OldServiceAddress2;
  44. BYTE dthq[4]={0};
  45. BYTE hqdt[4]={0};
  46. BYTE dthq1[1]={0};
  47. BYTE hqdt1[4]={0};
  48. BYTE dthq2[1]={0};
  49. BYTE hqdt2[4]={0};

  50. PVOID newop=0;
  51. PVOID newop1=0;
  52. PVOID newop2=0;
  53. PVOID newop3=0;
  54. PVOID newop4=0;
  55. PVOID newop5=0;

  56. ULONG getid=0;


  57. PVOID GetFuncAddress()
  58. {
  59.     ULONG size,index;
  60.     PULONG buf;
  61.     ULONG i;
  62.     PSYSTEM_MODULE_INFORMATION module;
  63.     PVOID driverAddress = 0;
  64.     ULONG ntosknlBase;
  65.     ULONG ntosknlEnd;
  66.     ULONG curAddr;
  67.     NTSTATUS status;
  68.     ULONG k;
  69.     ULONG retAddr;
  70.     ULONG code_1 = 0x00a16480, code_2 = 0x50000000, code_3 = 0x1024448b,
  71.           code_4 = 0x10246c89;  //定义特征码,通过Windbg的dd来找

  72.     ZwQuerySystemInformation(11,&size,0,&size);  // 第一个参数其实是个enum,11 - SystemModuleInformation,为了保持简洁,我可耻的没放出定义。
  73.     buf = (PULONG) ExAllocatePool(PagedPool,size);
  74.     if(buf == NULL)
  75.         return NULL;
  76.     status = ZwQuerySystemInformation(11,buf,size,0); // 上一次调用得到大小,此次得到数据。
  77.     if(!NT_SUCCESS(status))
  78.     {
  79.         return NULL;
  80.     }
  81.     module = (PSYSTEM_MODULE_INFORMATION)((PULONG)buf + 1);
  82.     ntosknlEnd = (ULONG)module->Base + (ULONG)module->Size;
  83.     ntosknlBase = (ULONG)module->Base;    //ntosknl的基地址
  84.     curAddr = ntosknlBase;
  85.     ExFreePool(buf);
  86.     for(i = curAddr; i<=ntosknlEnd; i++) //从头开始搜,当然,如果知道未导出函数前一个函数和后一个函数的信息,就可以减小范围,详见pediy的sysnap的方法。
  87.     {

  88.         if( (*((ULONG*)i)) == code_1      &&
  89.             (*((ULONG*)(i+4)) == code_2) &&
  90.             (*((ULONG*)(i+8)) == code_3) &&
  91.             (*((ULONG*)(i+12)) == code_4) )
  92.             {
  93.                 retAddr = i;
  94.                 //DbgPrint("Target Found! Address: 0x%08x\n",retAddr);
  95.                 return retAddr;
  96.             }
  97.     }
  98. }
  99. //////////////////////////////////////

  100. __declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,
  101.                ACCESS_MASK DesiredAccess,
  102.                POBJECT_ATTRIBUTES ObjectAttributes,
  103.                PCLIENT_ID ClientId)
  104. {
  105. // DbgPrint("NtOpenProcess() called");
  106.   
  107. __asm
  108. {
  109.    push [dthq]
  110.    push [hqdt]
  111.    call [getid]
  112.    jmp  [JmpAddress]  
  113. }
  114. }
  115. ///////////////////////////////////////////////////
  116. __declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory(  
  117.   IN HANDLE               ProcessHandle,
  118.   IN PVOID                BaseAddress,
  119.   OUT PVOID               Buffer,
  120.   IN ULONG                NumberOfBytesToRead,
  121.   OUT PULONG              NumberOfBytesReaded OPTIONAL)
  122. {
  123.    __asm{
  124.    push [dthq1]
  125.    push [hqdt1]
  126.    call [getid]
  127.      jmp     [JmpAddress1]
  128.         }  
  129. }
  130. //===================================================
  131. __declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory(
  132.   IN HANDLE               ProcessHandle,
  133.   IN PVOID                BaseAddress,
  134.   IN PVOID                Buffer,
  135.   IN ULONG                BufferLength,
  136.   OUT PULONG              ReturnLength OPTIONAL)
  137. {
  138.    __asm{
  139.    push [dthq2]
  140.    push [hqdt2]
  141.    call [getid]
  142.    jmp [JmpAddress2]
  143.         }

  144. }
  145. //////////////////////////////////////////////
  146. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
  147. {
  148.   DriverObject->DriverUnload = OnUnload;
  149.   DbgPrint("Unhooker load");
  150.   Hook();
  151.   return STATUS_SUCCESS;
  152. }
  153. /////////////////////////////////////////////////////
  154. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
  155. {
  156.   DbgPrint("Unhooker unload!");
  157.   Unhook();
  158. }
  159. /////////////////////////////////////////////////////
  160. VOID Hook()
  161. {
  162.   ULONG  Address,Address1,Address2;

  163.   Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为NtOpenProcess服务ID
  164.   Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;
  165.   Address2 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;
  166.   DbgPrint("Address:0x%08X",Address);

  167.   OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址
  168.   OldServiceAddress1 = *(ULONG*)Address1;//保存原来NtOpenProcess的地址
  169.   OldServiceAddress2 = *(ULONG*)Address2;//保存原来NtOpenProcess的地址  

  170. newop=(ULONG)NtOpenProcess+1;
  171. newop1=(ULONG)NtOpenProcess+6;

  172. newop2=OldServiceAddress1+1;
  173. newop3=OldServiceAddress1+3;

  174. newop4=OldServiceAddress2+1;
  175. newop5=OldServiceAddress2+3;

  176. memcpy(dthq,newop,sizeof(dthq));
  177. memcpy(hqdt,newop1,sizeof(hqdt));

  178. memcpy(dthq1,newop2,sizeof(dthq1));
  179. memcpy(hqdt1,newop3,sizeof(hqdt1));

  180. memcpy(dthq2,newop4,sizeof(dthq2));
  181. memcpy(hqdt2,newop5,sizeof(hqdt2));

  182. getid=(ULONG)GetFuncAddress()-4;

  183. JmpAddress = (ULONG)NtOpenProcess + 15; //跳转到NtOpenProcess函数头+15的地方,这样在其前面写的JMP都失效了
  184.   JmpAddress1 = OldServiceAddress1 + 12; //跳转到NtOpenProcess函数头+15的地方,这样在其前面写的JMP都失效了
  185.   JmpAddress2 = OldServiceAddress2 + 12; //跳转到NtOpenProcess函数头+15的地方,这样在其前面写的JMP都失效了
  186.   DbgPrint("JmpAddress:0x%08X",JmpAddress);
  187.     
  188.   __asm{//去掉内存保护
  189.     cli
  190.     mov  eax,cr0
  191.     and  eax,not 10000h
  192.     mov  cr0,eax
  193.   }

  194.   *((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT
  195.   *((ULONG*)Address1) = (ULONG)MyNtReadVirtualMemory;//HOOK SSDT
  196.   *((ULONG*)Address2) = (ULONG)MyNtWriteVirtualMemory;
  197.   __asm{//恢复内存保护  
  198.     mov  eax,cr0
  199.     or   eax,10000h
  200.     mov  cr0,eax
  201.     sti
  202.   }
  203. }
  204. //////////////////////////////////////////////////////
  205. VOID Unhook()
  206. {
  207. ULONG  Address,Address1,Address2;
  208.   Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;
  209.   Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;
  210. Address2 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;

  211.   __asm{
  212.     cli
  213.           mov  eax,cr0
  214.     and  eax,not 10000h
  215.     mov  cr0,eax
  216.   }

  217. *((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT
  218. *((ULONG*)Address1) = (ULONG)OldServiceAddress1;
  219. *((ULONG*)Address2) = (ULONG)OldServiceAddress2;

  220.   __asm{  
  221.          mov  eax,cr0
  222.     or   eax,10000h
  223.     mov  cr0,eax
  224.     sti
  225.   }

  226.   DbgPrint("Unhook");
  227. }
复制代码


hs.rar (2.06 KB, 下载次数: 84)

联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:DebugPort一直被清零如何简单的处理
下一篇:发个另类的D3D hook
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

3正式会员
171/300

171

积分

37

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
134
海币
1981
交易币
0
沙发
发表于 2015-3-6 01:46:21 | 只看该作者
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!

0

积分

0

主题

2

听众
已帮网友解决0 个问题
好评
0
贡献
0
海币
5
交易币
0
板凳
发表于 2015-4-19 16:15:10 | 只看该作者
顶,楼主v5

37

积分

1

主题

5

听众
已帮网友解决0 个问题
好评
0
贡献
36
海币
105
交易币
0
地板
发表于 2015-4-19 16:15:43 | 只看该作者
谢谢楼主分享,支持 海论坛

1

积分

0

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
2
交易币
0
5#
发表于 2015-5-28 21:03:22 | 只看该作者
必须顶一个啊

1

积分

0

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
2
交易币
0
6#
发表于 2015-5-28 21:03:40 | 只看该作者
顶顶顶顶大大的等等等等等等等等等等等等

34

积分

2

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
32
海币
200
交易币
0
7#
发表于 2015-10-31 15:37:03 | 只看该作者
回复

使用道具 举报

5

积分

1

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
4
海币
14
交易币
0
8#
发表于 2017-8-14 20:59:57 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-4-5 06:08 , Processed in 0.094414 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

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