首页
社区
课程
招聘
[求助] ZwQuerySystemInformation,大家帮噢看看是哪里错了?
发表于: 2008-12-20 21:44 4327

[求助] ZwQuerySystemInformation,大家帮噢看看是哪里错了?

2008-12-20 21:44
4327
#include <windows.h>
#include <tchar.h>

typedef DWORD (WINAPI *ZWQUERYSYSTEMINFORMATION)(DWORD, PVOID, DWORD, PDWORD);

typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    BYTE Reserved1[48];
    PVOID Reserved2[3];
    HANDLE UniqueProcessId;
    PVOID Reserved3;
    ULONG HandleCount;
    BYTE Reserved4[4];
    PVOID Reserved5[11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;

SYSTEM_PROCESS_INFORMATION Sysinfo;

int _tmain()
{
        LPCTSTR lpFileName="ntdll.dll";
        LPCTSTR lpFunctName="ZwQuerySystemInformation";
        char cbbuffer[60000];
        DWORD length=0;
        ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation=NULL;
        HMODULE hLib=LoadLibrary(lpFileName);
        _tprintf(TEXT("Loading ntdll.dll... ..."));
        if(hLib!=NULL)
        {
                _tprintf(TEXT("Success!\nGeting Function Address... ..."));
                ZwQuerySystemInformation=(ZWQUERYSYSTEMINFORMATION)GetProcAddress(hLib,lpFunctName);
            if(ZwQuerySystemInformation!=NULL)
                {
                        _tprintf(TEXT("Success!\nGeting System Infomation... ..."));
                        ZwQuerySystemInformation(5,cbbuffer,60000,&length);
            if(Sysinfo.NextEntryOffset)
                                _tprintf(TEXT("Success!\n"));
                        else
                                //length=GetLastError();
                                _tprintf(TEXT("Failed! 0x%x,  %d,  %d\n"),Sysinfo.NextEntryOffset,length,Sysinfo.NumberOfThreads);

                }
                _tprintf(TEXT("Free ntdll.dll... ..."));
                FreeLibrary(hLib);
                _tprintf(TEXT("Success!"));
        }

        return 0;
}

下面是用汇编写的,大家帮我看看,都不行啊。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\comdlg32.lib

SystemProcessInfo struct
    NextEntryOffset dd ?
    NumberOfThreads dd ?
    Reserved1  db 48 dup(?)
    Reserved2  PVOID 3 dup(?)
    UniqueProcessId HANDLE ?
    Reserved3 PVOID ?
    HandleCount dd ?
    Reserved4 db 4 dup(?)
    Reserved5 PVOID 11 dup(?)
    PeakPagefileUsage dd ?
    PrivatePageCount dd ?
    Reserved6 LARGE_INTEGER 6 dup(<>)
SystemProcessInfo ends

.data
LibName db "ntdll.dll",0
FunctionName db "ZwQuerySystemInformation",0
AppName db "Status",0
ErrorOfNoDll db "Load ntdll.dll faile...",0
ErrorOfNoFunction db "Load Function Fail...",0
SuccessLoadDll db "Success Load Dll",0
SuccessLoadFunction db "Success Load Function",0
formatstring db "%d",0

.data?
hLib dd ?
FunctionAddr dd ?
ErrorCode dd ?
cbbuffer db 50000 dup(?)

.code
    start:
         invoke LoadLibrary,addr LibName
         .if eax!=NULL
                   mov hLib,eax
                   invoke MessageBox,NULL,addr SuccessLoadDll,addr AppName,MB_OK
                   invoke GetProcAddress,hLib,addr FunctionName
                   .if eax!=NULL
                             mov FunctionAddr,eax
                             invoke MessageBox,NULL,addr SuccessLoadFunction,addr AppName,MB_OK
                             call [FunctionAddr],SYSTEM_PROCESS_INFORMATION,\
                                                 addr cbbuffer,\
                                                 50000,\
                                                 sizeof SystemProcessInfo
                   .else
                             invoke MessageBox,NULL,addr ErrorOfNoFunction,NULL,MB_OK
                   .endif
                   invoke FreeLibrary,hLib
        .else
                   invoke MessageBox,NULL,addr ErrorOfNoDll,NULL,MB_OK
        .endif
        invoke ExitProcess,NULL
    end start

两个都是在调用函数是出错的,汇编编译都同步过去, c可以编译过去,但不能正常调用;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
  // 第一次调用ZwQuerySystemInformation,
  // dwLen得到所需长度
  ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
                           NULL, 0, &dwLen);
  pSysInfoBuf = new char[dwLen];
  if (!pSysInfoBuf)
  {
    ErrorExit(_T("pSysInfoBuf"));
  }

  // 准备好所需的缓存以后,第二次调用ZwQuerySystemInformation,
  // 这次才是真正干活
  if(ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, 
                              pSysInfoBuf, dwLen, &dwLen))
  {
    ErrorExit(_T("ZwQuerySystemInformation"));
  }
  else 
  {
      pSysinfo = (SYSTEM_PROCESS_INFORMATION *)pSysInfoBuf;
      _tprintf(TEXT("0x%x,  %d,  %d\n"),
               pSysinfo->NextEntryOffset,
               dwLen, pSysinfo->NumberOfThreads);
  }
2008-12-21 01:18
0
游客
登录 | 注册 方可回帖
返回
//