https://www.cnblogs.com/theseventhson/p/13236421.html  这里介绍了利用回调函数执行shellcode的基本原理;这里介绍另外一种利用回调执行shellcode的方法:kernelcallbacktable;从字面意思看,kernelcallbacktable应该有如下几个特点:

  • 首先是个table,table里面装满了各个回调函数的入口;
  • 其次:既然是kernelcallback,应该是被内核回调的,那么内核在什么时候才会回调这些函数了?众说周知,windows操作系统的基石就是无数个展现在用户界面的窗口(所以该操作系统才得名windows的嘛),窗口之间是需要互相通信的,窗口和系统其他模块之间也是要互相通信的, table里的这些函数通常用于窗口响应各种不同类型的消息。例如,A窗口给B窗口发送WM_COPYDATA消息,B窗口就会执行_fnCOPYDATA函数(shellcode注入关键点就在这了:在目标进程写入shellcode,然后让_fnCOPYDATA指向shellcode的入口);而当一个键盘消息来了,收到消息的窗口就会执行__ClientImmProcessKey;
  • kernelcallbacktable在哪了?既然目标进程选explorer,就从这里开始逐个查看

(1)先看看explorer的各种数据,发现peb在008e1000这里;

kd> !process 0 0 explorer.exe
PROCESS ffff9006c6645080
SessionId: 1 Cid: 09cc Peb: 008e1000 ParentCid: 09b4
DirBase: 48555000 ObjectTable: ffffb789d5512040 HandleCount: 3177.
Image: explorer.exe

(2)继续查看PEB的内容:在偏移0x58处找到exlporer进程的内核回调表:

kd> dt _PEB 008e1000
nt!_PEB
+0x000 InheritedAddressSpace : 0 ''
+0x001 ReadImageFileExecOptions : 0 ''
+0x002 BeingDebugged : 0 ''
+0x003 BitField : 0x4 ''
................................................
+0x054 Padding1 : [4] ""
+0x058 KernelCallbackTable : 0x00007ffa`ef0e31e0 Void

(3)继续查看这个表的内容:根据上面回调函数表的地址继续查表内函数地址,如下:

kd> dps 00007ffa`ef0e31e0
00007ffa`ef0e31e0 00007ffa`ef07e3e0
00007ffa`ef0e31e8 00007ffa`ef0da990
00007ffa`ef0e31f0 00007ffa`ef081990
00007ffa`ef0e31f8 00007ffa`ef086a90
00007ffa`ef0e3200 00007ffa`ef0860b0
00007ffa`ef0e3208 00007ffa`ef0daf00
00007ffa`ef0e3210 00007ffa`ef087450
00007ffa`ef0e3218 00007ffa`ef0dad20
00007ffa`ef0e3220 00007ffa`ef0db1b0
00007ffa`ef0e3228 00007ffa`ef0dadd0
00007ffa`ef0e3230 00007ffa`ef083e40
00007ffa`ef0e3238 00007ffa`ef0dae20
00007ffa`ef0e3240 00007ffa`ef088b30
00007ffa`ef0e3248 00007ffa`ef0db350
00007ffa`ef0e3250 00007ffa`ef0db350
00007ffa`ef0e3258 00007ffa`ef08eb50

     (4)查看第一个函数,也就是_fnCOPYDATA代码如下:
kd> u 00007ffa`ef07e3e0
00007ffa`ef07e3e0 4883ec58 sub rsp,58h
00007ffa`ef07e3e4 33c0 xor eax,eax
00007ffa`ef07e3e6 4c8bd1 mov r10,rcx
00007ffa`ef07e3e9 89442438 mov dword ptr [rsp+38h],eax
00007ffa`ef07e3ed 4889442440 mov qword ptr [rsp+40h],rax
00007ffa`ef07e3f2 394108 cmp dword ptr [rcx+8],eax
00007ffa`ef07e3f5 740b je 00007ffa`ef07e402
00007ffa`ef07e3f7 48394120 cmp qword ptr [rcx+20h],rax

(5)只要把这个函数的内容换成我们自己的shellcode就行,代码下面会贴出来,这里先下个断点:

kd> bp 00007ffa`ef07e3e0

(6)执行代码,成功断了下来:

kd> g
Breakpoint 0 hit
0033:00007ffa`ef07e3e0 4883ec58 sub rsp,58h
kd> k
# Child-SP RetAddr Call Site
00 00000000`056ff398 00007ff8`bbbc3b14 0x00007ffa`ef07e3e0
01 00000000`056ff3a0 00000000`00000000 0x00007ff8`bbbc3b14

