找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 16129|回复: 23

[求助。]烦恼了几天 4 个问题。求指点迷津。[求助。][求助。

 火.. [复制链接]

9

主题

117

回帖

0

精华

银牌会员

积分
422
发表于 2012-2-19 01:32:06 | 显示全部楼层 |阅读模式
本帖最后由 xmlpull 于 2012-2-19 01:36 编辑

{:soso_e119:} 苦恼了几天。-、-还是没能解决。 求各位哥哥姐姐指点。!!!!



问题1: 搜索并使用PsOpenProcess失败。


原理是根据 Tesla.Angela 的 《[原创开源]在WIN64上搜索PspTerminateThreadByPointer并使用》

QQ截图20120219004206.png


在WINDBG中。uf NtOpenProcess. 看到特征码 0x20 跟 0xE8 .So。
  1. typedef NTSTATUS (__fastcall *PSOPENPROCESS)(
  2.         __out PHANDLE ProcessHandle,
  3.         __in ACCESS_MASK DesiredAccess,
  4.         __in POBJECT_ATTRIBUTES ObjectAttributes,
  5.         __in_opt PCLIENT_ID ClientId
  6.         );

  7.         HANDLE h=0;

  8.         OBJECT_ATTRIBUTES ObjectAttributes;
  9.         CLIENT_ID ClientId;
  10.         ClientId.UniqueThread=NULL;
  11.         ClientId.UniqueProcess=PID;

  12.         InitializeObjectAttributes(&ObjectAttributes,0,0,0,0);

复制代码
  1.                
  2.          AddressOfPsTST=(ULONG64)GetFunctionAddr(L"NtOpenProcess");
  3.          for(i=1;i<0xff;i++)
  4.         {
  5.         if(MmIsAddressValid((PVOID)(AddressOfPsTST+i))!=FALSE)
  6.                 {
  7.                  if(*(BYTE *)(AddressOfPsTST+i)==0x20 && *(BYTE *)(AddressOfPsTST+i+1)==0xe8)
  8.                                  //目标地址-原始地址-5=机器码 ==> 目标地址=机器码+5+原始地址
  9.                 {
  10.                 RtlMoveMemory(&callcode,(PVOID)(AddressOfPsTST+i+2),4);
  11.                 AddressOfPspTTBP=(ULONG64)callcode + 5 + AddressOfPsTST+i+1;
  12.                 }
  13.                 }
  14.                 }
  15.                 PSOP=(PSOPENPROCESS)AddressOfPspTTBP;
复制代码
{:soso_e119:} {:soso_e119:}   当执行PSOP 就蓝屏了。提示啥PAGE_FAULT_XXXXXXXXXXXXX
  1. PSOP(&h,PROCESS_ALL_ACCESS,&ObjectAttributes,&ClientId);
复制代码
个人觉得可能问题:

             ①  是不是 调用约定有问题。 stdcall  fastcall.  -。- 因为 按照WINDBG。汇编图。PsOpenProcess.并没有 使用                                                                  RCX,RDX,R8,R9,而是直接 对RSP操作。

可是Baidu上找到
借PC处理器架构由x86向x64过渡之机,MS清理了windows x64平台上的函数调用约定,由原来的数种包括stdcall,thiscall,fastcall,cdecl,pascal等,统一为一种新的fastcall调用方式。这种调用方式得益于x64平台寄存器数量的增加。
  

{:soso_e119:}  求解。

             ②   由于问题①。所以心想 是不是 PsOpenProcess。根本没有那么多参数。 -。- 不解。 求解。






问题2: 由于搜索PsOpenProcess并使用失败。就改成从 ObOpenObjectByPointer 入手。

代码如下:
  1. NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(
  2.                                                                                                             IN ULONG ulProcId,
  3.                                                                                                             OUT PEPROCESS * pEProcess);

  4.                       NTKERNELAPI NTSTATUS ObOpenObjectByPointer(
  5.                                                                                                        IN PVOID Object,
  6.                                                                                                        IN ULONG HandleAttributes,
  7.                                                                                                        IN PACCESS_STATE PassedAccessState OPTIONAL,
  8.                                                                                                        IN ACCESS_MASK DesiredAccess OPTIONAL,
  9.                                                                                                        IN POBJECT_TYPE ObjectType OPTIONAL,
  10.                                                                                                        IN KPROCESSOR_MODE AccessMode,
  11.                                                                                                        OUT PHANDLE Handle);
复制代码
  1. NTSTATUS  status;
  2.         PEPROCESS  EProcess = NULL;
  3.         HANDLE    handle = 0;
  4.         UNICODE_STRING y;
  5.         PULONG64    PsProcessType;
  6.         ULONG PID;

  7.         PID=(ULONG)ClientId->UniqueProcess;

  8.         RtlInitUnicodeString( &y, L"PsProcessType");
  9.         PsProcessType=(PULONG64) MmGetSystemRoutineAddress(&y);   

  10.         status = PsLookupProcessByProcessId(PID, &EProcess);

  11.         if (NT_SUCCESS(status))
  12.         {
  13.           status  = ObOpenObjectByPointer(EProcess,
  14.                                        0,
  15.                                        0,
  16.                                        PROCESS_ALL_ACCESS,
  17.                                        (POBJECT_TYPE)*PsProcessType,
  18.                                        KernelMode/*UserMode*/,
  19.                                        &handle);



  20.                            //这时NT_SUCCESS(status) 是成功的。 可是 返回的 handle 是负数 -2131151XXX。

  21.          }
复制代码
个人觉得可能问题:

      ①  在uf ObOpenObjectByPointer以后 发现 实际上是调用。ObOpenObjectByPointerWithTag



       _ 。-是不是 得调用 ObOpenObjectByPointerWithTag。而不能使用 NTKERNELAPI

        由于 问题1 不能解决。所以放弃者想法。{:soso_e119:} {:soso_e119:}

      

问题3:  由于问题1.问题2.  一直觉得 参数是不是都有问题。.


       但是有些问题还是弄不明白、

        ① 64位的椎栈 。在Lankaiha 的 x64 汇编入门里面提到

x64中椎栈被扩展为64位;其次,我们在调用MessageBoxA时,要给四个参数外加一个返回地址留空间,因此8(位)*5=40=28h。


  1. sub rsp,28h
  2. xor r9d,r9d
  3. lea r8, caption
  4. lea rdx, text
  5. xor rcx,rcx
  6. call MessageBoxA
  7. add rsp,28h
  8. ret
复制代码


QQ截图20120219011207.png


        可是看WINDBG 。立马想不明白、 sub rsp ,38h   ;  add rsp 38h ,  按照经验。NtOpenProcess 就四个参数、 8(位) *5=40=28h 。。。 可是为什么 WINDBG 里面显示  sub rsp ,38h   ;  add rsp 38h;







问题4 ; 最后一个问题了. 老大的。在WIN64上实现强制读写进程内存  

老大是通过CR3 切换 读取数据的。  但是NP 好像能在R3下 。防止切换CR3 读取内存。。

求指点有那么NB么。






857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 09:13:00 | 显示全部楼层
1.

NTSTATUS
FASTCALL
PsOpenProcess(
    IN PCLIENT_ID ClientId OPTIONAL,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN KPROCESSOR_MODE PreviousMode,
    IN PVOID Unknow
    );

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 09:17:41 | 显示全部楼层
2.

谁说ClientId的ProcessId的属性是ULONG?是HANDLE,在X64下,sizeof(ULONG)=4,sizeof(HANDLE)=8
前几天我还在微博上骂过把HANDLE改为DWORD的是傻13。。。

另外,PsLookupProcessByProcessId的定义应该为:
NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(
                                                                                                            IN HANDLE ulProcId,
                                                                                                            OUT PEPROCESS * pEProcess);


最后说一句,不要乱抄网上一些人开源的垃圾ARK代码,里面不少结构体定义都是错误的,结构体定义要看MSDN或者WRK。。。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 09:25:27 | 显示全部楼层
3.

没在你的截图里看到调用NtOpenProcess要add rsp,38h或者sub rsp,38h
但是在你的截图里看调用ObOpenObjectByPointerWithTag,不是很正确吗?
(8+1)*8=72=48h

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 09:31:54 | 显示全部楼层
4.

没研究过。不知道。
不过防止CR3读写进程内存确实不是什么难的事情,记得清零DIRECTORY_TABLE_BASE+hook KiAttachThread即可。。。
不过我们还有更为暴力的读写进程内存手段,挂钩IofCallDriver或者KiFastCallEntry之类的函数,然后当进程进入我们的hook函数时再行读写。。。

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 14:40:39 | 显示全部楼层
本帖最后由 xmlpull 于 2012-2-19 14:46 编辑
Tesla.Angela 发表于 2012-2-19 09:13
1.

NTSTATUS




{:soso_e119:} 还是不行。 实在不懂错哪了。

我把代码贴出来。
  1. typedef NTSTATUS   (__fastcall *PSOPENPROCESS) (IN PCLIENT_ID ClientId OPTIONAL,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN KPROCESSOR_MODE PreviousMode,IN PVOID Unknow);


  2. PSOPENPROCESS                        PsOpenProcess        = NULL;


  3. NTSTATUS        GetSystemRoutineAddress(PCWSTR FunctionName,
  4.                                          unsigned char FeatureOne,
  5.                                          unsigned char FeatureTwo,
  6.                                          PULONG64 RoutineAddress)
  7. {
  8.         ULONG32 callcode=0;
  9.         ULONG64 RealRoutineAddress=0,i=0,VirginRoutineAddress=0;

  10.         VirginRoutineAddress=(ULONG64)GetFunctionAddrss(FunctionName);

  11.         if(VirginRoutineAddress == 0)
  12.         {
  13.                    return STATUS_UNSUCCESSFUL;
  14.         }

  15.         for( i = 1 ; i < 0xff ; i++ )
  16.         {
  17.         if(MmIsAddressValid((PVOID)(VirginRoutineAddress+i)) != FALSE)
  18.           {
  19.         if((*((unsigned char*)(VirginRoutineAddress + i))) ==FeatureOne && *((unsigned char *)(VirginRoutineAddress+i+1))==FeatureTwo)
  20.                 {

  21.                 RtlMoveMemory(&callcode ,(PVOID)(VirginRoutineAddress        + i + 2) , 4 );
  22.                                
  23.                 RealRoutineAddress=(ULONG64)callcode+5+VirginRoutineAddress+i+1;

  24.                 *RoutineAddress    =RealRoutineAddress;

  25.                 break;
  26.                 }
  27.                 }
  28.         }

  29.         return STATUS_SUCCESS;


  30. }


  31.         ULONG64 RealAddress = 0;

  32.        
  33.         if( GetSystemRoutineAddress(L"NtOpenProcess",       
  34.                                               0x20 ,       
  35.                                               0xe8 ,       
  36.                                               &RealAddress ) == STATUS_SUCCESS)
  37.         {
  38.                 PsOpenProcess = (PSOPENPROCESS)RealAddress;

  39.         }


  40.         ClientId.UniqueProcess=(HANDLE)2828;
  41.         ClientId.UniqueThread=NULL;

  42.         InitializeObjectAttributes(&ObjectAttributes,0,0,0,0);

  43.         if(PsOpenProcess!=0)
  44.         PsOpenProcess(&ClientId,&ObjectAttributes,&h,PROCESS_ALL_ACCESS,KernelMode,NULL);




复制代码
{:soso_e119:} 还是蓝屏。 PAGE_FAULT_IN_NONPAGED_ARER

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 14:53:38 | 显示全部楼层
Tesla.Angela 发表于 2012-2-19 09:17
2.

谁说ClientId的ProcessId的属性是ULONG?是HANDLE,在X64下,sizeof(ULONG)=4,sizeof(HANDLE)=8

{:soso_e119:}   这个也不行。


贴代码

  1. NTKERNELAPI
  2. NTSTATUS  
  3. PsLookupProcessByProcessId(IN HANDLE ulProcId,OUT PEPROCESS * pEProcess);


  4. NTKERNELAPI
  5. NTSTATUS
  6. ObOpenObjectByPointer (IN PVOID Object,                                                                                IN ULONG HandleAttributes,                                                                                IN PACCESS_STATE PassedAccessState OPTIONAL,                                                                IN ACCESS_MASK DesiredAccess OPTIONAL,                                                                IN POBJECT_TYPE ObjectType OPTIONAL,                                                                IN KPROCESSOR_MODE AccessMode,                                                                        OUT PHANDLE Handle);



  7. NTSTATUS __stdcall MyOpenProcess(HANDLE PID,__out PHANDLE pHandle)
  8. {

  9.                 NTSTATUS  status;
  10.         PEPROCESS  EProcess = NULL;
  11.         HANDLE    handle = 0;
  12.         UNICODE_STRING y;
  13.         PULONG64    PsProcessType;

  14.         RtlInitUnicodeString( &y, L"PsProcessType");
  15.         PsProcessType=(PULONG64) MmGetSystemRoutineAddress(&y);   

  16.         status = PsLookupProcessByProcessId(PID, &EProcess);

  17.         if (NT_SUCCESS(status))
  18.         {
  19.        
  20.                       if (PsProcessType)
  21.                   {   
  22.        
  23.              status = ObOpenObjectByPointer(
  24.                                        EProcess,
  25.                                        0,
  26.                                        0,
  27.                                        PROCESS_ALL_ACCESS,
  28.                                        (POBJECT_TYPE)*PsProcessType,
  29.                                         KernelMode,
  30.                                         &handle);

  31.                            }
  32.                         }
  33. }

  34. NT_SUCCESS(status)     还是成功。 但是 handle 还是为负数。

复制代码
QQ截图20120219145258.png

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 15:00:18 | 显示全部楼层
Tesla.Angela 发表于 2012-2-19 09:25
3.

没在你的截图里看到调用NtOpenProcess要add rsp,38h或者sub rsp,38h



{:soso_e119:}

QQ截图20120219004206.png


贴错图了。

按照
NTSTATUS
FASTCALL
PsOpenProcess
(IN PCLIENT_ID ClientId OPTIONAL,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN KPROCESSOR_MODE PreviousMode,
IN PVOID Unknow);

是对了。


疑问 是。  前四个参数 应该要调用 RCX ,RDX ,R8,R9 ,多出的参数才用椎栈 。 可是上图 看不出调用了 RCX ,RDX ,R8,R9 、偏偏又有 6+1 个参数、

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 21:00:06 | 显示全部楼层
xmlpull 发表于 2012-2-19 14:40
还是不行。 实在不懂错哪了。

我把代码贴出来。 还是蓝屏。 PAGE_FAULT_I ...

汗,这份代码应该是很早的,有个严重的代码错误。。。
你不应该直接COPY我的代码啊。。。
ULONG32 callcode=0;
应该改为:
LONG32 callcode=0;

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 21:17:59 | 显示全部楼层
xmlpull 发表于 2012-2-19 14:53
这个也不行。

你的代码怎么这么蛋疼呢???!!!
Status = ObOpenObjectByPointer(pEprocess, OBJ_KERNEL_HANDLE, NULL, GENERIC_READ, *PsProcessType, KernelMode, &hProcess);  

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2012-2-19 21:20:29 | 显示全部楼层
xmlpull 发表于 2012-2-19 15:00
贴错图了。

按照

这个真不知道怎么说你好。。。
如果RCX、RDX、R8、R9 已经有了对应的值,还要怎么写,莫非一定要写:
mov rcx,rcx
mov rdx,rdx
mov r8,r8
mov r9,r9

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 22:32:01 | 显示全部楼层
Tesla.Angela 发表于 2012-2-19 21:00
汗,这份代码应该是很早的,有个严重的代码错误。。。
你不应该直接COPY我的代码啊。。。
ULONG32 callco ...

{:soso_e119:} {:soso_e119:}

还是不行。!!1 这次没PAGE错误提示了。 但是还是蓝。

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 22:35:32 | 显示全部楼层
Tesla.Angela 发表于 2012-2-19 21:17
你的代码怎么这么蛋疼呢???!!!
Status = ObOpenObjectByPointer(pEprocess, OBJ_KERNEL_HANDLE, NU ...

{:soso_e119:} {:soso_e119:} {:soso_e119:}

同样也不行。 T。T我蛋疼了几天了。 还是返回负数。

是不是          PsProcessType 有问题。

         PULONG64    PsProcessType;
        RtlInitUnicodeString( &y, L"PsProcessType");
        PsProcessType=(PULONG64) MmGetSystemRoutineAddress(&y);   


ObOpenObjectByPointer(EProcess, OBJ_KERNEL_HANDLE, NULL, GENERIC_READ, (POBJECT_TYPE)* PsProcessType, KernelMode, &handle);  


9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 22:40:41 | 显示全部楼层
本帖最后由 xmlpull 于 2012-2-19 22:49 编辑
Tesla.Angela 发表于 2012-2-19 21:20
这个真不知道怎么说你好。。。
如果RCX、RDX、R8、R9 已经有了对应的值,还要怎么写,莫非一定要写:
mov ...


如果这样 。

就是说 要推导出 这个函数 的参数。 就得去查看 RCX、RDX、R8、R9  寄存器。


可是 寄存器长度 为64位。 太长了。

{:soso_e118:} 反正我意思就是 该如何 推导出 该函数的 参数。

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-19 22:46:20 | 显示全部楼层
Tesla.Angela 发表于 2012-2-19 09:31
4.

没研究过。不知道。

清零DIRECTORY_TABLE_BASE 用不用在R0 下进行 ?

hook KiAttachThread 。Win7 x64 。不给HOOK吧、

挂钩IofCallDriver或者KiFastCallEntry之类的函数,然后当进程进入我们的hook函数时再行读写。。。


这句话 还是不太明白。 BAIDU了一下、 IofCallDriver 都跟 隐藏文件有关。怎么实现读取内存.

挂钩KiFastCallEntry.  难道是说 。当目标 执行某些 要切换到内核的函数是(如CreateProcess).挂钩KiFastCallEntry 后。让跳转到自己的函数。 接下来 还是获取CR3 木?

17

主题

89

回帖

0

精华

铜牌会员

积分
250
发表于 2012-2-20 14:39:11 | 显示全部楼层
有没有过patchguard的?应该有修改内存吧。调试的状态下patchguard是不会触发蓝屏的。

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2012-2-20 14:41:49 | 显示全部楼层
wenh7788 发表于 2012-2-20 14:39
有没有过patchguard的?应该有修改内存吧。调试的状态下patchguard是不会触发蓝屏的。 ...

过了 patchguard的、 打了补丁。+调试模式

17

主题

89

回帖

0

精华

铜牌会员

积分
250
发表于 2012-2-20 15:02:30 | 显示全部楼层
哥们,其实我最近也在研究这个东西东西,加油吧,我帮你看看,下个源码去先....别着急。

17

主题

89

回帖

0

精华

铜牌会员

积分
250
发表于 2012-2-20 15:09:20 | 显示全部楼层
我没有权限{:soso_e105:}

0

主题

94

回帖

0

精华

钻石会员

积分
3031
发表于 2013-2-18 11:03:53 | 显示全部楼层
不知道最后有找出原因吗? 有的话 可以分享吗? 谢谢!!

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-11 23:45:37 | 显示全部楼层
我也想知道結果如何

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2013-4-12 09:23:48 | 显示全部楼层
LZ好久没来了,不知道问题解决了没有???

9

主题

117

回帖

0

精华

银牌会员

积分
422
 楼主| 发表于 2013-4-12 16:47:49 | 显示全部楼层
Tesla.Angela 发表于 2013-4-12 09:23
LZ好久没来了,不知道问题解决了没有???

TA。居然有预知能力。预知我今天会上线!!! 好久没时间搞了。 今天 才有空上来看看 。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2013-4-19 12:55:58 | 显示全部楼层
xmlpull 发表于 2013-4-12 16:47
TA。居然有预知能力。预知我今天会上线!!! 好久没时间搞了。 今天 才有空上来看看 。  ...

太巧合了。。。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表