您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > CreateUserModeThreadFromKernelLand
Createusermodethreadfromkernelland简单方法从内核创建用户态线程.在内核想要执行用户态的代码,通常的方式有.apc,usermodecallback等.但是都各有缺点.APC.1.apc的分发必须不被禁用,2.目标进程必须有处于alertable的线程.特别是后者这个条件,很多时候不一定有.比如explorer进程有很多线程,通常能找到.但是像记事本这种单线程程序,就找不到.UserModeCallback.必须在目标进程空间调用,不能是attach.的.必须加载过User32的.,这样才有Kernelcallbacktable在某些特定的时机,我们是有机会执行的.比如在进程刚刚创建的时候,我们可以修改OEP,修改IAT等加载我们的dll在第一个线程创建之后,我们可以插入apc.这些条件都很好满足.还有WOW64的兼容处理,在另一篇文章里说明.但是如果任何时候.不限制调用的时机,比如在进程正常运行之后,这个时候,这些条件都不满足了.虽然我们可以构造出场景,比如,如果你是一个过滤驱动或者hook型的,那么总是有机会会切换到目标进程上空的,这个时候就有机会可以UserModeCallback.现在要说的就是没有这些限制的做法.可以在任意时机,任意进程空间在任意进程中执行代码.那就是直接在内核态给一个用户态进程创建一个用户态的线程.模拟用户态进程给自己创建一个非远程线程的基本流程.1.创建线程初始的栈,分配和保留栈空间.设置栈保护页.实现栈的自动增长.2设置线程上下文,各个段寄存器和基本寄存器,设置eip指向Kernel32!BaseThreadTrunk.text:7C810473.text:7C810473;===============SUBROUTINE=======================================.text:7C810473.text:7C810473;Attributes:bp-basedframe.text:7C810473.text:7C810473;int__stdcallBaseInitializeContext(PCONTEXTContext,PVOIDParameter,PVOIDStartAddress,PVOIDStackAddress,ULONGContextType).text:7C810473_BaseInitializeContext@20procnear;CODEXREF:CreateRemoteThread(x,x,x,x,x,x,x)+84↓p.text:7C810473;CreateProcessInternalW(x,x,x,x,x,x,x,x,x,x,x,x)+690↓p....text:7C810473.text:7C810473Context=dwordptr8.text:7C810473Parameter=dwordptr0Ch.text:7C810473StartAddress=dwordptr10h.text:7C810473StackAddress=dwordptr14h.text:7C810473ContextType=dwordptr18h.text:7C810473.text:7C810473;FUNCTIONCHUNKAT.text:7C81F10ASIZE00000019BYTES.text:7C810473;FUNCTIONCHUNKAT.text:7C8316A2SIZE0000000FBYTES.text:7C810473.text:7C8104738BFFmovedi,edi.text:7C81047555pushebp.text:7C8104768BECmovebp,esp.text:7C8104788B4508moveax,[ebp+Context].text:7C81047B8B4D10movecx,[ebp+StartAddress].text:7C81047E83A08C00000000and[eax+CONTEXT.SegGs],0.text:7C810485837D1801cmp[ebp+ContextType],1.text:7C8104898988B0000000mov[eax+CONTEXT._Eax],ecx.text:7C81048F8B4D0Cmovecx,[ebp+Parameter].text:7C8104928988A4000000mov[eax+CONTEXT._Ebx],ecx.text:7C8104986A20push20h.text:7C81049A59popecx.text:7C81049B898894000000mov[eax+CONTEXT.SegEs],ecx.text:7C8104A1898898000000mov[eax+CONTEXT.SegDs],ecx.text:7C8104A78988C8000000mov[eax+CONTEXT.SegSs],ecx.text:7C8104AD8B4D14movecx,[ebp+StackAddress].text:7C8104B0C780900000003800+mov[eax+CONTEXT.SegFs],38h.text:7C8104BAC780BC0000001800+mov[eax+CONTEXT.SegCs],18h.text:7C8104C4C780C00000000030+mov[eax+CONTEXT.EFlags],3000h.text:7C8104CE8988C4000000mov[eax+CONTEXT._Esp],ecx.text:7C8104D40F8530EC0000jnzloc_7C81F10A.text:7C8104DAC780B80000002907+mov[eax+CONTEXT._Eip],offset_BaseThreadStartThunk@8;BaseThreadStartThunk(x,x).text:7C8104E4.text:7C8104E4loc_7C8104E4:;CODEXREF:BaseInitializeContext(x,x,x,x,x)+ECAB↓j.text:7C8104E4;BaseInitializeContext(x,x,x,x,x)+21239↓j.text:7C8104E483C1FCaddecx,0FFFFFFFCh.text:7C8104E7C70007000100mov[eax+CONTEXT.ContextFlags],10007h.text:7C8104ED8988C4000000mov[eax+CONTEXT._Esp],ecx.text:7C8104F35Dpopebp.text:7C8104F4C21400retn14h.text:7C8104F4_BaseInitializeContext@20endp.text:7C8104F4.text:7C8104F4;---------------------------------------------------------------------------3对于vista以后,还得分配TEB的ActiveContextStackPointer.要不然执行某些用户态的API的时候,那些API没有检查TEB的ActiveContextStackPointer是否为NULL就从中取值,造成崩溃.windows的CreateThread也做了这些事..text:0DCEBD8A234D10andecx,[ebp+dwStackSize].text:0DCEBD8D51pushecx;MaximumStackSize.text:0DCEBD8EF7D8negeax.text:0DCEBD901BC0sbbeax,eax.text:0DCEBD92234510andeax,[ebp+dwStackSize].text:0DCEBD9550pusheax;StackSize.text:0DCEBD9653pushebx;ZeroBits.text:0DCEBD9756pushesi;CreateThreadFlags.text:0DCEBD98FFB5B8FDFFFFpush[ebp+StartContext];StartContext.text:0DCEBD9EFFB5D0FDFFFFpush[ebp+StartRoutine];StartRoutine.text:0DCEBDA4FFB5CCFDFFFFpush[ebp+ProcessHandle];ProcessHandle.text:0DCEBDAAFFB5BCFDFFFFpush[ebp+ObjectAttributes];ObjectAttributes.text:0DCEBDB068FFFF1F00push1FFFFFh;DesiredAccess.text:0DCEBDB58D85E4FDFFFFleaeax,[ebp+hThread].text:0DCEBDBB50pusheax;ThreadHandle.text:0DCEBDBCFF157413CE0Dcallds:__imp__NtCreateThreadEx@44;NtCreateThreadEx(x,x,x,x,x,x,x,x,x,x,x).text:0DCEBDC28985E8FDFFFFmov[ebp+var_218],eax.text:0DCEBDC83BC3cmpeax,ebx.text:0DCEBDCA0F8CA5F80100jlloc_DD0B675.text:0DCEBDD0895DFCmov[ebp+ms_exc.disabled],ebx.text:0DCEBDD364A118000000moveax,largefs:18h.text:0DCEBDD98B8DC0FDFFFFmovecx,[ebp+var_240].text:0DCEBDDF3B4820cmpecx,[eax+20h].text:0DCEBDE27573jnzshortloc_DCEBE57.text:0DCEBDE48D85E0FDFFFFleaeax,[ebp+var_220].text:0DCEBDEA50pusheax.text:0DCEBDEBFF157013CE0Dcallds:__imp__RtlAllocateActivationContextStack@4;RtlAllocateActivationContextStack(x).text:0DCEBDF18985E8FDFFFFmov[ebp+var_218],eax.text:0DCEBDF73BC3cmpeax,ebx.text:0DCEBDF90F8CB2F80100jlloc_DD0B6B1.text:0DCEBDFF8B85E0FDFFFFmoveax,[ebp+var_220].text:0DCEBE058B8DD4FDFFFFmovecx,[ebp+var_22C].text:0DCEBE0B8981A8010000mov[ecx+1A8h],eax.text:0DCEBE1153pushebx.text:0DCEBE126A08push8.text:0DCEBE148D85D8FDFFFFleaeax,[ebp+var_228].text:0DCEBE1A50pusheax.text:0DCEBE1B56pushesi4获取当前进程的BaseObject目录,可以是默认的5ZwCreateThread创建线程对象了.挂起的6最重要的一点了.通知csrss进程,有新线程创建了..text:0DCEBE658B85E4FDFFFFmoveax,[ebp+hThread].text:0DCEBE6B898518FEFFFFmov[ebp+var_1E8],eax
本文标题:CreateUserModeThreadFromKernelLand
链接地址:https://www.777doc.com/doc-2907233 .html