能力值:
( LV2,RANK:10 )
2 楼
晕..刚才忘了给分了..不知道能不能加分的..
能力值:
( LV4,RANK:50 )
3 楼
PsOpenProcess是内核函数,必须在R0调用,貌似现在微软未公开这个函数必须自己生命
能力值:
( LV2,RANK:10 )
4 楼
先谢了..但我在WDK的MSDN和网上都找不到它的原型,不知道怎么声明...
能力值:
( LV2,RANK:10 )
5 楼
PsOpenProcess????
没好说的..
直接跟进内核花几分钟时间就知道啦...未公开的函数一般都要自己跟进去调试逆向..的..
能力值:
( LV2,RANK:10 )
6 楼
下面是vista下NtOpenProcess的代码,不知道从它push的参数里面能不能推出函数的原形,现在想直接调用这个函数但是调用不了,用MmGetSystemRoutineAddress函数也获取不了它的地址..刚开始学内核,很多不懂,麻烦各位了...
lkd> uf NtOpenProcess
nt!NtOpenProcess:
82011b18 8bff mov edi,edi
82011b1a 55 push ebp
82011b1b 8bec mov ebp,esp
82011b1d 51 push ecx
82011b1e 51 push ecx
82011b1f 64a124010000 mov eax,dword ptr fs:[00000124h]
82011b25 8a80e7000000 mov al,byte ptr [eax+0E7h]
82011b2b 8b4d14 mov ecx,dword ptr [ebp+14h]
82011b2e 8b5510 mov edx,dword ptr [ebp+10h]
82011b31 8845fc mov byte ptr [ebp-4],al
82011b34 ff75fc push dword ptr [ebp-4]
82011b37 ff75fc push dword ptr [ebp-4]
82011b3a ff750c push dword ptr [ebp+0Ch]
82011b3d ff7508 push dword ptr [ebp+8]
82011b40 e8cb06d52e call b0d62210 ;PsOpenProcess
82011b45 c9 leave
82011b46 c21000 ret 10h
能力值:
( LV2,RANK:10 )
7 楼
上面的代码主要是这两句不知道是什么作用的..
82011b1f 64a124010000 mov eax,dword ptr fs:[00000124h]
82011b25 8a80e7000000 mov al,byte ptr [eax+0E7h]
能力值:
( LV2,RANK:10 )
8 楼
eax,dword ptr fs:[00000124h]=ETHREAD
下面的你查看下ETHREAD的结构体..
能力值:
( LV2,RANK:10 )
9 楼
在windbg里看到了这个结构,但不知道这个属性是什么用的...
+0x0e7 PreviousMode : Char
能力值:
( LV3,RANK:20 )
10 楼
很明显一看是六个参数
按你贴的反汇编代码,该函数应该是FASTCALL类型的函数,参数有六个猜测的函数声明:
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
);
能力值:
( LV2,RANK:10 )
11 楼
能力值:
( LV2,RANK:10 )
12 楼
谢谢LS(S)的两位先..再研究一下不行换其它方法了..呵..
能力值:
( LV2,RANK:10 )
13 楼
應該不對吧?
那兩次PUSH ECX...改掉.估计是保留堆栈参数?
上面兩次壓進ebp-4
PreviousMode
PsOpenProcess(
忘記了.呵呵.你對應下NT!OpenProcess外面的調用.我懶搞,
這個也是外面傳進來的參數,
PreviousMode,
PreviousMode
);
PS:直接寫個OpenProcess單步跟到內核裏面就清清楚楚了.最好不要猜想參數是什麽,在能調試的情況下.要單步分析
补充的:
楼下的说对了.我也只说对了一半..加上去就是了-0 0
有可能还要EDX和新的ECX传值..(是我错..没看清楚上面的代码.) 下次还是不评论C的代码调用了.因为那东西是在太麻烦.汇编多美...
能力值:
( LV12,RANK:420 )
14 楼
人家搞的好好的定义被楼上破坏的。。。你到底懂不懂,PUSH ECX一开始是为了保存寄存器~
后面给ECX复制后,PsOpenProcess直接使用的ECX和EDX,当然,这个不是标准的fastcall,定义成fastcall是不对的。
能力值:
( LV2,RANK:10 )
15 楼
对于不使用标准的fastcall,比如只用ecx传第一个参数,剩下的全部压栈,该如何定义?
能力值:
( LV2,RANK:10 )
16 楼
啊?保存寄存器??这个不清楚.可能是用来申请个参数堆的.呵呵..(如果内函数退出时使用ECX还原的话这个我不敢保证.因为我没调试它)
我也只是看這些代码说的.还是那句.具体要单步跟进去才知道.请勿猜疑压进代码的正确性.
能力值:
( LV2,RANK:10 )
17 楼
看语言吧.如果汇编形式的话就简单点.
如果C的话,我想应该内含汇编指令直接把数据写到ECX???因为比较少用结构,也基本不用C.所以不清楚是不是有些比较好用的...
最理想的方式就是写汇编来调用.呵呵..
能力值:
( LV2,RANK:10 )
18 楼
STATUS
PsOpenProcess(
ULONG PID,
PHANDLE ProcessHandle
) {
STATUS status;
PPROCESS pprocess;
pprocess = ObGetFirstObjectOfType(processType);
while (pprocess) {
if (pprocess->PID == PID) {
status = ObOpenObjectByPointer(pprocess, 0, processType, ProcessHandle);
return status;
}
pprocess = ObGetNextObjectOfType(pprocess);
}
return STATUS_NO_SUCH_PROCESS;
}
能力值:
( LV2,RANK:10 )
19 楼
BOOL SearchPsOpenProcessAddress(void)
{
char *pfn;
int temlen;
unsigned char *nextOp;
for ( pfn = (char*)NtOpenProcess; pfn < (char *) NtOpenProcess + 0x1000; pfn += temlen )
{
temlen = SizeOfCode(pfn, &nextOp);
if ( !temlen )
break;
if ( *(BYTE*)nextOp == 0xE8 )
{
PsOpenProcessAdd = *(DWORD *)(nextOp + 1) + (DWORD)pfn + 5; //这里是PsOpenProcess的地址
return TRUE;
}
}
return FALSE;
}
能力值:
( LV2,RANK:10 )
20 楼
谢谢LS的代码...终于不用硬编码了(只在自己的机上使用)....呵...