0

私はまだ同じプロジェクトに取り組んでいます (なぜ私がそんなに多くの質問をするのか不思議に思っているかもしれません)。

プロジェクトはエラーなしで正常にコンパイルされますが、インジェクターはエラーなどを発生させることなく機能しません。ソースは次のとおりです。

int Inject(DWORD pID) 
{ 
    HANDLE hProcess;
    if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID)))
        return 0;

    char* szDllName = "subclass64.dll";

    LPVOID LoadLibraryAddress;
    if ((LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA")) == NULL)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    LPVOID lpStringAddress;
    if ((lpStringAddress = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(szDllName), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    if (WriteProcessMemory(hProcess, lpStringAddress, szDllName, strlen(szDllName), NULL) == 0)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    HANDLE hThread;
    if ((hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, lpStringAddress, 0, NULL)) == NULL)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    CloseHandle(hProcess); 
    return 1; 
}

私もデバッグしましたが、奇妙な値は得られませんでした:

(gdb) p hProcess
$1 = (HANDLE) 0xec
(gdb) p LoadLibraryAddress
$2 = (LPVOID) 0x7f9de0528ac <LoadLibraryA>
(gdb) p lpStringAddress
$3 = (LPVOID) 0x8a4d10000
(gdb) p hThread
$4 = (HANDLE) 0xf0
(gdb) p GetLastError()
$5 = 0

別の DLL インジェクター (インターネットから) で正常に動作するため、DLL に問題はありません。

編集:ダミー/テストアプリケーションでは正常に機能しますが、たとえばメモ帳では機能しません(サードパーティのインジェクターを使用すると機能します)。

うまくいけば、誰かが私を助けてくれます、よろしく

4

2 に答える 2

2

strlen(szDllName)1 つの問題は、バイトのみが割り当てられて書き込まれるため、ターゲット プロセス内の DLL の名前が null で終了しないことです。文字列処理ロジックを割り当てて書き込むように変更し、文字strlen(szDllName) + 1列が null で終了するようにします。

挿入される DLL はsubclass64.dll、ターゲット プロセスと同じディレクトリにある必要があることに注意してください。または、そのPATH環境変数に、DLL が存在するディレクトリが含まれている必要があります。

于 2013-01-07T16:41:46.620 に答える
0

コンパイラから Visual Studio に切り替えましたが、最初は機能しませんでしたが、その後機能しました。これに対する答えは、デバッグしないことです。したがって、アプリケーションのパスに移動してから、プログラムを手動で開始します。

于 2013-01-14T13:23:30.553 に答える