Программа инжектит dll в клиент Л2, сейчас появилась необходимость передать в эту dll номер порта на который она должна пытатся подключиться. Как это лучше сделать?
Есть множество технологий: шареная между процессами память (aka Shared File Mem Mapping), каналы, сокеты на локалхост, COM IDataObject, банальный файл. Я-бы выбрал каналы (pipes).
после инжекта ты знаеш адрес загрузки длл.
можно узнать по какому смещению лежит нужная переменная.
потом пишем туда через WriteProcessMemory
(ты уже писал в память чтобы "заинжектить" и значит у тебя есть соответствующие права)
только адреса придется искать.
твой случай можно разрулить так:
в длл делаем экспортируемую функию
int m_connect(int port)
{
// тут делаем что тебе нужно с портом.
return true;
};
у тебя есть своя программа_инжектилка.
там пишем такой код.
c++ Код:
DWORD a1 = loadLibrary("твой_модуль.dll");
DWORD a2 = getprocaddress(a1,"m_connect");
FreeLibrary(a1);
DWORD ofs_connect = a2 - a1; // узнали как далеко находится функция [b]m_connect[/b] от начала длл.
HANDLE hProcess = CreateProcess("линейка.exe");
DWORD pStartThread = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");
PVOID mem = VirtualAllocEx(hProcess,0,0x1000,0x1000,0x40);
if(! WriteProcessMemory(hProcess, mem, "путь_к_длл", 50, 0))return0; //чтото нитак.
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pStartThread, mem, CREATE_SUSPENDED, NULL);
ResumeThread(hThread);
//тоесть выполнили стандартную догрузку длл.
DWORD dwWaitResult = WaitForSingleObject( hThread, INFINITE);// ждем завершения потока
DWORD exitcode = 0;
BOOL rth = GetExitCodeThread(hThread,&exitcode); // получаем его результат.
CloseHandle(hThread);//
VirtualFreeEx(hProcess,mem,0,MEM_RELEASE);// освобождаем ненужные ресурсы.//получаем адрес функции "m_connect" в процесе "линейка.ехе"
DWORD connect_address = exitcode + ofs_connect;
// теперь уличная магия
hThread = CreateRemoteThread(hProcess, NULL, 0, connect_address, port, CREATE_SUSPENDED, NULL);
ResumeThread(hThread);
CloseHandle(hThread);
CloseHandle(hProcess);
Добавлено через 3 минуты
Цитата:
Сообщение от izen
ну а в чем проблема через тот-же сокет передать?
+1
Цитата:
Сообщение от izen
Банальный файл в корне то-же вариант.
а за такое на кострах сжигать надо.
Добавлено через 2 минуты
Цитата:
Сообщение от izen
или да, найти абсолютное файловое смещение номера порта в dll и тупо ее патчить перед иньектом.
и за такое тоже
__________________
Шожиделать.. ботить хочется..
Последний раз редактировалось destructor, 10.11.2010 в 00:54.
Причина: Добавлено сообщение
За это сообщение destructor нажился 2 спасибками от:
ну а в чем проблема через тот-же сокет передать? Банальный файл в корне то-же вариант. Перед иньектом записали, во 2м процессе считали, удалили. Или например если иньект через CreateRemoteThread и запись загрузчика в АП l2, то сделать какой-нить глобальный постоянный адрес, или положить номер порта на дно стека трида или в самом коде иньекта вызывать DllMain с lpReserved с портом. или да, найти абсолютное файловое смещение номера порта в dll и тупо ее патчить перед иньектом.
Последний раз редактировалось izen, 10.11.2010 в 00:08.
Попутный вопрос. Как можно програмно проверить было ли же ужен подружена нужная длл к процессу л2, это на случай если основное приложение было перезапущено и ему надо принять решение патчить повторно или нет.
EnumProcessModules из psapi(_http://msdn.microsoft.com/en-us/library/ms682621(v=VS.85).aspx) или Module32First/Next из kernel32 (_http://msdn.microsoft.com/en-us/library/ms686849(v=VS.85).aspx).
PS: про сожжение на костре за костыль согласен, но для личного "совсем простого" применения вполне ничего.
Последний раз редактировалось izen, 10.11.2010 в 02:32.