Просмотр полной версии : Как передать параметры в DLL?
Программа инжектит dll в клиент Л2, сейчас появилась необходимость передать в эту dll номер порта на который она должна пытатся подключиться. Как это лучше сделать?
Есть множество технологий: шареная между процессами память (aka Shared File Mem Mapping), каналы, сокеты на локалхост, COM IDataObject, банальный файл. Я-бы выбрал каналы (pipes).
alexteam
09.11.2010, 17:48
патч дллку ))
izen, хотелось бы как то совсем просто, дллка и так будет иметь связь с с основным процессом через сокеты.
:stinker: ну а в чем проблема через тот-же сокет передать? Банальный файл в корне то-же вариант. Перед иньектом записали, во 2м процессе считали, удалили. Или например если иньект через CreateRemoteThread и запись загрузчика в АП l2, то сделать какой-нить глобальный постоянный адрес, или положить номер порта на дно стека трида или в самом коде иньекта вызывать DllMain с lpReserved с портом. или да, найти абсолютное файловое смещение номера порта в dll и тупо ее патчить перед иньектом.
destructor
10.11.2010, 00:54
патч дллку ))
рульный совет.
после инжекта ты знаеш адрес загрузки длл.
можно узнать по какому смещению лежит нужная переменная.
потом пишем туда через WriteProcessMemory
(ты уже писал в память чтобы "заинжектить" и значит у тебя есть соответствующие права)
только адреса придется искать.
твой случай можно разрулить так:
в длл делаем экспортируемую функию
int m_connect(int port)
{
// тут делаем что тебе нужно с портом.
return true;
};
у тебя есть своя программа_инжектилка.
там пишем такой код.
DWORD a1 = loadLibrary("твой_модуль.dll");
DWORD a2 = getprocaddress(a1,"m_connect");
FreeLibrary(a1);
DWORD ofs_connect = a2 - a1; // узнали как далеко находится функция m_connect от начала длл.
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) ) return 0; //чтото нитак.
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 минуты
ну а в чем проблема через тот-же сокет передать?+1
Банальный файл в корне то-же вариант.а за такое на кострах сжигать надо.
Добавлено через 2 минуты
или да, найти абсолютное файловое смещение номера порта в dll и тупо ее патчить перед иньектом.и за такое тоже
Попутный вопрос. Как можно програмно проверить было ли же ужен подружена нужная длл к процессу л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: про сожжение на костре за костыль согласен, но для личного "совсем простого" применения вполне ничего.
destructor
10.11.2010, 12:41
Yegor, 2 раза длл не загрузится, поэтому инжектить ее можно много раз.
Yegor, 2 раза длл не загрузится, поэтому инжектить ее можно много раз.смотря как инжектить...
xkor, инжекчу в процесс Л2 код чтобы он вызвал функцию LoadLibrary(); так можно инжектить несколько раз?
destructor
10.11.2010, 16:07
вот так у тебя это будет выглядеть:
int main()
{
LoadLibrary("твоя_длл");
sleep
LoadLibrary("твоя_длл");
sleep
LoadLibrary("твоя_длл");
sleep
LoadLibrary("твоя_длл");
};
тоесть ничо страшного, только dllmain будет вызыватся каждый раз.
xkor пишет про совершенно другой случай.
destructor, а событие в dllmain какое будет передано? DLL_PROCESS_ATTACH как при первой загрузке или что то другое?
destructor
11.11.2010, 04:35
1)проверь сам, это не сложно.
2)будет передано DLL_THREAD_ATTACH
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot