吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3593|回复: 13
收起左侧

[系统底层] 驱动向应用层(R0->R3) 创建线程的一种实现

  [复制链接]
897658451 发表于 2024-5-30 11:13
在网上找了很长时间也没找到驱动向应用层创建线程的方法,于是自己研究了一份,现在把研究的结果共享给大家。

1.获取NtCreateThreadEx接口的地址
NtCreateThreadEx是未导出函数,需要我们手动获取地址。对于各位大手子来说在驱动里获取一个未导出接口的地址肯定不是难事,这里不多赘述。

2.构造NtCreateThreadEx的参数
NtCreateThreadEx函数的定义:



[C++] 纯文本查看 复制代码
NTSTATUS NtCreateThreadEx(
    OUT PHANDLE ThreadHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN HANDLE ProcessHandle,
    IN PVOID StartRoutine,
    IN PVOID Argument,
    IN ULONG CreateFlags,
    IN SIZE_T ZeroBits,
    IN SIZE_T StackSize,
    IN SIZE_T MaximumStackSize,
    OUT PPS_ATTRIBUTE_LIST AttributeList);


构造ObjectAttributes参数
[C++] 纯文本查看 复制代码
OBJECT_ATTRIBUTES objAttr;
CLIENT_ID clientId;
InitializeObjectAttributes(&objAttr, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);


构造 shellcode,也就是线程的启动地址。这里我用的是FreeLibrary 函数作为启动地址,当然具体的函数参数(RCX)和函数地址都是动态的,需要执行的时候进行赋值。

[C++] 纯文本查看 复制代码
    UCHAR opcodes[] = {[/size][/font][/backcolor][/color][/size][/color]
        0x48, 0x83, 0xEC, 0x28, // sub rsp, 0x28
        0x48, 0x31, 0xC9, // xor rcx, rcx
        0x48, 0x31, 0xc0,// xor rax, rax
        0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,0x00,//mov rcx, ModuleBase
        0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,0x00,//mov rax, func_FreeLibrary
        0xff, 0xd0,//call   rax
        0x48, 0x83, 0xC4, 0x28, // add rsp, 0x28
        0xc3,//ret};
3.在应用程序中分配内存并创建线程这里采用附加读写的方式进行内存分配
[C++] 纯文本查看 复制代码
KAPC_STATE ApcState = { 0 };
KeStackAttachProcess(TargetProcess, &ApcState);
//设置当前线程运行在用户模式
_KTHREAD->PreviousMode = UserMode
//给shellcode分配内存
PVOID codeBuffer = 0;
    ZwAllocateVirtualMemory(ZwCurrentProcess(), &codeBuffer, 0, &Size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    RtlZeroMemory(codeBuffer, Size);
    memcpy(codeBuffer, opcodes, sizeof(opcodes));
//设置当前线程运行在内核模式并创建线程
_KTHREAD->PreviousMode = KernelMode
 NTSTATUS status;
 HANDLE hThread;
 status = NtCreateThreadEx(&hThread,
        THREAD_ALL_ACCESS,
        &objAttr,
        NtCurrentProcess(),
        (PVOID)codeBuffer,
        (PVOID)NULL,
        0,
        0,
        0x1000,
        0x1000,
        NULL);
//重新设置为用户模式,并等待线程执行完毕
_KTHREAD->PreviousMode = UserMode
    if (NT_SUCCESS(status)) {
        // 延迟 60s
        LARGE_INTEGER Timeout = { 0 };
        Timeout.QuadPart = -(60ll * 10 * 1000 * 1000);
        status = ZwWaitForSingleObject(hThread, TRUE, &Timeout);
        NtClose(hThread);
    }
//释放分配的内存
status = ZwFreeVirtualMemory(NtCurrentProcess(), &codeBuffer, &Size, MEM_RELEASE);

//恢复原来的运行模式
_KTHREAD->PreviousMode = oldMode;
KeUnstackDetachProcess(&ApcState);

以上就是内核向用户层创建线程的全部思路,如果有问题可以在评论区留言。










免费评分

参与人数 9吾爱币 +14 热心值 +8 收起 理由
willJ + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
SeanPJ + 1 + 1 谢谢@Thanks!
janken + 1 + 1 热心回复!
小添 + 1 + 1 用心讨论,共获提升!
zhiyuckt + 1 我很赞同!
为之奈何? + 1 + 1 我很赞同!
nonefree + 1 用心讨论,共获提升!
yp17792351859 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
帽子杨小三 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhiyuckt 发表于 2024-5-31 09:49
之前看内核安全相关的有个师傅写的,个人感觉蛮不错的
https://www.lyshark.com/categories/%E3%80%8AWindows-%E5%86%85%E6%A0%B8%E5%AE%89%E5%85%A8%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF%E5%AE%9E%E8%B7%B5%E3%80%8B/
IBinary 发表于 2024-5-31 09:54
本是情~~ 发表于 2024-5-31 09:49
之前看内核安全相关的有个师傅写的,个人感觉蛮不错的
https://www.lyshark.com/categories/%E3%80%8AWind ...

shark我老乡.现实中的朋友. 确实厉害.
xjun 发表于 2024-5-30 15:37
福仔 发表于 2024-5-31 13:06
xjun 发表于 2024-5-30 15:37
创建线程插入APC都可以,可以看看那个blackbone工程
https://github.com/DarthTon/Blackbone/blob/5ede6ce ...

我用这个的apc注入一直失败, 也不知道是什么问题, 请教一下
在 Loader.c 这个源码里 BBLookupProcessThread 这个函数 541 行 if (*ppThread && BBSkipThread( *ppThread, wow64 )) 这个if语句里条件为真了
就是调用 BBSkipThread 返回了真, 在 if (*(PULONG64)(pTeb64 + 0x78) != 0) 这个if里返回了真
pInfo->NumberOfThreads 的值只有1, 他这里跳过之后, 循环就退出了
下面是调用流程
BBApcInject
    BBLookupProcessThread
        for (ULONG i = 0; i < pInfo->NumberOfThreads; i++)  BBSkipThread

测试环境, win7 7601, 测试创建线程是可以创建的
        
我是你强少哥哥 发表于 2024-5-30 13:53

感谢楼主分享
zjcs5210 发表于 2024-5-30 14:19
真好。真好真好真好真好真好
huoji120 发表于 2024-5-30 23:22
RtlCreateUserThread
chenwei534 发表于 2024-5-30 23:47

感谢楼主分享
flybird2007 发表于 2024-5-31 07:43
学习了,感谢分享
onlyougao 发表于 2024-5-31 09:26
不觉明厉
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 15:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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