|
本帖最后由 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_XXXXXXXXXXXXX- 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 入手。
代码如下:- 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);
复制代码- NTSTATUS status;
- PEPROCESS EProcess = 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么。
|
|