首页
社区
课程
招聘
[求助]PsOpenProcess函数在哪定义的..
发表于: 2009-11-3 11:03 10026

[求助]PsOpenProcess函数在哪定义的..

2009-11-3 11:03
10026
Vista下NtOpenProcess是通过调用PsOpenProcess来实现功能的,但不知道这个函数是在哪定义的,google,baidu都找不到有用的信息...谢谢各位大侠先..

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
晕..刚才忘了给分了..不知道能不能加分的..
2009-11-3 11:07
0
雪    币: 4560
活跃值: (1012)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
PsOpenProcess是内核函数,必须在R0调用,貌似现在微软未公开这个函数必须自己生命
2009-11-3 11:13
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
先谢了..但我在WDK的MSDN和网上都找不到它的原型,不知道怎么声明...
2009-11-3 11:18
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
PsOpenProcess????
没好说的..
直接跟进内核花几分钟时间就知道啦...未公开的函数一般都要自己跟进去调试逆向..的..
2009-11-3 13:12
0
雪    币: 243
活跃值: (10)
能力值: ( 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

2009-11-3 14:03
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
上面的代码主要是这两句不知道是什么作用的..

82011b1f 64a124010000    mov     eax,dword ptr fs:[00000124h]
82011b25 8a80e7000000    mov     al,byte ptr [eax+0E7h]
2009-11-3 14:05
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
eax,dword ptr fs:[00000124h]=ETHREAD
下面的你查看下ETHREAD的结构体..
2009-11-3 14:22
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
在windbg里看到了这个结构,但不知道这个属性是什么用的...

+0x0e7 PreviousMode     : Char
2009-11-3 14:28
0
雪    币: 290
活跃值: (20)
能力值: ( 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
    );
2009-11-3 15:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2009-11-3 15:50
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢LS(S)的两位先..再研究一下不行换其它方法了..呵..
2009-11-3 18:06
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
應該不對吧?
那兩次PUSH ECX...改掉.估计是保留堆栈参数?
上面兩次壓進ebp-4
PreviousMode

PsOpenProcess(
    忘記了.呵呵.你對應下NT!OpenProcess外面的調用.我懶搞,
    這個也是外面傳進來的參數,
    PreviousMode,
    PreviousMode
    );
PS:直接寫個OpenProcess單步跟到內核裏面就清清楚楚了.最好不要猜想參數是什麽,在能調試的情況下.要單步分析

补充的:
楼下的说对了.我也只说对了一半..加上去就是了-0 0
有可能还要EDX和新的ECX传值..(是我错..没看清楚上面的代码.)     下次还是不评论C的代码调用了.因为那东西是在太麻烦.汇编多美...
2009-11-4 01:10
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
14
人家搞的好好的定义被楼上破坏的。。。你到底懂不懂,PUSH ECX一开始是为了保存寄存器~

后面给ECX复制后,PsOpenProcess直接使用的ECX和EDX,当然,这个不是标准的fastcall,定义成fastcall是不对的。
2009-11-4 01:29
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
对于不使用标准的fastcall,比如只用ecx传第一个参数,剩下的全部压栈,该如何定义?
2009-11-4 11:11
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
啊?保存寄存器??这个不清楚.可能是用来申请个参数堆的.呵呵..(如果内函数退出时使用ECX还原的话这个我不敢保证.因为我没调试它)
我也只是看這些代码说的.还是那句.具体要单步跟进去才知道.请勿猜疑压进代码的正确性.
2009-11-4 15:17
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
看语言吧.如果汇编形式的话就简单点.
如果C的话,我想应该内含汇编指令直接把数据写到ECX???因为比较少用结构,也基本不用C.所以不清楚是不是有些比较好用的...
最理想的方式就是写汇编来调用.呵呵..
2009-11-4 15:21
0
雪    币: 1709
活跃值: (1675)
能力值: ( 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;
}
2009-11-4 16:19
0
雪    币: 1709
活跃值: (1675)
能力值: ( 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;
}
2009-11-4 16:43
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢LS的代码...终于不用硬编码了(只在自己的机上使用)....呵...
2009-11-4 20:01
0
游客
登录 | 注册 方可回帖
返回
//