Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Особенности функции CreateRemoteThread |
Посл.ответ | Сообщение |
|
Создано: 05 февраля 2007 23:14 · Личное сообщение · #1 |
|
Создано: 05 февраля 2007 23:20 · Личное сообщение · #2 |
|
Создано: 06 февраля 2007 08:59 · Личное сообщение · #3 Сделал следующим образом: hThread = CreateRemoteThread(hProcess, NULL, 0,
Во внедряемой dll в функции DllMain стоит просто запуск ShowMessage c одной кнопкой OK. При внедрении в процес Explorer'а несмотря на установленный низкий приоритет вновь создаваемого потока, пока не нажмёшь на кнопку ОК Explorer просто подвисает. |
|
Создано: 06 февраля 2007 13:36 · Личное сообщение · #4 |
|
Создано: 06 февраля 2007 22:10 · Личное сообщение · #5 Вот код моей DLL: int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
Ижектор написан по Рихтеру. |
|
Создано: 06 февраля 2007 23:13 · Личное сообщение · #6 Цитата из MSDN: Warning On attach, the body of your DLL entry-point function should perform only simple initialization tasks, such as setting up thread local storage (TLS), creating objects, and opening files. You must not call LoadLibrary in the entry-point function, because you may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, you must not call the FreeLibrary function in the entry-point function on detach, because this can result in a DLL being used after the system has executed its termination code. Calling functions other than TLS, object-creation, and file functions may result in problems that are difficult to diagnose. For example, calling User, Shell, COM, RPC, and Windows Sockets functions (or any functions that call these functions) can cause access violation errors, because their DLLs call LoadLibrary to load other system components. While it is acceptable to create synchronization objects in DllMain, you should not perform synchronization in DllMain (or a function called by DllMain) because all calls to DllMain are serialized. Waiting on synchronization objects in DllMain can cause a deadlock. To provide more complex initialization, create an initialization routine for the DLL. You can require applications to call the initialization routine before calling any other routines in the DLL. Otherwise, you can have the initialization routine create a named mutex, and have each routine in the DLL call the initialization routine if the mutex does not exist. |
|
Создано: 07 февраля 2007 23:28 · Личное сообщение · #7 |
|
Создано: 07 февраля 2007 23:39 · Личное сообщение · #8 Aivengo Это цитата к функции DllMain, при чем тут инициализация самого процесса? Если ты вызываешь какой-то сложный код из DllMain, то не факт, что он отработает верно. В другой конфигурации винды сообщения мессаджбокса вообще может быть не будут обрабатываться. HoBleen пишет: Waiting on synchronization objects in DllMain can cause a deadlock. Мб что-нибуть такого плоана происходит. Aivengo пишет: а в том, как ведёт себя поток. Уверен, что именно потоки приостановлены, а не окна не получают свои сообщения? |
|
Создано: 08 февраля 2007 00:36 · Личное сообщение · #9 |
|
Создано: 08 февраля 2007 00:53 · Личное сообщение · #10 |
|
Создано: 08 февраля 2007 01:10 · Личное сообщение · #11 |
|
Создано: 08 февраля 2007 01:12 · Личное сообщение · #12 |
|
Создано: 08 февраля 2007 01:46 · Личное сообщение · #13 |
|
Создано: 08 февраля 2007 01:49 · Личное сообщение · #14 |
|
Создано: 08 февраля 2007 04:11 · Личное сообщение · #15 |
|
Создано: 08 февраля 2007 04:21 · Личное сообщение · #16 |
|
Создано: 09 февраля 2007 17:19 · Личное сообщение · #17 Aivengo пишет: Ижектор написан по Рихтеру. Не нашел, где у Рихтера написано про reason == DLL_THREAD_ATTACH зато есть: "На этом этапе DLL внедрена в удаленный процесс, а ее функция DllMam получила уведомление DLL_PROCESS_ATTACH и может приступить к выполнению нужного кода" Aivengo пишет: при создании потока фуекцией CreateRemoteThread все остальные потоки в процессе останавливаются до тех пор пока не выполнится этот... Повторю, что это бред, уж извиняй за прямоту. С CreateThread не возникает подобных проблем, а она реализована как раз через CreateRemoteThread А вот с loader lock'ом постоянно траблы. Кста, у того же Рихтера есть рабочий пример перечисления имиджей. Только там VirtualQuery, а не EnumProcessModules (а что должна вернуть последняя функцияя _в_процессе_ загрузки модуля? ) |
|
Создано: 12 февраля 2007 02:21 · Личное сообщение · #18 2S_T_A_S_ Замена DLL_PROCESS_ATTACH на DLL_THREAD_ATTACH не меняет в данном случае ровным счётом ничего кроме того, что момент выполнения кода в данном случае несколько смещается по времени. Изменение кода DLL до: #include <vcl.h> #include <windows.h> #include "psapi.h" #pragma hdrstop #pragma argsused VOID CALLBACK _export TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ) { char s[40]; char szProcessName[MAX_PATH] = "unknown"; int res = 0; KillTimer(NULL, idEvent); HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId()); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if(EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ); } else return; } else return; CloseHandle( hProcess ); strcpy(s, "Произведена инкапсуляция в процесс "); strcat(s, szProcessName); MessageBox(NULL, s, "Инкапсуляция", MB_OK); } int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { if(reason == DLL_PROCESS_ATTACH)//(reason == DLL_THREAD_ATTACH) { if(!SetTimer(NULL, 0, 10000, (TIMERPROC)TimerProc)) MessageBox(NULL, "Не могу создать таймер.", "Инкапсуляция", MB_OK); MessageBox(NULL, "DLL_PROCESS_ATTACH", "Инкапсуляция", MB_OK); } return 1; } //-------------------------------------------------------------------- ------- ровным счётом ничего не дала... результат тотже, правда не понятно почему функция таймера вызывается только в том случае, если DllMain ещё не завершилась (специально туда MessageBox сунул)... иначе ничего не происходит. Каким образом можно ещё переиграть? Может имеет смысл попытаться после загрузки Dll через CreateRemoteThread вызвать через него же нужную функцию в этой dll? Правда тогда надо будет каким-то образом вычислить её адрес в новом процессе. Если да, то как? |
|
Создано: 12 февраля 2007 11:07 · Поправил: S_T_A_S_ · Личное сообщение · #19 Возьми _рабочий_ пример Рихтера. Без всяких #include <vcl.h> (кстати, что это?) Aivengo пишет: Может имеет смысл попытаться после загрузки Dll через CreateRemoteThread вызвать через него же нужную функцию в этой dll? Правда тогда надо будет каким-то образом вычислить её адрес в новом процессе Её адрес вычислять не нужно он известнен. Вместо CreateRemoteThread поёдёт и CreateThread, но это скорее всего лишнее. 9bc6_12.02.2007_CRACKLAB.rU.tgz - 22-ImgWalk.zip |
|
Создано: 14 февраля 2007 02:34 · Личное сообщение · #20 |
|
Создано: 14 февраля 2007 04:05 · Личное сообщение · #21 |
|
Создано: 08 ноября 2011 15:54 · Поправил: bowrouco · Личное сообщение · #22 |
|
Создано: 08 ноября 2011 16:24 · Личное сообщение · #23 |
|
Создано: 08 ноября 2011 16:28 · Личное сообщение · #24 |
|
Создано: 08 ноября 2011 16:51 · Личное сообщение · #25 bowrouco Проблема не в этом, а в том что апаются никому не нужные старые топики. ----- Don_t hate the cracker - hate the code. | Сообщение посчитали полезным: hlmadip |
eXeL@B —› Программирование —› Особенности функции CreateRemoteThread |