Son birkaç gün boyunca bir DLL enjektörü oluşturmak için çalışıyorum.
Ben DLL enjeksiyon için bulunan basit yöntem CreateRemoteThread
Baş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);
}
.
.
.
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
@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
@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. –