F5放过去继续执行,成功弹出了记事本:

     (7)KernelCallBackTable如下,全是内核回调函数:

  1. typedef struct _KERNELCALLBACKTABLE_T {
  2. ULONG_PTR __fnCOPYDATA;
  3. ULONG_PTR __fnCOPYGLOBALDATA;
  4. ULONG_PTR __fnDWORD;
  5. ULONG_PTR __fnNCDESTROY;
  6. ULONG_PTR __fnDWORDOPTINLPMSG;
  7. ULONG_PTR __fnINOUTDRAG;
  8. ULONG_PTR __fnGETTEXTLENGTHS;
  9. ULONG_PTR __fnINCNTOUTSTRING;
  10. ULONG_PTR __fnPOUTLPINT;
  11. ULONG_PTR __fnINLPCOMPAREITEMSTRUCT;
  12. ULONG_PTR __fnINLPCREATESTRUCT;
  13. ULONG_PTR __fnINLPDELETEITEMSTRUCT;
  14. ULONG_PTR __fnINLPDRAWITEMSTRUCT;
  15. ULONG_PTR __fnPOPTINLPUINT;
  16. ULONG_PTR __fnPOPTINLPUINT2;
  17. ULONG_PTR __fnINLPMDICREATESTRUCT;
  18. ULONG_PTR __fnINOUTLPMEASUREITEMSTRUCT;
  19. ULONG_PTR __fnINLPWINDOWPOS;
  20. ULONG_PTR __fnINOUTLPPOINT5;
  21. ULONG_PTR __fnINOUTLPSCROLLINFO;
  22. ULONG_PTR __fnINOUTLPRECT;
  23. ULONG_PTR __fnINOUTNCCALCSIZE;
  24. ULONG_PTR __fnINOUTLPPOINT5_;
  25. ULONG_PTR __fnINPAINTCLIPBRD;
  26. ULONG_PTR __fnINSIZECLIPBRD;
  27. ULONG_PTR __fnINDESTROYCLIPBRD;
  28. ULONG_PTR __fnINSTRING;
  29. ULONG_PTR __fnINSTRINGNULL;
  30. ULONG_PTR __fnINDEVICECHANGE;
  31. ULONG_PTR __fnPOWERBROADCAST;
  32. ULONG_PTR __fnINLPUAHDRAWMENU;
  33. ULONG_PTR __fnOPTOUTLPDWORDOPTOUTLPDWORD;
  34. ULONG_PTR __fnOPTOUTLPDWORDOPTOUTLPDWORD_;
  35. ULONG_PTR __fnOUTDWORDINDWORD;
  36. ULONG_PTR __fnOUTLPRECT;
  37. ULONG_PTR __fnOUTSTRING;
  38. ULONG_PTR __fnPOPTINLPUINT3;
  39. ULONG_PTR __fnPOUTLPINT2;
  40. ULONG_PTR __fnSENTDDEMSG;
  41. ULONG_PTR __fnINOUTSTYLECHANGE;
  42. ULONG_PTR __fnHkINDWORD;
  43. ULONG_PTR __fnHkINLPCBTACTIVATESTRUCT;
  44. ULONG_PTR __fnHkINLPCBTCREATESTRUCT;
  45. ULONG_PTR __fnHkINLPDEBUGHOOKSTRUCT;
  46. ULONG_PTR __fnHkINLPMOUSEHOOKSTRUCTEX;
  47. ULONG_PTR __fnHkINLPKBDLLHOOKSTRUCT;
  48. ULONG_PTR __fnHkINLPMSLLHOOKSTRUCT;
  49. ULONG_PTR __fnHkINLPMSG;
  50. ULONG_PTR __fnHkINLPRECT;
  51. ULONG_PTR __fnHkOPTINLPEVENTMSG;
  52. ULONG_PTR __xxxClientCallDelegateThread;
  53. ULONG_PTR __ClientCallDummyCallback;
  54. ULONG_PTR __fnKEYBOARDCORRECTIONCALLOUT;
  55. ULONG_PTR __fnOUTLPCOMBOBOXINFO;
  56. ULONG_PTR __fnINLPCOMPAREITEMSTRUCT2;
  57. ULONG_PTR __xxxClientCallDevCallbackCapture;
  58. ULONG_PTR __xxxClientCallDitThread;
  59. ULONG_PTR __xxxClientEnableMMCSS;
  60. ULONG_PTR __xxxClientUpdateDpi;
  61. ULONG_PTR __xxxClientExpandStringW;
  62. ULONG_PTR __ClientCopyDDEIn1;
  63. ULONG_PTR __ClientCopyDDEIn2;
  64. ULONG_PTR __ClientCopyDDEOut1;
  65. ULONG_PTR __ClientCopyDDEOut2;
  66. ULONG_PTR __ClientCopyImage;
  67. ULONG_PTR __ClientEventCallback;
  68. ULONG_PTR __ClientFindMnemChar;
  69. ULONG_PTR __ClientFreeDDEHandle;
  70. ULONG_PTR __ClientFreeLibrary;
  71. ULONG_PTR __ClientGetCharsetInfo;
  72. ULONG_PTR __ClientGetDDEFlags;
  73. ULONG_PTR __ClientGetDDEHookData;
  74. ULONG_PTR __ClientGetListboxString;
  75. ULONG_PTR __ClientGetMessageMPH;
  76. ULONG_PTR __ClientLoadImage;
  77. ULONG_PTR __ClientLoadLibrary;
  78. ULONG_PTR __ClientLoadMenu;
  79. ULONG_PTR __ClientLoadLocalT1Fonts;
  80. ULONG_PTR __ClientPSMTextOut;
  81. ULONG_PTR __ClientLpkDrawTextEx;
  82. ULONG_PTR __ClientExtTextOutW;
  83. ULONG_PTR __ClientGetTextExtentPointW;
  84. ULONG_PTR __ClientCharToWchar;
  85. ULONG_PTR __ClientAddFontResourceW;
  86. ULONG_PTR __ClientThreadSetup;
  87. ULONG_PTR __ClientDeliverUserApc;
  88. ULONG_PTR __ClientNoMemoryPopup;
  89. ULONG_PTR __ClientMonitorEnumProc;
  90. ULONG_PTR __ClientCallWinEventProc;
  91. ULONG_PTR __ClientWaitMessageExMPH;
  92. ULONG_PTR __ClientWOWGetProcModule;
  93. ULONG_PTR __ClientWOWTask16SchedNotify;
  94. ULONG_PTR __ClientImmLoadLayout;
  95. ULONG_PTR __ClientImmProcessKey;
  96. ULONG_PTR __fnIMECONTROL;
  97. ULONG_PTR __fnINWPARAMDBCSCHAR;
  98. ULONG_PTR __fnGETTEXTLENGTHS2;
  99. ULONG_PTR __fnINLPKDRAWSWITCHWND;
  100. ULONG_PTR __ClientLoadStringW;
  101. ULONG_PTR __ClientLoadOLE;
  102. ULONG_PTR __ClientRegisterDragDrop;
  103. ULONG_PTR __ClientRevokeDragDrop;
  104. ULONG_PTR __fnINOUTMENUGETOBJECT;
  105. ULONG_PTR __ClientPrinterThunk;
  106. ULONG_PTR __fnOUTLPCOMBOBOXINFO2;
  107. ULONG_PTR __fnOUTLPSCROLLBARINFO;
  108. ULONG_PTR __fnINLPUAHDRAWMENU2;
  109. ULONG_PTR __fnINLPUAHDRAWMENUITEM;
  110. ULONG_PTR __fnINLPUAHDRAWMENU3;
  111. ULONG_PTR __fnINOUTLPUAHMEASUREMENUITEM;
  112. ULONG_PTR __fnINLPUAHDRAWMENU4;
  113. ULONG_PTR __fnOUTLPTITLEBARINFOEX;
  114. ULONG_PTR __fnTOUCH;
  115. ULONG_PTR __fnGESTURE;
  116. ULONG_PTR __fnPOPTINLPUINT4;
  117. ULONG_PTR __fnPOPTINLPUINT5;
  118. ULONG_PTR __xxxClientCallDefaultInputHandler;
  119. ULONG_PTR __fnEMPTY;
  120. ULONG_PTR __ClientRimDevCallback;
  121. ULONG_PTR __xxxClientCallMinTouchHitTestingCallback;
  122. ULONG_PTR __ClientCallLocalMouseHooks;
  123. ULONG_PTR __xxxClientBroadcastThemeChange;
  124. ULONG_PTR __xxxClientCallDevCallbackSimple;
  125. ULONG_PTR __xxxClientAllocWindowClassExtraBytes;
  126. ULONG_PTR __xxxClientFreeWindowClassExtraBytes;
  127. ULONG_PTR __fnGETWINDOWDATA;
  128. ULONG_PTR __fnINOUTSTYLECHANGE2;
  129. ULONG_PTR __fnHkINLPMOUSEHOOKSTRUCTEX2;
  130. } KERNELCALLBACKTABLE;

