[求助。]烦恼了几天 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么。
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
); 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。。。 3.
没在你的截图里看到调用NtOpenProcess要add rsp,38h或者sub rsp,38h
但是在你的截图里看调用ObOpenObjectByPointerWithTag,不是很正确吗?
(8+1)*8=72=48h 4.
没研究过。不知道。
不过防止CR3读写进程内存确实不是什么难的事情,记得清零DIRECTORY_TABLE_BASE+hook KiAttachThread即可。。。
不过我们还有更为暴力的读写进程内存手段,挂钩IofCallDriver或者KiFastCallEntry之类的函数,然后当进程进入我们的hook函数时再行读写。。。
本帖最后由 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
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 还是为负数。
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 个参数、 xmlpull 发表于 2012-2-19 14:40 static/image/common/back.gif
还是不行。 实在不懂错哪了。
我把代码贴出来。 还是蓝屏。 PAGE_FAULT_I ...
汗,这份代码应该是很早的,有个严重的代码错误。。。
你不应该直接COPY我的代码啊。。。
ULONG32 callcode=0;
应该改为:
LONG32 callcode=0; xmlpull 发表于 2012-2-19 14:53 static/image/common/back.gif
这个也不行。
你的代码怎么这么蛋疼呢???!!!
Status = ObOpenObjectByPointer(pEprocess, OBJ_KERNEL_HANDLE, NULL, GENERIC_READ, *PsProcessType, KernelMode, &hProcess); 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 Tesla.Angela 发表于 2012-2-19 21:00 static/image/common/back.gif
汗,这份代码应该是很早的,有个严重的代码错误。。。
你不应该直接COPY我的代码啊。。。
ULONG32 callco ...
{:soso_e119:} {:soso_e119:}
还是不行。!!1 这次没PAGE错误提示了。 但是还是蓝。 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: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:} 反正我意思就是 该如何 推导出 该函数的 参数。 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 木? 有没有过patchguard的?应该有修改内存吧。调试的状态下patchguard是不会触发蓝屏的。 wenh7788 发表于 2012-2-20 14:39 static/image/common/back.gif
有没有过patchguard的?应该有修改内存吧。调试的状态下patchguard是不会触发蓝屏的。 ...
过了 patchguard的、 打了补丁。+调试模式 哥们,其实我最近也在研究这个东西东西,加油吧,我帮你看看,下个源码去先....别着急。 我没有权限{:soso_e105:} 不知道最后有找出原因吗? 有的话 可以分享吗? 谢谢!! 我也想知道結果如何 LZ好久没来了,不知道问题解决了没有??? Tesla.Angela 发表于 2013-4-12 09:23 static/image/common/back.gif
LZ好久没来了,不知道问题解决了没有???
TA。居然有预知能力。预知我今天会上线!!! 好久没时间搞了。 今天 才有空上来看看 。 xmlpull 发表于 2013-4-12 16:47 static/image/common/back.gif
TA。居然有预知能力。预知我今天会上线!!! 好久没时间搞了。 今天 才有空上来看看 。...
太巧合了。。。
页:
[1]