formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
阅读:2853回复:13

killvxk等大牛,帮我看看线程监控问题。

楼主#
更多 发布于:2007-04-07 23:19
首先申明一下,内容超过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前触发的

第二个,PsGet那个的pid是使用NtCreateThread的进程id
方 ..
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-04-08 07:33
.......好诡异的代码。。。。居然去函数代码区取参数。。。参数是在堆栈里好不好。。。
驱动开发者 呵呵
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-04-08 07:33
参考下rootkit.com里的基础级SSDT HOOK吧。。。
驱动开发者 呵呵
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-04-08 17:04
这个是SSDT Hook的~

不用汇编取参数~替换SSDT内地址Hook比较简单...
没有战争就没有进步 X3工作组 为您提供最好的军火
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-08 18:35
我还是不知道怎么取出hprocess句柄。
rootkit.com里的基础级SSDT HOOK
~~~~~~目前正在看这里面得东西,SSDT HOOK能搞定取参数吧?
我得代码也是从codeproject下载得,呵呵。

不用汇编取参数~替换SSDT内地址Hook比较简单...
 ~~~~~~~~~那怎么取得参数呢,killvxk大牛您说怎么搞出hprocess参数。

多谢多谢!!!
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-04-08 19:47
拿自己的NtCreateThread函数地址替换原ssdt中地址,然后直接在MyNtCreateThread中就可以得到hProcess啦,最后不要忘了调用OldNtCreateThread哦
驱动开发者 呵呵
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
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
}
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-09 00:13
参考下rootkit.com里的基础级SSDT HOOK吧
~~~~~~~~~~~·
     我只搜到了SSDT hook example (hiding processes) correction这个文章,
作用也不是很大,能推荐点好的不。
谢谢了!
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2007-04-09 07:57
看Rootkit.com或者regmon的方法,你用的方法属于hook中的歪门邪道的一种~
没有战争就没有进步 X3工作组 为您提供最好的军火
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2007-04-09 10:01
handle好象process explorer可以看?或者softice也可以好象
你也可以自己获取一下然后DbgPrint一下看
驱动开发者 呵呵
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
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()这个申明没有参数,
我不知道怎么搞了。
============
谢谢版主跟几位大牛一直给予我的帮助!
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-04-09 18:44
openprocess返回的handle跟
NtQueryInformationProcess(
IN HANDLE           ProcessHandle,
第一个参数是一个吗?

另外,发现openprocess打开很多进程的返回handle怎么是一个数
,比较奇怪?

如果这样,怎么从handle到processid的逆向呢
formytest
驱动牛犊
驱动牛犊
  • 注册日期2007-01-16
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-04-10 00:28
原来handle就是指针,每次open返回的是一个重复使用的地方。呵呵。
搞明白了。
niumowangmeng
驱动牛犊
驱动牛犊
  • 注册日期2008-02-22
  • 最后登录2008-06-07
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-03-19 09:31
rootkit.com上的方法简单、易用、不容易出错
游客

返回顶部