看流星社区

 找回密码
 注册账号
查看: 4245|回复: 10

ring0注入ring3的一种新方法

[复制链接]

该用户从未签到

发表于 2013-2-6 19:29:31 | 显示全部楼层 |阅读模式
插APC越来越不好使了,想到了一种新的方法,实践了一下,发出来与大家分享。

其实要注入ring3的进程,本质上只是想要借用该进程中的某一个线程来执行一段其它代码而已,再透彻一点讲只是要借用一下某个线程的eip来暂时指向我们想让它执行的代码。当然,用完过后要想办法让eip能回到原位,这样就不会对该ring3线程本身的工作产生干扰。

具体来讲可以这样做:

1、先在要注入的进程中找到一个没有退出的,并且没有被挂起的用户线程。(其实如果找被挂起的还省事一点,就是等的时间长了点,要等它resume过后,注入的代码才会被执行。这里以挂起的为例)

2、挂起该线程。这是为了防止它被调度,因为我们要修改它的EIP。但是KeSuspendThread是没有导出的,需要自己实现。(附件的示例代码中是通过查找特征码来做的)

3、我们先来看一看准备注入到Ring3的代码。在本示例中,我准备注入的代码如下:
  1. ////////////////////////////////////////////////
  2. //
  3. //  被注入到ring3进程的代码
  4. //
  5. ////////////////////////////////////////////////
  6. _declspec (naked) void ShellCode() {
  7.   _asm {
  8.     push eax
  9.     // 弹个MessageBox为例
  10.     push 0
  11.     push 0
  12.     push 0
  13.     push 0
  14.     mov eax, 0x77D66484    // MessageBoxW 的地址,XP SP2
  15.     call eax
  16.     pop eax
  17.     // jmp ds:12345678H, 绝对地址跳转
  18.     _emit 0xEA
  19.     _emit 0x78
  20.     _emit 0x56
  21.     _emit 0x34
  22.     _emit 0x12
  23.     _emit 0x1B
  24.     _emit 0x00
  25.   }
  26. }
复制代码
ShellCode以MessageBoxW(0,0,0,0)为例,代码最后需要有个jmp ds:0x12345678的绝对跳转,这是为了跳回EIP原来的地方。
所以现在要做的就是把0x12345678改成KTHREAD->KTRAP_FRAME->EIP中的值,再把ShellCode拷贝到该Ring3线程能够抚摸到的位置,最后把KTHREAD->KTRAP_FRAME->EIP改成ShellCode被拷贝到的地址。
那么将ShellCode拷贝到什么地方呢?我一开始为了方便,将ShellCode拷贝到了KUSER_SHARED_DATA的后面,这样可以避免申请空间,以及KeStackAttachProcess等麻烦。KUSER_SHARED_DATA所在的地址被同时映射到了内核空间(0xffdf0000)和用户空间(0x7ffe0000)中,大小为4K,但是其实KUSER_SHARED_DATA连1K都没占到,所以可以把ShellCode拷到KUSER_SHARED_DATA的后面,非常理想^_^。
代码片断如下:
  1. // 将ShellCode中的0x12345678改成eip,为了ShellCode执行完后自动跳回
  2. for( i = (ULONG)ShellCode; i <= (ULONG)ShellCode + 0x20; ++i ) {
  3.   if( MmIsAddressValid((PVOID)i) && MmIsAddressValid((PVOID)(i+3)) ){
  4.     if ( *(PULONG)i == 0x12345678 ) {
  5.       DbgPrint("find modify point\n");
  6.       *(PULONG)i = pTrapFrame->Eip;
  7.       break;
  8.     }
  9.   }
  10. }

  11. // 拷贝ShellCode到“飞地”(使用内核地址)
  12. RtlCopyMemory( (PVOID)0xffdf0800, ShellCode, 0x20 );

  13. // pTrapFrame->EIP指向“飞地”(使用用户态地址)
  14. pTrapFrame->Eip = 0x7ffe0800;
复制代码
后来发现在非调试模式下,执行KUSER_SHARED_DATA处的代码会导致DEP暴走,遂老老实实地自己分配空间了。
代码片断如下:
  1. // 将ShellCode中的0x12345678改成eip,为了ShellCode执行完后自动跳回
  2. for( i = (ULONG)ShellCode; i <= (ULONG)ShellCode + 0x20; ++i ) {
  3.   if( MmIsAddressValid((PVOID)i) && MmIsAddressValid((PVOID)(i+3)) ){
  4.     if ( *(PULONG)i == 0x12345678 ) {
  5.       DbgPrint("find modify point\n");
  6.       *(PULONG)i = pTrapFrame->Eip;
  7.       break;
  8.     }
  9.   }
  10. }

  11. // 下面的代码是分配空间来放置ShellCode
  12. // 调用一些相应函数来实现更好,我比较懒,就硬编码了
  13. InitializeObjectAttributes(&oa,0,0,0,0);
  14. pCid = (CLIENT_ID*)((ULONG)pThread + 0x1ec);    // Cid   XP SP2
  15. ntstatus = ZwOpenProcess(
  16.   &hProcess,
  17.   PROCESS_ALL_ACCESS,
  18.   &oa,
  19.   pCid
  20.   );
  21. if ( NT_SUCCESS(ntstatus) ) {
  22.   PVOID pBuff = NULL;
  23.   SIZE_T size = 0x20;
  24.   ntstatus = NtAllocateVirtualMemory(
  25.     hProcess,
  26.     &pBuff,
  27.     0,
  28.     &size,
  29.     MEM_RESERVE | MEM_COMMIT,
  30.     PAGE_EXECUTE_READWRITE
  31.     );
  32.   if( NT_SUCCESS(ntstatus) ) {
  33.     KAPC_STATE kapc;
  34.     // 拷贝ShellCode到目标进程中去
  35.     KeStackAttachProcess(pProcess,&kapc);
  36.     RtlCopyMemory(pBuff,ShellCode,size);
  37.     KeUnstackDetachProcess (&kapc);
  38.     // pTrapFrame->Eip指向ShellCode
  39.     pTrapFrame->Eip = (ULONG)pBuff;
  40.   }
  41.   ZwClose(hProcess);
  42. }
复制代码
4、KeRusumeThread,恢复该线程的执行,于是该线程会先去执行ShellCode。

附上完整的源码:
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2013-2-6 20:15:53 | 显示全部楼层
效果怎么样

该用户从未签到

发表于 2013-4-15 21:06:09 | 显示全部楼层
好东西,看看看看

该用户从未签到

发表于 2013-4-17 21:40:31 | 显示全部楼层
急死我了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

该用户从未签到

发表于 2013-11-8 03:54:39 | 显示全部楼层
核黄素打开技术

该用户从未签到

发表于 2019-9-23 14:53:49 | 显示全部楼层
好像非常不错的样子,。学习下看看

该用户从未签到

发表于 2019-10-14 11:55:45 | 显示全部楼层
注入方法可以学习.虽然发帖久了.

该用户从未签到

发表于 2019-12-2 22:55:53 | 显示全部楼层
好东西,看看看看

该用户从未签到

发表于 2019-12-4 18:39:48 | 显示全部楼层
6666666666

该用户从未签到

发表于 2019-12-4 18:40:19 | 显示全部楼层
点个赞吧`````
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-24 12:53

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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