xmlpull 发表于 2012-2-19 01:32:06

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

本帖最后由 xmlpull 于 2012-2-19 01:36 编辑

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


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


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



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

      HANDLE h=0;

      OBJECT_ATTRIBUTES ObjectAttributes;
      CLIENT_ID ClientId;
      ClientId.UniqueThread=NULL;
      ClientId.UniqueProcess=PID;

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

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

             ①是不是 调用约定有问题。 stdcallfastcall.-。- 因为 按照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 入手。

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

                      NTKERNELAPI NTSTATUS 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);
NTSTATUSstatus;
        PEPROCESSEProcess = NULL;
        HANDLE    handle = 0;
        UNICODE_STRING y;
        PULONG64    PsProcessType;
        ULONG PID;

        PID=(ULONG)ClientId->UniqueProcess;

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

        status = PsLookupProcessByProcessId(PID, &EProcess);

      if (NT_SUCCESS(status))
      {
          status= ObOpenObjectByPointer(EProcess,
                                       0,
                                       0,
                                       PROCESS_ALL_ACCESS,
                                       (POBJECT_TYPE)*PsProcessType,
                                       KernelMode/*UserMode*/,
                                       &handle);



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

         }个人觉得可能问题:

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



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

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

      

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


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

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

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

sub rsp,28h
xor r9d,r9d
lea r8, caption
lea rdx, text
xor rcx,rcx
call MessageBoxA
add rsp,28h
ret



      可是看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么。






Tesla.Angela 发表于 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
    );

Tesla.Angela 发表于 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。。。

Tesla.Angela 发表于 2012-2-19 09:25:27

3.

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

Tesla.Angela 发表于 2012-2-19 09:31:54

4.

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

xmlpull 发表于 2012-2-19 14:40:39

本帖最后由 xmlpull 于 2012-2-19 14:46 编辑

Tesla.Angela 发表于 2012-2-19 09:13 static/image/common/back.gif
1.

NTSTATUS




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

我把代码贴出来。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);


PSOPENPROCESS                        PsOpenProcess        = NULL;


NTSTATUS        GetSystemRoutineAddress(PCWSTR FunctionName,
                                         unsigned char FeatureOne,
                                         unsigned char FeatureTwo,
                                         PULONG64 RoutineAddress)
{
        ULONG32 callcode=0;
        ULONG64 RealRoutineAddress=0,i=0,VirginRoutineAddress=0;

        VirginRoutineAddress=(ULONG64)GetFunctionAddrss(FunctionName);

        if(VirginRoutineAddress == 0)
        {
                   return STATUS_UNSUCCESSFUL;
        }

        for( i = 1 ; i < 0xff ; i++ )
        {
      if(MmIsAddressValid((PVOID)(VirginRoutineAddress+i)) != FALSE)
          {
        if((*((unsigned char*)(VirginRoutineAddress + i))) ==FeatureOne && *((unsigned char *)(VirginRoutineAddress+i+1))==FeatureTwo)
                {

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

                *RoutineAddress    =RealRoutineAddress;

                break;
                }
                }
        }

        return STATUS_SUCCESS;


}


        ULONG64 RealAddress = 0;

       
        if( GetSystemRoutineAddress(L"NtOpenProcess",       
                                              0x20 ,       
                                              0xe8 ,       
                                              &RealAddress ) == STATUS_SUCCESS)
        {
                PsOpenProcess = (PSOPENPROCESS)RealAddress;

        }


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

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

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




{:soso_e119:} 还是蓝屏。 PAGE_FAULT_IN_NONPAGED_ARER

xmlpull 发表于 2012-2-19 14:53:38

Tesla.Angela 发表于 2012-2-19 09:17 static/image/common/back.gif
2.

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


{:soso_e119:}   这个也不行。


贴代码
NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(IN HANDLE ulProcId,OUT PEPROCESS * pEProcess);


