)
虽然是这样的,但是我还是劝各位不要用KeUserModeCallBack来传递参数给我们的Ring3代码,要传递也应该使用其它方法——比如Ratter把参数Copy到Ring3代码后面,然后再代码里重定位到地方取参数~返回参数EAX是KeUserModeCallBack的,因而要想要返回参数就要传递outsize为strlen(lpoutbuf)就行了~~
如果非要传递,应该小心一些~因为可能蓝屏~我也不知道为什么~呵呵~
我还有一种方法就是覆盖KeUserCallbackDispatcher为我们Ring3代码的地址----大多数情况下会蓝,然后用KeUserModeCallBack执行,这样我们就可以通过一个常见systemcall_number来执行我们代码,另通过分析ntos/ps/psinit.c
我发现KeUserCallbackDispathcer就是NTDLL里的KiUserCallbackDispatcher~~~习习~~~那样避免蓝屏要用在进程空间改写KiUserCallBackDispatch和插入代码~
内核空间改写的话,要指向内核地址,ring3代码要插入内核的NTDLL空间中~
记得不论在哪里改写都要最后调用原函数~~~!!!!!!!!!~~~~
(这种方法是我最z发现的阿阿----其实是听erx大哥讲的一个思路~)
再多说就成了教唆犯罪了~
在ring0调用Ring3的代码的续
利用建立新的APC方法回调代码——原创者不详~
这种方法一般应用用户层和内核驱动之间有交互——KeUserModeCallBack的是插入回调,
Infect是感染进程~
但是建立新APC的方法更温柔一些,呵呵~~所用到的函数是两个undoc的函数,具体的原始形态实在是简单——感谢Open Source Windows~~~
VOID
KeInitializeApc (
IN PRKAPC Apc,//我们要自己初始化这个OurApc=ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));
IN PRKTHREAD Thread,//目标线程——用户层交互的话,直接KeGetCurrentThread()好了
IN KAPC_ENVIRONMENT Environment,//应该添0,就是CurrentApcEnvironment
IN PKKERNEL_ROUTINE KernelRoutine,//我们的APC处理函数MyApcRoutine,在APC_LEVEL上运行,很恐怖的高级,kernel mode apc!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,//添NULL,
IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL,//添入我们的ring3层的Ring3App代码线性地址,其实是user mode 的APC处理Routine,~~~privalige非常吓人~~~
IN KPROCESSOR_MODE ApcMode OPTIONAL,//1,使用NormRoutine
IN PVOID NormalContext OPTIONAL//第一个参数~~~我们ring3层代码的,习习
)
完成APC初始化后,我们要插入我们的APC了
BOOLEAN
KeInsertQueueApc (
IN PRKAPC Apc,//OurApc
IN PVOID SystemArgument1,//Ring3App的第二个参数arg2
IN PVOID SystemArgument2,//Ring3App的第三个参数arg3
IN KPRIORITY Increment//0
)
Ring3层代码的样子::
void Ring3App(ulong arg1,ulong arg2,ulong arg3);
我们在kernel mode 的APC
//我们也可以在这做点什么,不过APC_LEVEL这个高级别东西,我们最好还是不要做什么大动作~
void MyApcRoutine(struct _KAPC *Apc,//Apc结构不说了吧?
PKNORMAL_ROUTINE norm_routine,//我们的Ring3App地址
void *context,//arg1
void *SysArg1,//arg2
void *SysAr