首页
社区
课程
招聘
[半原创]贴点内核态中创建用户态进程的代码
发表于: 2009-1-9 14:28 40088

[半原创]贴点内核态中创建用户态进程的代码

2009-1-9 14:28
40088
自己编写进线程、文件系统等相关函数,并在内核中实现虽然没什么应用价值,不过对内核

的学习大有裨益。

刚想逆CreateProcess,发现Gary Nebbett大牛已经有了相关代码。那就用大牛的代码改进改进。

下面是驱动中创建进程的代码,不知道前人有发过没(论坛上有一份,我看了,那是插apc的取巧方式)

本代码大部分是搬Gary Nebbett的,不过为了移植到内核中我还是做了不少工作……

另外还有个驱动中创建用户态线程的函数,觉得太简单了,就不贴了
(注意,代码中的写入用户环境部分我是直接把用户态下的GetEnvironmentStringsW得到的
东西直接贴进去了,所以大家要用的时候自己改改吧。)

大牛就不用看了,自己写写抄抄的而已。
另外还想请教大牛们,为什么有时候启动的时候会出现STATUS_DLL_INIT_FAILED错误??


主函数:
int MyCreateProcess(PUNICODE_STRING name, PWSTR param)
{
//write by weolar(http://hi.baidu.com/weolar)
    PWSTR tmp;

    HANDLE hProcess, hThread, hSection, hFile;

    OBJECT_ATTRIBUTES oa;

    RtlZeroMemory(&oa, sizeof(OBJECT_ATTRIBUTES)) ;

    InitializeObjectAttributes( &oa,name, OBJ_CASE_INSENSITIVE, 0, NULL);

    IO_STATUS_BLOCK iosb;

    ZwOpenFile(&hFile,FILE_READ_DATA|FILE_EXECUTE|SYNCHRONIZE, &oa, &iosb,
                   FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);

    oa.ObjectName = 0;

    ZwCreateSection(&hSection, SECTION_ALL_ACCESS, 0, 0, PAGE_EXECUTE, SEC_IMAGE, hFile);

    ZwClose(hFile);

    ZwCreateProcess(&hProcess, PROCESS_ALL_ACCESS, 0,
                        (HANDLE)-1, TRUE, hSection, 0, 0);

    CloseHandle(hep);

    SECTION_IMAGE_INFORMATION sii;

    ZwQuerySection(hSection, SectionImageInformation, &sii, sizeof sii, 0);

    ZwClose(hSection);

    USER_STACK stack = {0};

    ULONG n = sii.StackReserve;
    ZwAllocateVirtualMemory(hProcess, &stack.ExpandableStackBottom, 0, &n,
                                MEM_RESERVE, PAGE_READWRITE);

    stack.ExpandableStackBase = PCHAR(stack.ExpandableStackBottom) + sii.StackReserve;
    stack.ExpandableStackLimit = PCHAR(stack.ExpandableStackBase) - sii.StackCommit;

    n = sii.StackCommit + PAGE_SIZE;
    PVOID p = PCHAR(stack.ExpandableStackBase) - n;
    ZwAllocateVirtualMemory(hProcess, &p, 0, &n, MEM_COMMIT, PAGE_READWRITE);

    ULONG x; n = PAGE_SIZE;
    ZwProtectVirtualMemory(hProcess, &p, &n, PAGE_READWRITE | PAGE_GUARD, &x);

    CONTEXT context = {CONTEXT_FULL};
    context.SegGs = 0;
    context.SegFs = 0x38;
    context.SegEs = 0x20;
    context.SegDs = 0x20;
    context.SegSs = 0x20;
    context.SegCs = 0x18;
    context.EFlags = 0x3000;
    context.Esp = ULONG(stack.ExpandableStackBase) - 4;
    context.Eip = ULONG(sii.EntryPoint);

    CLIENT_ID cid;

    ZwCreateThread(&hThread, THREAD_ALL_ACCESS, 0, hProcess, &cid, &context, &stack, TRUE);

    PROCESS_BASIC_INFORMATION pbi;
    ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof pbi, 0);

    CreateProcessParameters(hProcess, pbi.PebBaseAddress, name);

    InformCsrss(hProcess, hThread, ULONG(cid.UniqueProcess), ULONG(cid.UniqueThread));

    ZwResumeThread(hThread, 0);

    ZwClose(hProcess);
    ZwClose(hThread);

    return int(cid.UniqueProcess);
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
支持
分享
最新回复 (52)
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
自己做沙发~~
2009-1-9 14:51
0
雪    币: 214
活跃值: (24)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
good!   up
2009-1-9 14:58
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
vista直接createuserprocess就解决了~
2009-1-9 15:20
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
vista有这么方便的函数?
又没跟上时代啊我……对vista没研究过。那大家就当温习一遍进程创建的过程好了。
mj顺便帮我解决一下为什么有时候启动的时候会出现STATUS_DLL_INIT_FAILED错误吧
2009-1-9 15:51
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好东西,收藏了!
2009-1-9 18:02
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
顶楼主!好东西啊呀
2009-1-9 18:23
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
谢谢分享~~~
2009-1-9 19:37
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
糟糕,一时大意用马甲发文章了
2009-1-9 21:04
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持下.........
2009-1-9 21:47
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11