参考:https://zhuanlan.zhihu.com/p/40368047

https://modexp.wordpress.com/2018/07/15/process-injection-sharing-payload/  内核回调函数机制详解

https://github.com/odzhan/injection/tree/master/kct  代码和shellcode(注意要编译成64位的,否则无法执行shellcode)

windows:shellcode 远程线程hook/注入(四)的更多相关文章

  1. windows:shellcode 远程线程hook/注入(一)

    https://www.cnblogs.com/theseventhson/p/13199381.html 上次分享了通过APC注入方式,让目标线程运行shellcode.这么做有个前提条件:目标线程 ...

  2. windows:shellcode 远程线程hook/注入(三)

    今天介绍第三种远程执行shellcode的思路:函数回调: 1.所谓回调,简单理解: windows出厂时,内部有很多事务的处理无法固化(无法100%预料外部会遇到哪些情况),只能留下一堆的接口,让开 ...

  3. windows:shellcode 远程线程hook/注入(二)

    https://www.cnblogs.com/theseventhson/p/13218651.html   上次分享了基本的远程注入方法,遗留了一个问题:shellcode执行完后怎么回到线程su ...

  4. windows:shellcode 远程线程hook/注入(五)

    前面几篇文章介绍了通过APC注入.进程注入.windows窗口处理函数回调.kernercallback回调执行shellcode,今天继续介绍通过heap Spray(翻译成中文叫堆喷射)执行she ...

  5. 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。

    windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...

  6. 使用远程线程来注入DLL

    使用远程线程来注入DLL DLL注入技术要求我们目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL (1)用OpenProcess函数打开目标进程(2)用VirtualAllocEx ...

  7. 【windows核心编程】远程线程DLL注入

    15.1 DLL注入 目前公开的DLL注入技巧共有以下几种: 1.注入表注入 2.ComRes注入 3.APC注入 4.消息钩子注入 5.远线程注入 6.依赖可信进程注入 7.劫持进程创建注入 8.输 ...

  8. Dll注入:X86/X64 远程线程CreateRemoteThread 注入

    远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的L ...

  9. 实现远程线程DLL注入

    ### 32位:远程线程注入 远程线程注入是最常用的一种注入技术,该技术利用的核心API是 `CreateRemoteThread()` 这个API可以运行远程线程,其次通过创建的线程调用 `Load ...

