Dll injector
Could someone take a look at this and point out if there are any errors? I have spent so much time looking for a good example of an injector to study that actually works, I get all of them to compile (have been using both dev-c++ and codeblocks) but they never inject my dll to any process.
Here is my example dll I'm trying to inject (it injects correctly with xsyr1ngex, perx etc).
[CODE]
#include <windows.h>
#include <stdio.h>
DWORD ThreadID;
DWORD WINAPI Action(LPVOID lParam) {
//Do stuff
ExitThread(0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH) {
MessageBox(0, "Dll Injection Successful! ", "Dll calling", MB_ICONEXCLAMATION | MB_OK);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Action, 0, 0, &ThreadID);
}
return 1;
}
Code:
#include <windows.h>
#include <tlhelp32.h>
BOOL EnablePriv(LPCSTR lpszPriv)
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkprivs;
ZeroMemory(&tkprivs, sizeof(tkprivs));
if(!OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), &hToken)) return FALSE;
if(!LookupPrivilegeValue(NULL, lpszPriv, &luid)){ CloseHandle(hToken); return FALSE; }
tkprivs.PrivilegeCount = 1;
tkprivs.Privileges[0].Luid = luid;
tkprivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bRet = AdjustTokenPrivileges(hToken, FALSE, &tkprivs, sizeof(tkprivs), NULL, NULL);
CloseHandle(hToken);
return bRet;
}
DWORD RemoteLoadLibrary(LPSTR lpszProcess, DWORD dwPID, HANDLE hProcess, LPSTR lpszModuleName)
{
DWORD dwModuleBase;
if(lpszProcess != NULL){
HANDLE hProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcesses != NULL){
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
if(Process32First(hProcesses, &pe32)){
do{
if(!strcmp(lpszProcess, pe32.szExeFile)){
dwPID = pe32.th32ProcessID; break;
}
}
while(Process32Next(hProcesses, &pe32));
} CloseHandle(hProcesses);
}
}
if(dwPID != 0) hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
if(hProcess != NULL){
DWORD dwSize = lstrlen(lpszModuleName) + 1;
LPBYTE lpszModuleRemoteName = (LPBYTE)VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if(lpszModuleRemoteName != NULL)
{
WriteProcessMemory(hProcess, lpszModuleRemoteName, lpszModuleName, dwSize, NULL);
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"), lpszModuleRemoteName, 0, NULL);
if(hThread != NULL)
{ WaitForSingleObject(hThread, 10000); // 10 seconds
GetExitCodeThread(hThread, &dwModuleBase);
CloseHandle(hThread);
}
VirtualFreeEx(hProcess, lpszModuleRemoteName, dwSize, MEM_RELEASE);
}
if(dwPID != 0) CloseHandle(hProcess);
}
return dwModuleBase;
}
int main(){
EnablePriv(SE_DEBUG_NAME);
DWORD dwBase = RemoteLoadLibrary("notepad.exe", 0, NULL, "lol.dll");
return 0;
}
[CODE]
#include <windows.h>
#include <stdio.h>
DWORD ThreadID;
DWORD WINAPI Action(LPVOID lParam) {
//Do stuff
ExitThread(0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH) {
MessageBox(0, "Dll Injection Successful! ", "Dll calling", MB_ICONEXCLAMATION | MB_OK);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Action, 0, 0, &ThreadID);
}
return 1;
}

. Now it shouldn't be any problem for me to grab process to inject to with the process snapshot thingie if I want to or add other stuff, I just wanted a working base to look at. Ty again!