找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6634|回复: 6

庆祝一下,深度inline hook终于理解了

  [复制链接]

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-10-8 22:08:16 | 显示全部楼层 |阅读模式
经过不懈的努力,成功了
虽然道理差不多,但是走了很多弯路,
特别是对指针的理解,大概理解了.
代码中的方法是手工修改的方法
没用反汇编引擎
因为那个语句还没弄明白

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-8 22:09:05 | 显示全部楼层
本帖最后由 ok100fen 于 2010-10-8 22:40 编辑
  1. #include <NTDDK.h>
  2. ULONG TestFunctionAddr=0;
  3. ULONG TestFunctionAddrNew=0;
  4. UCHAR SoureCode[5]={0x68,0xc4,0x00,0x00,0x00};

  5. VOID WPOFF(VOID)
  6. {
  7. __asm
  8. {
  9. cli
  10. mov eax,cr0
  11. and eax,not 10000h
  12. mov cr0,eax
  13. }
  14. }



  15. VOID WPON(VOID)
  16. {
  17. __asm
  18. {
  19. mov eax,cr0
  20. or eax,10000h
  21. mov cr0,eax
  22. sti
  23. }
  24. }



  25. VOID MyFunction()
  26. {
  27. KdPrint(("NtOpenProcessing"));
  28. }


  29. NTSTATUS _declspec(naked) MyNtOpenProcess( OUT PHANDLE ProcessHandle,
  30. IN ACCESS_MASK DesiredAccess,
  31. IN POBJECT_ATTRIBUTES ObjectAttributes,
  32. IN PCLIENT_ID ClientId OPTIONAL )
  33. {
  34. __asm
  35. {
  36. PUSH 0x4130D8
  37. call MyFunction
  38. mov eax,TestFunctionAddrNew
  39. add eax,5
  40. jmp eax
  41. }
  42. }



  43. VOID StartInLineHook()
  44. {
  45. ULONG JmpOffset;
  46. UCHAR JmpCode[5]={0xe9,0x00,0x00,0x00,0x00};

  47. if (TestFunctionAddrNew==0)
  48. {
  49. KdPrint(("函数地址未找到"));
  50. return;
  51. }
  52. KdPrint(("NtOpenProcess的地址是:%08X",TestFunctionAddrNew));
  53. KdPrint(("MyNtOpenProcess的地址是:%08X",MyNtOpenProcess));
  54. JmpOffset=(PCHAR)MyNtOpenProcess-(PCHAR)TestFunctionAddrNew-5;

  55. KdPrint(("JmpOffset的值是:%08X",JmpOffset));
  56. RtlCopyMemory(JmpCode+1,&JmpOffset,4);
  57. WPOFF();
  58. RtlCopyMemory((PVOID)TestFunctionAddrNew,(PVOID)JmpCode,5);
  59. WPON();
  60. }

  61. VOID DriverUnload (PDRIVER_OBJECT pDriverObject)
  62. {
  63. WPOFF();
  64. RtlCopyMemory((PVOID)TestFunctionAddrNew,SoureCode,5);
  65. WPON();
  66. KdPrint(("InLine HOOK已恢复!!!\n驱动服务已卸载\n"));
  67. }




  68. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
  69. {

  70. UNICODE_STRING FunctionName;
  71. KdPrint(("进入驱动入口\n"));
  72. pDriverObject->DriverUnload =DriverUnload;
  73. RtlInitUnicodeString(&FunctionName,L"NtOpenProcess");
  74. TestFunctionAddr=(ULONG)MmGetSystemRoutineAddress(&FunctionName);
  75. TestFunctionAddrNew=TestFunctionAddr+0x5;

  76. KdPrint(("NtOpenProcessDE的地址是:%08X",TestFunctionAddr));
  77. KdPrint(("NtOpenProcessDE的地址是:%08X",TestFunctionAddrNew));
  78. StartInLineHook();
  79. return STATUS_SUCCESS;
  80. }


复制代码

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-8 22:43:39 | 显示全部楼层
晕了,即使深度hook
用xuetr还是能查到

29

主题

134

回帖

4

精华

论坛元老

积分
5970
QQ
发表于 2010-10-9 15:18:41 | 显示全部楼层
你这个深度怎么就是开头吗 真正的深度很麻烦的  堆栈 需要平衡很难  如果想程序找个hook 引擎吧
花落时想你
花开时你在哪里

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-9 17:01:50 | 显示全部楼层
不是开头
我只是看看不是开头的原理
所以,离开头只有5个字节

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-9 17:03:04 | 显示全部楼层
hook简单,处理函数很难
单纯hook,不蓝屏
怎么写上处理函数,愿意蓝屏?

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

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

QQ
发表于 2010-10-9 17:19:07 | 显示全部楼层
.......复杂的玩意...
我就是嗷嗷叫的老马了......

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

本版积分规则

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