2016-10-23 29 views
-2

私は現在、さまざまなexploit-dbファイルからntdll関数のいくつかの宣言を組み合わせて、キーロガーを作成しています(教育的に)。 ここでは一般的なウェブを検索してみました。私は問題を解決するためにそれを使用する方法を理解できるところに似た何かを見つけることができませんでした。私は重複がある場合は謝罪する、私は何か関連するものを見つけることができませんでした。typedefのコンパイラエラー

これらをヘッダファイルに入れてコンパイルしようとすると、ヘッダ内のtypedefに関連したエラーが発生し、decltypeに言及するエラーメッセージが表示されます。全くそれを理解する。私は実際にヘッダーやdecltypeを混乱させることはありませんでしたが、私は検索しましたが、まだそれを本当に理解することはできません。エラーがこれで発生します。

typedef (NTSTATUS) (WINAPI *LPFUN_NtCreateThreadEx) 
(
    OUT PHANDLE hThread, 
    IN ACCESS_MASK DesiredAccess, 
    IN LPVOID ObjectAttributes, 
    IN HANDLE ProcessHandle, 
    IN LPTHREAD_START_ROUTINE lpStartAddress, 
    IN LPVOID lpParameter, 
    IN BOOL CreateSuspended, 
    IN DWORD StackZeroBits, 
    IN DWORD SizeOfStackCommit, 
    IN DWORD SizeOfStackReserve, 
    OUT LPVOID lpBytesBuffer 
); 

typedef NTSTATUS(NTAPI *lNtAllocVirtMem)(
    IN HANDLE ProcessHandle, 
    IN PVOID *BaseAddress, 
    IN PULONG ZeroBits, 
    IN PSIZE_T RegionSize, 
    IN ULONG AllocationType, 
    IN ULONG Protect 
); 

main.cppに内の他のエラーは次のとおりです。(長い行について申し訳ありません)

lNtAllocVirtMem pNtAllocateVirtualMemory=(lNtAllocVirtMem)GetProcAddress(LoadLibaryA("ntdll.dll"),"NtAllocateVirtualMemory"); 

私のエラーが(私は両方のダブルを取得)です。

error: expected primary-expression before '__attribute__' 
error: typedef 'NTSTATUS' is initialized (use decltype instead) 

私はこれらの問題を解決する方法を知りたいと思っています(さらに追加する予定です)。もっと重要なことは、どうすればこれらの問題を解決することができますか?

+1

あなたはgccでコンパイルしていますか?これはコンパイラ固有のコードなので、適切な使い方でコンパイラの仕様を調べなければならないでしょう。 – Nonanon

+0

Googleの検索によると、基本的にNTSTATUSは[long longのためのマイクロソフト](https://msdn.microsoft.com/en-us/library/cc230357.aspx)です。したがってtypedefは意味をなさない。 typedefを使用して、エイリアスするものが何であるかははっきりしません。 'NTSTATUS'が関数からの戻り値であれば、それは括弧で囲まれてはいけません。より多くのグーグルが「WINAPI」は「__stdcall」のためのマイクロソフトであることを明らかにしている(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v = vs.85).aspx) - コンパイラ特定のキーワード。 '*'の前後にする必要があるかどうかは不明です。 –

+0

@ノナノン私はgccバージョン4.9でMingwを使用しています – Semaphore

答えて

0

タイプNTSTATUSは winternl.hのWindows SDKヘッダーファイルに定義されています。

typedef _Return_type_success_(return >= 0) LONG NTSTATUS; 

あなたが代わりにNTSTATUSを自分で定義しようとしているのヘッダファイルをインクルードする必要があります。 SDK提供の定義は、2つの点で異なります。1静的コード分析を実行できるSALアノテーションが含まれています。 2プラットフォームに関係なく、正しいエイリアスを提供します。 x86プラットフォームとx64プラットフォームの両方で32ビットの整数値にする必要があります。 longはこれより長くなることがあります。

+0

ありがとうございました、私はその定義を追加した後にプログラムが動作していたので、何も追加する必要がないと思ったので、すぐに変更します。 – Semaphore

+0

申し訳ありませんが、私はMingwでNetbeansを使用していますが、winternl.hはインポートできませんでした。 – Semaphore

+0

@JayM:わかりません、 "winternl.hはインポートできませんでした" *は意味するはずです。ヘッダーファイルが含まれています。より良い問題文がなければ、持っていることはほとんどありません。 – IInspectable