2016-10-26 4 views
-1

マイOSはWindows 8.1 64ビットです。私のプログラムは、ターゲットプロセスにDLLファイルを注入することです。このDLLファイルがプロセスにアタッチされると、D:.txtファイルが作成され、そこにいくつかの単語が書き込まれて保存されます。これは単なるテストです。しかし、私のプログラムは32ビットプログラムとして、私のDLLコードは32ビットとしてコンパイルされ、成功するとファイルを作成して内容を保存することができます。しかし、私が64ビットのDLLと私のプログラムのコードをコンパイルするとき、それはすべての例外をスローすることはありません、すべて成功しているようです。しかし、あなたが作成する.txtファイルを見つけることができません。だから、それは失敗し、あなたがしたいことを実行していません。私のdll注入。 32ビットとしてコンパイルすると成功しますが、64ビットとしてコンパイルすると失敗します。

追跡は、32ビットのように(私のプログラムと私のDLLの両方)

#include "stdafx.h" 
#include<Windows.h> 
#include<stdio.h> 
#include<stdlib.h> 

BOOL create(); 

BOOL APIENTRY DllMain(HMODULE hModule, 
        DWORD ul_reason_for_call, 
        LPVOID lpReserved 
       ) 
{ 
switch (ul_reason_for_call) 
{ 
case DLL_PROCESS_ATTACH: 
    create(); 
    break; 
case DLL_PROCESS_DETACH: 
    break; 
} 
return TRUE; 
} 


BOOL create() 
{ 
wchar_t FileName[] = L"D:\\x64injecttest.txt"; 
HANDLE hFile = ::CreateFile(FileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, NULL, NULL); 
if (hFile == INVALID_HANDLE_VALUE) 
{ 
    printf("createfile fails,the error code is:%u\n", GetLastError()); 
    system("PAUSE"); 
    return 0; 
} 

char str[] = "if you see this file,then you have success\n"; 
WriteFile(hFile, str, strlen(str) + 1, NULL, NULL); 

CloseHandle(hFile); 
return TRUE; 
} 

フォローは私のプログラム私は私のコードをコンパイル

#include<stdio.h> 
#include<stdlib.h> 
#include<Windows.h> 
#include<TlHelp32.h> 


LPTHREAD_START_ROUTINE lpThreadProc; //pointes to the address of LoadLibraryW API 
typedef DWORD(WINAPI *pFunction)(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, LPVOID ObjectAttributes, HANDLE ProcessHandle, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, BOOL CreateSuspended, DWORD dwStackSize, DWORD dw1, DWORD dw2, LPVOID pUnknown); //I inject DLL to other process with the NtCreateThreadEx API , and this function pointer would point to the address of this API 


DWORD SearchForTarget(wchar_t target[]) 
{ 
PROCESSENTRY32 pe32; 
pe32.dwSize = sizeof(pe32); 

HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
if (hSnap == INVALID_HANDLE_VALUE) 
{ 
    printf("fails when createtoolhelp32snapshot,the error code is:%u\n", GetLastError()); 
    system("PAUSE"); 
    exit(-1); 
} 

BOOL b = ::Process32First(hSnap, &pe32); 
while (b) 
{ 
    printf("the process name is:%ws\n", pe32.szExeFile); 
    printf("the process id is:%u\n", pe32.th32ProcessID); 

    if (wcscmp(pe32.szExeFile, target) == 0) 
     return pe32.th32ProcessID; 

    b = Process32Next(hSnap, &pe32); 
} 

return -1; 

} 

