|
очередная неудачная DLL инжекция - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
25.06.2018, 22:52
|
#1
|
|
|
|
Разведчик
|
Регистрация: 06.04.2017
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
очередная неудачная DLL инжекция
Добрый день!
Покопался на форуме, попробовал осуществить инжект, но безуспешно.
Сам инжектор:
Код:
#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <conio.h>
DWORD GetProcessID(char*);
wchar_t *convertCharArrayToLPCWSTR(const char*);
int main()
{
printf("started\n");
char libName[] = "D:\Projects\C++\PW\InjectDLL\Debug\InjectDLL.dll";
int libSize = strlen(libName);
char *name = _strdup("elementclient.exe");
DWORD pID = GetProcessID(name);
printf("pID = %d\n", pID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
if (hProcess == NULL)
{
int err = GetLastError();
printf("Process didn't open by current PID, error: %d\n", err);
_getch();
return 0;
}
printf("Process opened\n");
//PSTR remLibName = (PSTR)VirtualAllocEx(hProcess, 0, libSize, MEM_COMMIT, PAGE_READWRITE);
LPVOID remLibName = VirtualAllocEx(hProcess, 0, libSize, MEM_COMMIT, PAGE_READWRITE);
if (remLibName == NULL)
{
printf("VirtualAlloxEx failed\n");
_getch();
return 0;
}
printf("memory allocated\n");
WriteProcessMemory(hProcess, remLibName, libName, libSize, 0);
printf("memory writed\n");
LPTHREAD_START_ROUTINE lprFunc = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(convertCharArrayToLPCWSTR("kernel32.dll")), "LoadLibraryA");//Получаем адрес процедуры и преобразовываем в тип адреса на функцию.
HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, lprFunc, remLibName, 0, 0);//Создаем наш Тред и благополучно возвращаем 0 - удачное завершение.
if ((hThread == NULL) || hThread == (INVALID_HANDLE_VALUE))
{
printf("error thread\n");
_getch();
}
return 0;
}
//--------------------ПОИСК ИД ПО ИМЕНИ ПРОЦЕССА____--------------------
DWORD GetProcessID(char* lpNameProcess)
{
printf("starting search PID\n");
HANDLE snap;
LPCWSTR nameProc = convertCharArrayToLPCWSTR(lpNameProcess);
PROCESSENTRY32 pentry32;
snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snap == INVALID_HANDLE_VALUE) return 0;
pentry32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(snap, &pentry32)) { CloseHandle(snap); return 0; }
do
{
if (!lstrcmpi(nameProc, &pentry32.szExeFile[0]))
{
CloseHandle(snap);
return pentry32.th32ProcessID;
}
} while (Process32Next(snap, &pentry32));
CloseHandle(snap);
return 0;
}
//--------------------ПРЕОБРАЗОВАНИЕ СИМВОЛОВ---------------------------
wchar_t *convertCharArrayToLPCWSTR(const char* charArray)
{
wchar_t* wString = new wchar_t[4096];
MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
return wString;
}
Код DLL
Код:
#include "stdafx.h"
#include <stdio.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
DWORD mobWID = 0x8010184A;
DWORD Param1 = 0x9B3EEC;
DWORD PtrFuncTarget = 0x005CC0C0;
DWORD Param2 = 0x0EC;
_asm
{
MOV EDI, mobWID // Вносим WID моба в регистр EDI
MOV EBX, PtrFuncTarget // Вносим в свободный регистр адрес функции
MOV EAX, DWORD PTR DS : [Param1] //
PUSH EDI // ; /Arg1
MOV ECX, DWORD PTR DS : [EAX + 20] // ; |
ADD ECX, Param2 // ; |
CALL EBX // ; \elementc.00606A70
};
return true;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Инжектор отрабатывает, но желаемых действий не наблюдается, наверняка допустил глупые ошибки, вот только найти их не могу :С, просьба ткнуть носом ну или указать куда рыть.
|
|
|
27.06.2018, 11:47
|
#2
|
|
|
|
Рыцарь-лейтенант
|
Регистрация: 31.01.2011
Сообщений: 413
Популярность: 14489
Золото Zhyk.Ru: 300
Сказал(а) спасибо: 77
Поблагодарили 361 раз(а) в 145 сообщениях
|
Re: очередная неудачная DLL инжекция
|
Цитата: |
|
|
|
|
|
|
|
|
char libName[] = "D:\Projects\C++\PW\InjectDLL\Debug\InjectDLL.dll" ; |
|
|
|
|
|
Бросилось в глаза, остальное не смотрел. Удвой '\':
Код:
char libName[] = "D:\\Projects\\C++\\PW\\InjectDLL\\Debug\\InjectDLL.dll";
Чтобы подобных ошибок не возникало, советую проверять различные коды ошибок и прочее.
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
|
|
|
Пользователь сказал cпасибо:
|
|
27.06.2018, 12:57
|
#3
|
|
|
|
Разведчик
|
Регистрация: 06.04.2017
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: очередная неудачная DLL инжекция
Спасибо, как домой приду - попробую.
Коды ошибок ловить используя GetLastError() ?
Я в основном через брейкпоинты отслеживаю, но на libName забыл посмотреть)
|
|
|
27.06.2018, 13:50
|
#4
|
|
|
|
Разведчик
|
Регистрация: 06.02.2013
Сообщений: 24
Популярность: 10
Сказал(а) спасибо: 8
Поблагодарили 3 раз(а) в 2 сообщениях
|
Re: очередная неудачная DLL инжекция
Небольшой совет по winAPI.
Можно использовать Process32FirstW и Process32NextW вместо Process32First и Process32Next при получении Id процесса.
Приставка W означает что считывание строк будет происходить в юникоде и не нужно будет преобразовывать имя с помощью функции convertCharArrayToLPCWSTR.
По сути если она больше нигде не используется, то ее можно будет удалить чтобы не накапливать не нужный код.
Последний раз редактировалось growl13; 27.06.2018 в 13:56.
|
|
|
27.06.2018, 15:18
|
#5
|
|
|
|
Разведчик
|
Регистрация: 06.04.2017
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: очередная неудачная DLL инжекция
Спасибо за совет, в winAPI не углублялся, хотя про unicode и ANSI у Рихтера в самом начале написано.
Дополню сабж, начитался что начиная с висты у Windows появился механизм защиты памяти, и к win10 ситуация только ухудшилась, пробовал внедрять не DLL, а код. Тред создаётся, GetLastError показывает 0, после чего программа завершает работу, а с ней падает и клиент.
Возможно зря я копаю форум на предмет таких старых механизмов, может быть есть смысл пробовать под ХР ?
|
|
|
27.06.2018, 15:41
|
#6
|
|
|
|
Разведчик
|
Регистрация: 16.02.2011
Сообщений: 26
Популярность: 10
Сказал(а) спасибо: 87
Поблагодарили 10 раз(а) в 5 сообщениях
|
Re: очередная неудачная DLL инжекция
При запуске от имени администратора под win 10 всё замечательно инжектится и работает.
|
|
|
27.06.2018, 15:46
|
#7
|
|
|
|
Разведчик
|
Регистрация: 06.04.2017
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: очередная неудачная DLL инжекция
А можешь привести код инжектора ?
Просто я не уверен и в инжекторе, и в DLLке, запускаю аналогично от админа.
Ну или хотя бы часть кода с созданием указателя на функцию и запуск треда.
Последний раз редактировалось shaurmidze; 27.06.2018 в 15:48.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Файл] Очередная база
|
SetFer |
Базы серверов и брут |
7 |
05.07.2011 20:08 |
[Обсуждение] Очередная проблема c WP
|
faKebook |
Общение и обсуждение |
0 |
03.11.2010 18:13 |
[Обсуждение] Очередная война
|
Snova_s_vami |
Общение и обсуждение |
22 |
30.08.2010 21:40 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 19:14.
|
|