_==wolf==_
28.03.2010, 19:30
Думали он здесь? Ан нет. Сам бъюсь весь день. Никак не могу нормально заинжектить... Все вылетает *ехе* с пометкой *dll*.dll_unloaded.
Имеются: *exe*, *dll*, *injector_exe*.
Необходимо с помощью *injector_exe* запустить с параметрами командной строки процесс *exe*, и проинжектить в него *dll*. Исходник этого дела и нужен)
Заранее спасибо.
_==wolf==_
28.03.2010, 19:52
попробовал решить проблему на шарпе, он как-то ближе мне:
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: gta_sa.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 4270f18a
Имя модуля с ошибкой: samp.dll_unloaded
то же самое((
BastardFromHell
28.03.2010, 20:00
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#define LOGFILE "C:\\injection.log"
#define PROCESSNAME L"explorer.exe"
DWORD getProcessID();
int addLogMessage(char* str, int code);
BOOL setPrivilege(HANDLE hToken, LPCTSTR szPrivName, BOOL fEnable);
typedef FARPROC (WINAPI *LPMessageBox)(HWND, LPCWSTR, LPCWSTR, UINT);
typedef struct _InjectData {
char title[50];
char msg[50];
LPMessageBox MessageB;
} InjectData, *PInjectData;
InjectData injectData = {
"Test",
"Привет",
NULL
};
static DWORD WINAPI InjectionMain(LPVOID lpParams) {
PInjectData info = (PInjectData)lpParams;
info->MessageB(NULL, (LPCWSTR)info->msg, (LPCWSTR)info->title, MB_OK);
return 0;
}
static void __declspec( naked ) end_proc() {
}
int _tmain(int argc, _TCHAR* argv[]) {
char buffer [50];
HANDLE hToken;
HANDLE processHandel;
HINSTANCE userHinstance;
DWORD processID = getProcessID();
HANDLE hCurrentProc = GetCurrentProcess();
if(!OpenProcessToken(hCurrentProc, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) {
addLogMessage("OpenProcessToken Error", GetLastError());
return 0;
} else {
if (!setPrivilege(hToken, SE_DEBUG_NAME, TRUE)) {
addLogMessage("SetPrivlegesSE_DEBUG_NAME Error", GetLastError());
return 0;
}
}
if(processID == 0) {
MessageBox(NULL, _T("Process not found!"), _T("Error"), MB_OK | MB_ICONERROR);
return 0;
}
processHandel = OpenProcess(PROCESS_ALL_ACCESS, false, processID);
if(processHandel == NULL) {
addLogMessage("Open process error", GetLastError());
return 0;
}
userHinstance = LoadLibrary(_T("user32.dll"));
injectData.MessageB = (LPMessageBox) GetProcAddress(userHinstance, "MessageBoxA");
DWORD ProcSize = (DWORD)end_proc - (DWORD)InjectionMain;
sprintf_s(buffer, "Process size: %u", ProcSize);
addLogMessage(buffer, 0);
LPVOID lpProc = VirtualAllocEx(processHandel, NULL, ProcSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
LPVOID lpParams = VirtualAllocEx(processHandel, NULL, 1024, MEM_COMMIT, PAGE_READWRITE );
if (!lpProc || !lpParams) {
addLogMessage("Error allocating memory ", 1000);
return 0;
}
sprintf_s(buffer, "Memory allocated at 0x%X and 0x%X", lpProc, lpParams );
addLogMessage(buffer, 0);
DWORD dwWritten;
if(WriteProcessMemory(processHandel, lpProc, InjectionMain, ProcSize, &dwWritten ) == 0) {
addLogMessage("WriteProcessMemory error", GetLastError());
return 0;
}
if(WriteProcessMemory( processHandel, lpParams, &injectData, sizeof(injectData), &dwWritten ) == 0) {
addLogMessage("WriteProcessMemory error", GetLastError());
return 0;
}
sprintf_s(buffer, "Memory written", lpProc, lpParams );
addLogMessage(buffer, 0);
DWORD ThreadID;
HANDLE hThread = CreateRemoteThread(processHandel, NULL, 0, (LPTHREAD_START_ROUTINE)lpProc, lpParams, 0, &ThreadID);
if (hThread == NULL) {
sprintf_s(buffer, "Error creating thread");
addLogMessage(buffer, GetLastError());
return 0;
} else {
WaitForSingleObject( hThread, INFINITE );
}
FreeLibrary(userHinstance);
VirtualFreeEx(processHandel, lpProc, ProcSize, MEM_DECOMMIT );
VirtualFreeEx(processHandel, lpParams, 1024, MEM_DECOMMIT );
CloseHandle(processHandel);
addLogMessage("Success injecting!", 0);
return 0;
}
DWORD getProcessID() {
DWORD processID = 0;
HANDLE snapHandle;
PROCESSENTRY32 processEntry = {0};
if( (snapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE ) {
return 0;
}
processEntry.dwSize = sizeof(PROCESSENTRY32);
Process32First(snapHandle, &processEntry);
do {
if ( wcscmp(processEntry.szExeFile, PROCESSNAME) == 0 ) {
return processEntry.th32ProcessID;
}
} while (Process32Next(snapHandle,&processEntry));
if ( snapHandle != INVALID_HANDLE_VALUE ) {
CloseHandle(snapHandle);
}
return 0;
}
BOOL setPrivilege(HANDLE hToken, LPCTSTR szPrivName, BOOL fEnable) {
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, szPrivName, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
return((GetLastError() == ERROR_SUCCESS));
}
int addLogMessage(char* str, int code) {
errno_t err;
FILE* log;
if((err = fopen_s(&log, LOGFILE, "a+")) != 0) {
return -1;
}
fprintf(log, "[code: %u] %s\n", code, str);
fclose(log);
return 0;
}
пиу
_==wolf==_
28.03.2010, 20:55
пиу не удался. мне надо длл заинъектит, где там длл? и нужно запустить процесс, а не в уже запущенный
Interceptor
07.04.2010, 16:55
Хм, а что мешает переписать код и запустить процесс самому через CreateProcess(), потом сделать инъекцию, а в коде InjectionMain вместо MessageBox() вызвать LoadLibrary() и подгрузить свою длл?
Можно сделать сразу CreateRemoteThread() с адресом метода LoadLibrary() в целевом процессе.
Можно временно пропатчить IAT целевого процесса с заменой адреса какой-либо часто вызываемой системной функции на входную точку инъецированного кода, а потом пропатчить обратно.
Наиболее простой метод инъекции длл в процессы это использовать SetWindowsHookEx() - http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
noxjoker
07.04.2010, 17:04
На C# есть сорс (только рабочий)?
Interceptor
07.04.2010, 17:47
На C# исходника нет, и не думаю что такое можно реализовать на C# так как все предполагает вызов WinAPI напрямую. Кроме того, в предложенном BastardFromHell коде вычисляется размер реального объектного кода который потом и копируется в память целевого процесса:
DWORD ProcSize = (DWORD)end_proc - (DWORD)InjectionMain;...
Ну и конечно же код метода InjectionMain() должен быть базонезависимым.
Если все это укладывается в концепцию C# то перевести предложенный исходник на C# не составит труда. :)
Interceptor
07.04.2010, 18:31
Вот в той теме инъекцию на С# пишут:
http://forum.antichat.ru/thread190607.html
Там и код есть, может поможет.
noxjoker
07.04.2010, 18:37
Я уже много раз пробовал и тому типу писал он тоже не знает.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot