2

子供が簡単なトリックを使用してソフトウェアをリバースエンジニアリングするのを防ぐために、非常に基本的なデバッガー保護を実装しようとしています。これらの単純な対策は簡単に回避できますが、少なくとも情報がない状態を防ぐことができます。次のコードはオンラインのチュートリアルからのものですが、これが本番コードで安全に使用できるかどうかについて意見を求めたいと思います。この機能はMicrosoftによって文書化されていないため、Windowsのバージョンごとに完全に変更される場合と変更されない場合があるため、私は躊躇しています。最後に必要なのは、関数のシグネチャが間違っているために、Windows 8、9などでアプリケーションがクラッシュし始めることです。

コードは次のとおりです。

// HideThread will attempt to use
// NtSetInformationThread to hide a thread
// from the debugger, Passing NULL for
// hThread will cause the function to hide the thread
// the function is running in. Also, the function returns
// false on failure and true on success
inline bool HideThread(HANDLE hThread)
{
typedef NTSTATUS (NTAPI *pNtSetInformationThread)
            (HANDLE, UINT, PVOID, ULONG);
NTSTATUS Status;

// Get NtSetInformationThread
pNtSetInformationThread NtSIT = (pNtSetInformationThread)
    GetProcAddress(GetModuleHandle( TEXT("ntdll.dll") ),
    "NtSetInformationThread");

// Shouldn't fail
if (NtSIT == NULL)
    return false;

// Set the thread info
if (hThread == NULL)
    Status = NtSIT(GetCurrentThread(),
            0x11, // HideThreadFromDebugger
            0, 0);
else
    Status = NtSIT(hThread, 0x11, 0, 0);

if (Status != 0x00000000)
    return false;
else
    return true;
}

これは安全に使用できますか?

敬具、

フィリップ・ベネフォール

4

3 に答える 3

4

文書化されていない場合は、警告なしにいつでも削除/変更できるため、定義上、使用するのは安全ではありません。

とは言うものの、ほとんどのシステムには文書化されていない機能があり、それらは非常に広く知られ、使用されているため、正しい心の誰もそれをあえて変更することはなく、したがってかなり安全に使用できます。

あなたの特定のケースでは、それをぐるぐる回るだけでここに文書化されています。これは通常のAPIではなく、ドライバーサポートルーチンです。したがって、適度に安定している必要があります。つまり、ドライバーモデルが変更された場合、Windowsの将来のバージョンで表示されなくなる可能性がありますが、存在する限り、現在の状態である可能性があります。

于 2011-11-15T22:31:55.353 に答える
3

NtSetInformationXxxとNtQueryInformationXXXは文書化されていない可能性がありますが、前述のように非常に広く使用されており、それらに依存するコードがたくさんあるため、そのような方法でそれらを壊すような大きな変更が行われる可能性はほとんどありません。それらのドキュメントに関しては、多くの「ドキュメント化されていない」APIをドキュメント化したものがありますさらに、あなたはアンチデバッグ技術をいじくり回しているので、可能なアンチデバッグ技術とハッカーによるそれらの対策の非常に良い概要を提供するこの論文に注意を向けたいと思います。

于 2011-11-15T22:51:42.950 に答える
2

私が見る限り、NtSetInformationThread関数はZwSetInformationThreadを使用しているため、 MSDNに(間接的に)文書化されています。したがって、安全に使用できます。誰かがこれを確認できますか、またはこの関数を「文書化されていない」とタグ付けして使用するのが安全でない他の理由がありますか?

于 2011-11-17T08:40:40.520 に答える