2011-06-27 8 views
0

私はc文法LONG(NTAPI名)(type1、type2 ...);

LONG (NTAPI *NtSystemDebugControl)  (int,void*,DWORD,void*,DWORD,DWORD*); 
*(DWORD*) &NtSystemDebugControl =(DWORD)GetProcAddress(LoadLibrary("ntdll"),"NtSystemDebugControl"); 

ある2行

があり、それは私が、このような参照は初めてです、

をそのコードに窓XP

source codeを取得し、リング0特権を読んでいます文法

2行とも何を意味していますか?

答えて

3

最初の行は関数ポインタを作成し、2番目の行は関数ポインタをかなり恐ろしい方法で初期化します(64ビットマシンでは失敗しますが、この場合はおそらく重要ではありません)。

については、MSDNでお読みください。

0

ULONG_PTRここに理由があります。 DWORDがx64とx86と互換性がある場合は、成功のために重要です。それを使用してください:x64の代わりにDWORD64 typecastingです。 GetProcAddressはNtSystemDebugControlのオフセットを返しますntdll

ntdll.dll!NtSystemDebugControlに関連付けられたアドレスは、typedefで定義されている関数ポインタをポイントします。あなたにここから

は、次のようなポインタを開始することができます。基本的にはこれが何をしたか

NtSystemDebugControl My_NtSystemDebugControl; 
if (My_NtSystemDebugControl != NULL) { 
    My_NtSystemDebugControl(...); 
} 

は、コンパイル時にそれをリンクすることなく、実行時にAPIを解決しています。アプリケーションがCFF Explorerで表示されている場合、IAT (Import-Address-Table)にはGetProcAddressLoadLibraryが含まれます。しかし、NtSystemDebugControlは、実行時に解決されるため、存在しません。

多くのアンチウイルスでヒューリスティックな解析が妨げられ、コンパイル時に大量の無駄なライブラリをリンクしていないため、バイナリサイズが小さくなります。ライブラリ全体ではなく、必要な機能だけを定義することで柔軟性を実現しています。

また、あなたはGetModuleHandle("ntdll")を使用しようとすると、それははるかに少ない押し付けがましいだとしてLoadLibrary("ntdll")に入る前に!= NULLに結果を比較する必要があります!

関連する問題