NTKERNELAPI
NTSTATUS
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);



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

                NTSTATUSstatus;
        PEPROCESSEProcess = NULL;
        HANDLE    handle = 0;
        UNICODE_STRING y;
        PULONG64    PsProcessType;

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

        status = PsLookupProcessByProcessId(PID, &EProcess);

        if (NT_SUCCESS(status))
        {
       
                      if (PsProcessType)
                {   
       
             status = ObOpenObjectByPointer(
                                       EProcess,
                                       0,
                                       0,
                                       PROCESS_ALL_ACCESS,
                                       (POBJECT_TYPE)*PsProcessType,
                                        KernelMode,
                                        &handle);

                           }
                        }
}

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

xmlpull 发表于 2012-2-19 15:00:18

Tesla.Angela 发表于 2012-2-19 09:25 static/image/common/back.gif
3.

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




{:soso_e119:}



贴错图了。

按照
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 个参数、

Tesla.Angela 发表于 2012-2-19 21:00:06

xmlpull 发表于 2012-2-19 14:40 static/image/common/back.gif
还是不行。 实在不懂错哪了。

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

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

Tesla.Angela 发表于 2012-2-19 21:17:59

xmlpull 发表于 2012-2-19 14:53 static/image/common/back.gif
这个也不行。




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

Tesla.Angela 发表于 2012-2-19 21:20:29

xmlpull 发表于 2012-2-19 15:00 static/image/common/back.gif
贴错图了。

按照


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

xmlpull 发表于 2012-2-19 22:32:01

Tesla.Angela 发表于 2012-2-19 21:00 static/image/common/back.gif
汗,这份代码应该是很早的,有个严重的代码错误。。。
你不应该直接COPY我的代码啊。。。
ULONG32 callco ...

{:soso_e119:} {:soso_e119:}

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

xmlpull 发表于 2012-2-19 22:35:32

Tesla.Angela 发表于 2012-2-19 21:17 static/image/common/back.gif
你的代码怎么这么蛋疼呢???!!!
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);


xmlpull 发表于 2012-2-19 22:40:41

本帖最后由 xmlpull 于 2012-2-19 22:49 编辑

Tesla.Angela 发表于 2012-2-19 21:20 static/image/common/back.gif
这个真不知道怎么说你好。。。
如果RCX、RDX、R8、R9 已经有了对应的值,还要怎么写,莫非一定要写:
mov ...

如果这样 。

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


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

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

xmlpull 发表于 2012-2-19 22:46:20

Tesla.Angela 发表于 2012-2-19 09:31 static/image/common/back.gif
4.

没研究过。不知道。


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

hook KiAttachThread 。Win7 x64 。不给HOOK吧、

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

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

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

wenh7788 发表于 2012-2-20 14:39:11

有没有过patchguard的?应该有修改内存吧。调试的状态下patchguard是不会触发蓝屏的。

xmlpull 发表于 2012-2-20 14:41:49

wenh7788 发表于 2012-2-20 14:39 static/image/common/back.gif
有没有过patchguard的?应该有修改内存吧。调试的状态下patchguard是不会触发蓝屏的。 ...

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

wenh7788 发表于 2012-2-20 15:02:30

哥们,其实我最近也在研究这个东西东西,加油吧,我帮你看看,下个源码去先....别着急。

wenh7788 发表于 2012-2-20 15:09:20

我没有权限{:soso_e105:}

mysmartid 发表于 2013-2-18 11:03:53

不知道最后有找出原因吗? 有的话 可以分享吗? 谢谢!!

kk1025 发表于 2013-4-11 23:45:37

我也想知道結果如何

Tesla.Angela 发表于 2013-4-12 09:23:48

LZ好久没来了,不知道问题解决了没有???

xmlpull 发表于 2013-4-12 16:47:49

Tesla.Angela 发表于 2013-4-12 09:23 static/image/common/back.gif
LZ好久没来了,不知道问题解决了没有???

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

Tesla.Angela 发表于 2013-4-19 12:55:58

xmlpull 发表于 2013-4-12 16:47 static/image/common/back.gif
TA。居然有预知能力。预知我今天会上线!!! 好久没时间搞了。 今天 才有空上来看看 。...

太巧合了。。。
页: [1]
查看完整版本: [求助。]烦恼了几天 4 个问题。求指点迷津。[求助。][求助。