好,马甲爆出~
2009-1-9 22:27
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
支持一个!!!
2009-1-10 00:12
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
13
来上补习班。
2009-1-10 01:19
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
14
学习真身还不忘过来强调一下
2009-1-10 05:29
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
15
想到真身少了篇精华,感觉很惭愧
2009-1-10 10:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
非常感谢楼主的代码,学习!
2009-1-10 10:42
0
雪    币: 212
活跃值: (1232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
Deleaker for Visual C++求破解
2009-1-10 14:02
0
雪    币: 219
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
来顶一下 盟主很厉害哦 我还没看代码 不过顶一下先
2009-1-10 15:28
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
2009-1-10 17:46
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
20
嘿嘿....好东西自己顶不用不好意思.....
2009-1-10 18:14
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
21
被大家揭穿了~下次还是老老实实的写点东西.FC太黑了,这都要搜出来啊
2009-1-10 19:02
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
22
貌似pjf以前发过

好像更早出现在某个kernel backdoor还是什么里面

InformCsrss有bug。
2009-1-11 11:41
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
23
pjf的那个应该就是改Gary Nebbett的。只不过都是r3下,我给改到r0了;
能不能帮忙改进下bug?
2009-1-11 13:08
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
前一阵在黑防发了个类似的

typedef struct _PBASE_CREATEPROCESS_MSG {
        HANDLE hProcess;
        HANDLE hThread;
        DWORD dwProcessId;
        DWORD dwThreadId;
        DWORD CreationFlags;
        CLIENT_ID DebuggerClientId;
        DWORD VdmBinaryType;
}BASE_CREATEPROCESS_MSG ,*PBASE_CREATEPROCESS_MSG;

typedef struct _BASE_API_MSG {
        PORT_MESSAGE h;
        PCSR_CAPTURE_HEADER CaptureBuffer;
        CSR_API_NUMBER ApiNumber;
        ULONG ReturnValue;
        ULONG Reserved;
        union {
                BASE_CREATEPROCESS_MSG CreateProcess;
        } u;
} BASE_API_MSG, *PBASE_API_MSG;

        BASE_API_MSG BaseApiMsg={0};
        PBASE_CREATEPROCESS_MSG BaseCreateProcessMsg=NULL;

//.....

        // notify csrss of process's creation
        // without notifying csrss, what we got is merely a 0xC0000124 error ( through csr's messagebox )
        RtlZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG));
        BaseCreateProcessMsg=&BaseApiMsg.u.CreateProcessW;
        BaseCreateProcessMsg->dwProcessId=(ULONG)ClientId.UniqueProcess;
        BaseCreateProcessMsg->dwThreadId=(ULONG)ClientId.UniqueThread;
        BaseCreateProcessMsg->hProcess=ProcessHandle;
        BaseCreateProcessMsg->hThread=ThreadHandle;
        // other fields remain 0
        // call server
        Status=CsrClientCallServer((PCSR_API_MESSAGE)&BaseApiMsg,NULL,CSR_MAKE_API_NUMBER(BASESRV_SERVERDLL_INDEX,BasepCreateProcess),sizeof(BASE_API_MSG));
        if (!NT_SUCCESS(Status))
        {
                ZwTerminateProcess(ProcessHandle,Status);
                ZwClose(ProcessHandle);
                ZwTerminateThread(ThreadHandle,Status);
                ZwClose(ThreadHandle);
                return Status;
        }
2009-1-12 17:30
0
雪    币: 217
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
在内核创建User Thread比创建User Process更有意义吧。
2009-1-12 18:52
0
游客
登录 | 注册 方可回帖
返回
//