BOOL InjectDLL(DWORD pid) 
{ 

wchar_t DLLPath[] = L"C:\\Users\\Dell-pc\\Desktop\\x64InjectTest\\Debug\\DLL.dll"; 

DWORD length = wcslen(DLLPath); 
DWORD trueLength = length * 2 + 2; 

HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 
if (hProcess == INVALID_HANDLE_VALUE) 
{ 
    printf("openprocess fails,the error code is:%u\n", GetLastError()); 
    system("PAUSE"); 
    exit(-1); 
} 

LPVOID pBaseAddress = ::VirtualAllocEx(hProcess, NULL, trueLength, MEM_COMMIT, PAGE_READWRITE); 
if (pBaseAddress == NULL) 
{ 
    printf("virtualallocex fails,the error code is:%u\n", GetLastError()); 
    system("PAUSE"); 
    exit(-1); 
} 

BOOL b = WriteProcessMemory(hProcess, pBaseAddress, DLLPath, trueLength, NULL); 
if (b == 0) 
{ 
    printf("writeprocessmemory fail,the error code is:%u\n", GetLastError()); 
    system("PAUSE"); 
    exit(-1); 
} 

HMODULE hModule = ::LoadLibrary(L"kernel32.dll"); 
lpThreadProc = (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, "LoadLibraryW"); 

HMODULE hNtdll = ::LoadLibrary(L"ntdll.dll"); 
pFunction pFunc = (pFunction)GetProcAddress(hNtdll, "NtCreateThreadEx"); 

printf("it is ready to create thread\n"); 

HANDLE hRemoteThread; 
pFunc(&hRemoteThread, 0x1FFFFF, NULL, hProcess, lpThreadProc, pBaseAddress, FALSE, NULL, NULL, NULL, NULL); 

if (hRemoteThread == NULL) 
{ 
    printf("nrcreateprocessex fails,the error code is:%u\n", GetLastError()); 
    system("PAUSE"); 
    exit(-1); 
} 

WaitForSingleObject(hRemoteThread, INFINITE); 

return TRUE; 
} 

int main() 
{ 
wchar_t target[] = L"notepad.exe"; //inject my DLL to notepad.exe 
DWORD pid = SearchForTarget(target); 
if (pid == -1) 
{ 
    printf("not find the target \n"); 
    system("PAUSE"); 
    return -1; 
} 
InjectDLL(pid); 

system("PAUSE"); 

return 0; 
} 

のコードである私のDLLの私のコードであります私のWindows 8.1の64ビットOSで動かすと、成功します。しかし、私はそれを(私のプログラムと私のDLLの両方)64ビットとしてコンパイルすると、例外がスローされず、ファイルを作成せずにいくつかの単語を書くことを除いては成功するように見えます。 DLLがプロセスに接続されたとき)。だから誰も問題がどこにあるか知っている?もう1つは、私はVisual Studio 2013を使用しています。

+1

ターゲットは64ビットプロセスですか? NtCreateThreadExの戻り値も無視します。しないでください。その価値は何ですか? –

+0

FWIWあなたのコードリークは狂ったように扱われますが、おそらくあなたは知っていて気にしません。 –

+0

@DavidHeffernan 64ビットのnotepad.exeですが、64ビットのInternet Explore.exeにも注入しようとしています – freedom3

答えて

0

ありがとうございます。私は問題を解決しました。 NtCreateThreadExファンクションについては、8番目、9番目、10番目のパラメータ(パラメータ、dw1パラメータ、dw2パラメータ)のタイプは、ではなく、SIZE_Tである必要があります。 DWORDの場合は、コードを32ビットとしてコンパイルしても問題ありませんが、64ビットとしてコンパイルすると問題はありません。 このコード行は、次のように書かれています。

typedef NTSTATUS (WINAPI *pFunction)(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, LPVOID ObjectAttributes, HANDLE ProcessHandle, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, BOOL CreateSuspended, SIZE_T dwStackSize, SIZE_T dw1, DWORD SIZE_T, LPVOID pUnknown); 
0

あなたの例で32/64-bit問題を引き起こす行は次のようになります。

lpThreadProc = (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, 
"LoadLibraryW"); 

これにより、現在のプロセスではそのターゲットプロセスではなく、LoadLibraryWのアドレスが取得されます。ターゲットプロセスが64ビットの場合、アドレスは99.99999%異なります。

32ビットプロセスであっても、DLLが常に同じアドレスフットプリントに読み込まれるとは通常想定しないでください。

問題を回避するには、ターゲットプロセス内でモジュールを列挙し、そこからエントリポイントを見つける必要があります。これに役立つAPIがあります。 GetRemoteProcAddressのgoogleも正しい方向に向けるでしょう。

それ以外にも、ローダーには他にも多くの問題があります。個人的には、他の誰かがすでに書いたものを使うことをお勧めします。かつては多くの良いローダーがあり、その多くは注意書きの多くをカバーしていて、複数の注入機構も備えていました。

関連する問題