随机推荐

  1. 小书MybatisPlus第2篇-条件构造器的应用及总结

    一.条件构造器Wrapper Mybatis Plus为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件.删除条件.更新条件的构造. 条件构造器用于给如下的Mapper方法传参,通常情况下 ...

  2. Django---进阶4

    目录 CBV源码剖析 模版语法传值 过滤器(过滤器只能最多有两个参数) 标签 自定义过滤器.标签.inclusion_tag 模版的继承 模版的导入 作业 CBV源码剖析 # 你自己不要修改源码 除了 ...

  3. [JAVA]使用字节流拷贝文件

    import java.io.*; /** * @Description: * @projectName:JavaTest * @see:PACKAGE_NAME * @author:郑晓龙 * @c ...

  4. 新手用Python运行selenium的常见问题

    1.更换Python版本 打开pycharm,点击 file——setting——project项目名——project Interpreter,点击右侧的设置,如下图 选择新Python版本的安装路 ...

  5. 配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽

    专注Java领域分享.成长,拒绝浅尝辄止.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.My ...

  6. day71 django收尾

    目录 一.Auth模块 1 简介 2 方法总结 3 如何扩展auth_user表 二.bbs表介绍 1 项目开发流程 2 bbs七张表关系 一.Auth模块 1 简介 在我们创建好一个django项目 ...

  7. day62 django入门(3)

    目录 一.无名有名分组的反向解析 1 无名分组的反向解析 2 有名分组的反向解析 二.路由分发 三.名称空间(了解) 四.伪静态(了解) 五.虚拟环境(了解) 六.django版本区别 1 url的区 ...

  8. 读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)

    要做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费.两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可以了,还需要一个重置按钮来重新开始. 核心 ...

  9. .NET Core 微服务—API网关(Ocelot) 教程 [一]

    前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...

  10. 大牛聊Java并发编程原理之 线程的互斥与协作机制

    可能在synchronized关键字的实现原理中,你已经知道了它的底层是使用Monitor的相关指令来实现的,但是还不清楚Monitor的具体细节.本文将让你彻底Monitor的底层实现原理. 管程 ...