0

kernel32 関数の 1 つをフックするときにプログラムを実行できない理由を知っていますか? 私はアンチチートを書いていて、現在スレッドにあるのでもっと最適化したいのですが、何かがおかしいです...

以前にフックしようとしたことと同じ問題があるため、 OpenProcess が書かれています。

typedef HANDLE ( WINAPI * pOpenProcess )(   _In_   HANDLE hProcess,
                                         _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                         _In_   SIZE_T dwStackSize,
                                         _In_   LPTHREAD_START_ROUTINE lpStartAddress,
                                         _In_   LPVOID lpParameter,
                                         _In_   DWORD dwCreationFlags,
                                         _Out_  LPDWORD lpThreadId );

pOpenProcess original;

__declspec(naked) void hOpenProcess()
{
    __asm PUSHAD
    __asm PUSHFD
        //my actions here
    __asm POPFD
    __asm POPAD
    __asm JMP[original]
};

void ZPerformHook()
{
    DWORD Address = ( DWORD )GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll" ) ), "CreateRemoteThread" );
    original = ( pOpenProcess )DetourFunction( (PBYTE)Address,  (PBYTE)hOpenProcess );
}
4

1 に答える 1

1

「//ここでの私のアクション」は興味深いでしょう。スタックを破損している可能性があります。または、DetourFunction にエラーがある可能性があります。あなたのプログラムはどのように失敗しますか? たぶんアクセス違反?

また、ネイキッド機能を使用する必要はありません。ターゲットとまったく同じシグネチャを持つ関数にフックするだけです。asmは必要ありません。

HANDLE __stdcall hOpenProcess(  HANDLE hProcess,
                                LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                SIZE_T dwStackSize,
                                LPTHREAD_START_ROUTINE lpStartAddress,
                                LPVOID lpParameter,
                                DWORD dwCreationFlags,
                                LPDWORD lpThreadId )
{
    // do your stuff here
    std::cout << "From hook" << std::endl;

    return original( hProcess, lpThreadAttributes, dwStackSize,  lpStartAddress, lpParameter,  dwCreationFlags,  lpThreadId);
}

それが機能しない場合は、GetProcAddress の戻り値を確認してください。それが正しい場合は、DetourFunction で何か問題が発生している可能性があります。

beaengine のような逆アセンブラを使用して、迂回後にターゲット関数をダンプして、フックが正しく適用されたかどうかを確認することもできます。

于 2013-08-03T14:09:22.037 に答える