PDA

Просмотр полной версии : Как передать параметры в DLL?


Yegor
09.11.2010, 16:36
Программа инжектит dll в клиент Л2, сейчас появилась необходимость передать в эту dll номер порта на который она должна пытатся подключиться. Как это лучше сделать?

izen
09.11.2010, 17:14
Есть множество технологий: шареная между процессами память (aka Shared File Mem Mapping), каналы, сокеты на локалхост, COM IDataObject, банальный файл. Я-бы выбрал каналы (pipes).

alexteam
09.11.2010, 17:48
патч дллку ))

Yegor
09.11.2010, 23:27
izen, хотелось бы как то совсем просто, дллка и так будет иметь связь с с основным процессом через сокеты.

izen
09.11.2010, 23:43
: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 и тупо ее патчить перед иньектом.и за такое тоже

Yegor
10.11.2010, 01:25
Попутный вопрос. Как можно програмно проверить было ли же ужен подружена нужная длл к процессу л2, это на случай если основное приложение было перезапущено и ему надо принять решение патчить повторно или нет.

izen
10.11.2010, 02:22
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 раза длл не загрузится, поэтому инжектить ее можно много раз.

xkor
10.11.2010, 15:31
Yegor, 2 раза длл не загрузится, поэтому инжектить ее можно много раз.смотря как инжектить...

Yegor
10.11.2010, 15:56
xkor, инжекчу в процесс Л2 код чтобы он вызвал функцию LoadLibrary(); так можно инжектить несколько раз?

destructor
10.11.2010, 16:07
вот так у тебя это будет выглядеть:
int main()
{
LoadLibrary("твоя_длл");
sleep
LoadLibrary("твоя_длл");
sleep
LoadLibrary("твоя_длл");
sleep
LoadLibrary("твоя_длл");
};
тоесть ничо страшного, только dllmain будет вызыватся каждый раз.


xkor пишет про совершенно другой случай.

Yegor
11.11.2010, 00:37
destructor, а событие в dllmain какое будет передано? DLL_PROCESS_ATTACH как при первой загрузке или что то другое?

destructor
11.11.2010, 04:35
1)проверь сам, это не сложно.
2)будет передано DLL_THREAD_ATTACH