2016-03-25 28 views
0

Son birkaç gün boyunca bir DLL enjektörü oluşturmak için çalışıyorum.
Ben DLL enjeksiyon için bulunan basit yöntem CreateRemoteThreadBaşka bir işlem için dll nasıl enjekte edilir?

Bu defa, bu kod çalışmaz yazdım ve nedenini bulamıyorum neyi olduğunu kullanıyor.

Sorunumun WinAPI işlevlerini çağırmak için kullanıyorum değişkenler türlerinde olduğunu gayet eminim ama nerede bulamıyorum.

bool Injector::Inject(HANDLE hProcess) 
{ 
    //hProcess is a process with writing and reading access 
    HANDLE hThread; 
    void* pLibRemote = 0; 
    string dllPath = "Some dll path"; 
    HMODULE hKernel32 = GetModuleHandle(__TEXT("Kernel32")); 


    pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE); 

    WriteProcessMemory(hProcess, pLibRemote, dllPath.c_str(), sizeof(dllPath.c_str()), NULL); 

    hThread = CreateRemoteThread(hProcess, NULL, 0,  
        (LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,"LoadLibraryA"), 
        pLibRemote, 0, NULL); 


    . 
    . 
    . 

    CloseHandle(hThread); 

    } 
. 
. 
. 

cevap

2

en az 2 sorunlar:

pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE); 

1) sizeof(dllPath.c_str()): Eğer dolayısıyla muhtemelen sonuç olarak 4 veya 8 alırsınız, bir işaretçi (c_str() returns a pointer) üzerine sizeof yapıyoruz. dllPath.size() + sizeof(char)'u (std::wstring kullanılıyorsa char yerine wchar_t kullanın) kullanın.

2) yerine MEM_COMMIT ait MEM_RESERVE | MEM_COMMIT kullanın: ve aynı anda ayrılmış bellek işlemek ayırmak istiyorum. Ayrıca, her iki programın da aynı ISA'yı (x86/x86; x64/x64, ancak eşleşmeyen bir ISA değil) kullandığından emin olun.

+0

Bu işe yaradı! çok teşekkür ederim! "dllPath.size()' yerine "dllPath.size()' yerine niçin 'dllPath.size() + sizeof (char) 'kullandığını bana açıklayabilir misiniz? – HackinGuy

+0

@HackinGuy Tam olarak, [string: : size()] (http://en.cppreference.com/w/cpp/string/basic_string/size) sonlanan NULL hariç karakter sayısını döndürür. Bunu düşünürsek, dize boyutu ** bayt cinsinden ** şu şekilde hesaplanmalıdır: (string.size() * sizeof (TCHAR)) + sizeof (TCHAR) ', bu yüzden std :: wchar_t ve _UNICODE ile wd ve char ile std :: wstring tanımlanır. – Neitsa

+0

@Neitsa, 'std :: basic_string ' seçeneğini kullanmanız gerekmedikçe 'sizeof (TCHAR)' özelliğini kullanamazsınız. std :: string '' char', 'std :: wstring'' wchar_t' kullanır. Uygun Ansi/Unicode API'lerini buna göre kullanın ('LoadLibraryA' /' LoadLibraryW'). Bu durumda, 'std :: string' kullanılıyor, bu yüzden' string.size() + 1) * sizeof (char) 'kullanın. –

İlgili konular