阅读:2853回复:13
killvxk等大牛,帮我看看线程监控问题。
首先申明一下,内容超过1500,发信不行,所以发版上来,恳请版主照顾。
同时,这个思路是killvxk给我回信提供得,非常谢谢他。在此点名,有违版规矩,也是不得以。 感谢killvxk,WQXNETQIQI,版主等大牛! ============================ 这个问题就是我前面得帖子远程线程监控得问题。通过监控ntcreatethread实现。 killvxk非常谢谢您帮我解答!我现在按照您得办法在做。 现在我还有一个问题,我在驱动里面使用NtQueryInformationProcess来获取进程信息。 我写的比较长,但是很细,只希望你能帮我,耽误您们得时间了。如果能得到您们得在线指导,那最荣幸了,请您们喝酒吃饭都不是问题。呵呵。或者来我们学校玩玩也可以。 我得qq11604612,msn:lwj707@hotmail.com 具体我在用户界面里面取得NtCreateThread得地址,传入驱动 DWORD * addr=(DWORD *)(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateThread")); DeviceIoControl(device,1000,addr,4,addr,4,&dw,0); 驱动里面对NtCreateThread进行hook,现在hook代码没有问题,但是我要获取NtCreateThread得第四个参数(见最后函数原形)ProcessHandle 却出现问题,麻烦帮我看看哪里出了问题。跪谢了。 全局变量: ULONG g_RealCallee,g_Process 对ioctrl进行驱动响应代码如下: ULONG a,Index; buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer; // hook service dispatch table memmove(&Index,buff,4); a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable; base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0); a=(ULONG)&Proxy;//钩子代理函数 _asm { mov eax,base mov ebx,dword ptr[eax] mov g_RealCallee,ebx mov ebx,dword ptr[eax+14h] //////关键这儿我不知道这样写对不对?????在函数地址上加20=0x14,因为第一个参数是加8。但是我取出来好像不对,因为每次都是一个常数,而且高位为1,很大得数。 mov g_Process,ebx mov ebx,a mov dword ptr[eax],ebx } 然后在Proxy代理函数中用 NtQueryInformationProcess出来总是函数执行不对。 if(!NT_SUCEED(NtQueryInformationProcess( g_Process, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)) ) 这总是返回错误。 注:NtCreateThread函数原形如下: NTSYSAPI NTSTATUS NTAPI NtCreateThread( OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PINITIAL_TEB InitialTeb, IN BOOLEAN CreateSuspended ); NtQueryInformationProcess原形如下 NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess( IN HANDLE ProcessHandle, IN PROCESS_INFORMATION_CLASS ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG ReturnLength ); 第一个,那个notfiy是在线程Ready前触发的 |
|
沙发#
发布于:2007-04-08 07:33
.......好诡异的代码。。。。居然去函数代码区取参数。。。参数是在堆栈里好不好。。。
|
|
|
板凳#
发布于:2007-04-08 07:33
参考下rootkit.com里的基础级SSDT HOOK吧。。。
|
|
|
地板#
发布于:2007-04-08 17:04
这个是SSDT Hook的~
不用汇编取参数~替换SSDT内地址Hook比较简单... |
|
|
地下室#
发布于:2007-04-08 18:35
我还是不知道怎么取出hprocess句柄。
rootkit.com里的基础级SSDT HOOK ~~~~~~目前正在看这里面得东西,SSDT HOOK能搞定取参数吧? 我得代码也是从codeproject下载得,呵呵。 不用汇编取参数~替换SSDT内地址Hook比较简单... ~~~~~~~~~那怎么取得参数呢,killvxk大牛您说怎么搞出hprocess参数。 多谢多谢!!! |
|
5楼#
发布于:2007-04-08 19:47
拿自己的NtCreateThread函数地址替换原ssdt中地址,然后直接在MyNtCreateThread中就可以得到hProcess啦,最后不要忘了调用OldNtCreateThread哦
|
|
|
6楼#
发布于:2007-04-08 21:31
WQXNETQIQI,多谢您!
正按照您得想法在做,我想问一下您们,有没有看一个进程得handle得方法???一般工具都只有 process id,没有process handle。如果能看handle,我好测试我得代码对不对。 MyNtCreateThread相当于下面Proxy, 我直接在里面就能搞定参数? _declspec(naked) Proxy()这个申明没有参数, 我不知道怎么搞了。 //just saves execution contect and calls check() _declspec(naked) Proxy() { _asm{ //save execution contect and calls check() -the rest depends upon the value check() returns // if it is 1, proceed to the actual callee. Otherwise,return STATUS_ACCESS_DENIED pushfd pushad mov ebx,esp add ebx,40 push ebx call check cmp eax,1 jne block //proceed to the actual callee popad popfd jmp RealCallee ///这样相当于OldNtCreateThread //return STATUS_ACCESS_DENIED block:popad mov ebx, dword ptr[esp+8] mov dword ptr[ebx],0 mov eax,0xC0000022L popfd ret 32 } } 其中挂钩hook得代码在第一贴里。 具体我在用户界面里面取得NtCreateThread得地址,传入驱动 DWORD * addr=(DWORD *)(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateThread")); DeviceIoControl(device,1000,addr,4,addr,4,&dw,0); 驱动里面对NtCreateThread进行hook,现在hook代码没有问题,但是我要获取NtCreateThread得第四个参数(见最后函数原形)ProcessHandle 却出现问题,麻烦帮我看看哪里出了问题。跪谢了。 全局变量: ULONG g_RealCallee,g_Process 对ioctrl进行驱动响应代码如下: ULONG a,Index; buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer; // hook service dispatch table memmove(&Index,buff,4); a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable; base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0); a=(ULONG)&Proxy;//钩子代理函数 _asm { mov eax,base mov ebx,dword ptr[eax] mov g_RealCallee,ebx mov ebx,a mov dword ptr[eax],ebx } |
|
7楼#
发布于:2007-04-09 00:13
参考下rootkit.com里的基础级SSDT HOOK吧
~~~~~~~~~~~· 我只搜到了SSDT hook example (hiding processes) correction这个文章, 作用也不是很大,能推荐点好的不。 谢谢了! |
|
8楼#
发布于:2007-04-09 07:57
看Rootkit.com或者regmon的方法,你用的方法属于hook中的歪门邪道的一种~
|
|
|
9楼#
发布于:2007-04-09 10:01
handle好象process explorer可以看?或者softice也可以好象
你也可以自己获取一下然后DbgPrint一下看 |
|
|
10楼#
发布于:2007-04-09 10:18
我的代码是从codeproject下的一个能够监视控制进程的代码,
http://www.codeproject.com/system/soviet_protector.asp 所以就直接在上面改的。 另外: 1.有没有看一个进程得handle得方法???一般工具都只有 process id,没有process handle。如果能看handle,我好测试我得代码对不对。 2.钩子函数MyNtCreateThread相当于下面Proxy, 我直接在里面就能搞定参数? _declspec(naked) Proxy()这个申明没有参数, 我不知道怎么搞了。 ============ 谢谢版主跟几位大牛一直给予我的帮助! |
|
11楼#
发布于:2007-04-09 18:44
openprocess返回的handle跟
NtQueryInformationProcess( IN HANDLE ProcessHandle, 第一个参数是一个吗? 另外,发现openprocess打开很多进程的返回handle怎么是一个数 ,比较奇怪? 如果这样,怎么从handle到processid的逆向呢 |
|
12楼#
发布于:2007-04-10 00:28
原来handle就是指针,每次open返回的是一个重复使用的地方。呵呵。
搞明白了。 |
|
13楼#
发布于:2008-03-19 09:31
rootkit.com上的方法简单、易用、不容易出错
|
|