1
  • こんにちは!

1 週間以上かかると思いますが、カーネル オブジェクトのリストを取得する方法の全体像を把握することはできません。私のアルゴリズムは次のとおりです。

  • 1) NTDLL.dll(LoadLibrary)の接続
  • 2) GetProcAddress (variable_Library_name, "NtQueryDirectoryObject") および事前アナウンス構造: _OBJDIR_INFORMATION, _OBJECT_ATTRIBUTES
  • 3) オブジェクトのリストに関数 NtOpenDirectoryObject を適用しようとしています

以下は、関数 NtOpenDirectoryObject の使用を担当するコードの一部です。

 OBJDIR_INFORMATION *ssinfo  =(OBJDIR_INFORMATION* ) HeapAlloc(GetProcessHeap(), 0, 0x800);
           ///////////////////////
                    HANDLE hFile,hThread,hMapFile;
  HMODULE hNtdll ,hKernel;
  DWORD dwThreadId;
  OBJECT_ATTRIBUTES obj;
  WCHAR  * uString=L"\\BaseNamedObjects";
  UNICODE_STRING str;
  DWORD i,a,iStrLen,b=0;
  char sObjName[30],sTmp[50];
  LPVOID lpMapAddress;
  FARPROC pWinExec,pExitThread;
  bool bFound;
  char* sCommand;
            /////////////////////////////////////////////////////////////////
            NtQueryDirectoryObject = (NTQUERYDIRECTORYOBJECT )GetProcAddress(hinstLib,"NtQueryDirectoryObject");
            InitializeObjectAttributes (&obj, &str, 0, 0, 00);
            NtOpenDirectoryObject(&hFile,0x20001,&obj);

完全なコード (構造体の定義を含む) は、http: //pastebin.com/pDNb3GTnにあります。

パラメータ NtOpenDirectoryObject を使用して関数を呼び出すと、例外 c0000005 が発生します。これは、アクセスがブロックされていることを意味します。

教えてください、私は間違ったことをしていますか、そして私の間違いはどこにありますか。ネイティブ API を使用しないことは可能ですか? ご協力ありがとうございました

4

1 に答える 1

2

例外c0000005はアクセス違反です。これは、アクセスがブロックされたことを意味するものではありません。これは、NULL/初期化されていないポインターにアクセスした場合や、データを正しく整列させておらず、割り当てた範囲外の何かにアクセスしている場合など、無効なメモリにアクセスしたことを意味します。

アンドリューが述べたように、あなたはまったく初期化していませんUNICODE_STRING。代わりにこれを試してください:

hNtdll = LoadLibrary("ntdll.dll");
NtOpenDirectoryObject = (NTOPENDIRECTORYOBJECT) GetProcAddress(hNtdll, "NtOpenDirectoryObject");
...
if (NtOpenDirectoryObject)
{ 
    // add these three lines
    str.Length = lstrlenW(uString) * sizeof(WCHAR);  
    str.MaximumLength = str.Length; 
    str.Buffer = uString;

    InitializeObjectAttributes (&obj, &str, 0, NULL, NULL);
    NtOpenDirectoryObject(&hFile, 0x20001, &obj);
}
于 2014-05-21T20:50:41.027 に答える