Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "WinAPI";
Поточний архів: 2002.12.23;
Завантажити: [xml.tar.bz2];

Вниз

Ось питаннячко для майстрів! Знайти схожі гілки


Василий2   (2002-11-04 13:51) [0]

Як впровадити свою DLL в чужій процес? Тільки впроваджувати НЕ за допомогою пасток! Знаю, що треба використовувати функції OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThread ...



Digitman   (2002-11-04 15:09) [1]


> Знаю, що треба використовувати функції


Знаєш - використовуй! Які проблеми ?



Василий2   (2002-11-04 20:36) [2]

Проблема в тому, що я не розумію яке у пам'яті потрібно зайняти (VirtualAllocEx). Вообщем, розкажіть, будь ласка, як всієї цієї трухою користуватися.



Ihor Osov'yak   (2002-11-04 22:57) [3]

Знайди книгу Ріхтера, там ціла глава матеріалу на цю тему.
І взагалі, дуже корисна книга.




AlteFriz   (2002-11-05 09:14) [4]

Повна назва книги, якщо можна напишіть, теж хочу почитати.



Digitman   (2002-11-05 09:25) [5]

> Васілій2

Запросити потрібно стільки пам'яті, скільки її потрібно для розміщення повного образу впроваджуваного ісп.модуля



Digitman   (2002-11-05 09:33) [6]

Кілька неточно. Мається на увазі - НЕ модуля самої dll, а бінарного способу ісп.кода, який стартуватиме в цільовому ВАП допомогою CreateRemoteThread.


В успішно розподілене таким способом цільове ВАП викликом WriteProcessMemory () копіюється ісп.код потоку, після чого потік стартує викликом CreateRemoteThread (). В ході виконання віддаленого код.потока, власне, і відбувається завантаження dll в той ВАП, в якому код.поток стартував (якщо це передбачено алгоритмом код.потока)



Василий2   (2002-11-05 12:00) [7]

А кого-небудь є исходник? На словах це складно зрозуміти.



Digitman   (2002-11-05 14:34) [8]


> На словах це складно зрозуміти.


Що складно? Саме?



Василий2   (2002-11-06 11:12) [9]

Коли бачиш приклад, тобі стає все ясно. Кажуть - вчитися треба на реальних прикладах, а не тільки на одній теорії.

Як визначити бінарний образ виконуваного коду?




Ihor Osov'yak   (2002-11-06 11:33) [10]

2 AlteFriz © (05.11.02 09:14)

Джеффі Ріхтер. Windows для професіоналів. Третє видання.
Вид Російська редакція Microsoft Press

В оригіналі Advanced Windows. Third Edition Jeffey Richter.

Вже вийшла четверта редакція, але називається якось по іншому,
щось типу Programming Application for Microsoft Windows,
люди кажуть, що бігає по інету в електронному вигляді.


2 Васілій2 © (06.11.02 11:12) Ідіть до Ріхтером.
У третьому російською виданні сторінки 625-646. І все в прикладах.



Digitman   (2002-11-06 11:33) [11]

> Васілій2


> Як визначити бінарний образ виконуваного коду?


Що під цим мається на увазі - не зрозуміло. Прокоментуй



Василий2   (2002-11-06 18:48) [12]

Ви казали:

Кілька неточно. Мається на увазі - НЕ модуля самої dll, а бінарного способу ісп.кода, Який стартуватиме в цільовому ВАП допомогою CreateRemoteThread.



Василий2   (2002-11-06 18:49) [13]

Ihor Osov "yak -> А де в інтернеті валяється це книжка?



Ihor Osov'yak   (2002-11-07 10:13) [14]

2 Васілій2 © (06.11.02 18:49)

Ну блін, ви даєте.
Рівно два хвилини пошуку - http://anatolix.naumen.ru/win32books.htm

ЗИ. Навіть не знаю, як Ви зі мною розрахуєтеся.



Gandalf   (2002-11-07 18:07) [15]

Рівно два хвилини пошуку - http://anatolix.naumen.ru/win32books.htm
Спасибі, але там начебто посилання биті.



Gandalf   (2002-11-07 18:10) [16]

Прошу вибачення. Все нормально.



Василий2   (2002-11-07 20:35) [17]

Єдине погано - код на C ... :(



Xemax   (2002-11-08 13:40) [19]





Xemax   (2002-11-08 13:41) [20]

.



Xemax   (2002-11-08 13:46) [21]

Форум заглючить ;-))



Ketmar   (2002-11-08 15:10) [22]

ну і що, що Ц? перевести складно? in a mater of fact, у мене є, звичайно, на ельфів, тільки я не дам. жадібний я. % -) хіба якщо тільки завдання дуже термінова і важлива ...

Satanas Nobiscum! 08-Nov-XXXVII AS



Василий2   (2002-11-08 17:51) [23]

Якби мені це було не важливо, я б не писав, а раз тобі шкода, то навіщо взагалі писати про це ???



Ketmar   (2002-11-08 19:06) [24]

скажімо так: мені дуже цікаво знати, НАВІЩО це вам. якщо причини мені здадуться досить важливими, я пришлю код. це по-перше. по-друге, код №1 працездатний тільки на WinNT, код №2 перевірявся тільки на Win2K і я не знаю, чи буде працювати в інших системах. коротше кажучи - welcome в моє мило. можливо, спеціально для вас виріжу шматок з Кассандри.

зиж
можна і здогадатися, що якщо написати мені правильне мило, то буде людям щастя% -))

ззиж
не знаю, правда, як мій код корелюється з Ріхтером (не дивився я його реалізацію) ... у мене (Win2K Advanced Server) - працює.

Satanas Nobiscum! 08-Nov-XXXVII AS



Василий2   (2002-11-09 13:52) [25]

Ketmar -> Скажімо так: яка тобі РІЗНИЦЯ? Ти ж не питаєш чому я ходжу з тими дівками, а не з тими. Навіщо тобі якісь причини? Навчитися я хочу!

Що стосується коду, то мені без різниці пришлеш ти мені його чи ні, №1 або №3 ... Зрештою інших попрошу. Благати я нікого не буду. Але якщо пришлеш, то буду вдячний.



Ketmar   (2002-11-09 15:02) [26]

2Васілій2:
а велика різниця. код - МІЙ. і мені цікаво, для чого він буде використаний. якщо у вас реальна термінове завдання - так. якщо просто баловство - обійдетеся якось. у іншого попросіть, як і припускали. я зрозумів - баловство. ну і вперед, балуйтесь далі.

до речі, не завадило б бути ввічливіше. це не я до вас прийшов, просячи взяти у мене код, а ви до мене, за допомогою. ось і будьте настільки люб'язні просити ввічливо. comprenez vous?

Satanas Nobiscum! 09-Nov-XXXVII AS



Василий2   (2002-11-09 16:05) [27]

2Ketmar:

Вірно! Я прийшов до вас за допомогою, тільки ви допомогти не хочете. Або не хочете або не знаєте ...

Про який пустощі ви говорите ??? Впровадження DLL - баловство? Я знаю як впроваджувати за допомогою пасток, хочу спробувати за допомогою потоків. У чому власне проблема? Як вас ще просити - не розумію.



paul_shmakov   (2002-11-09 16:53) [28]

// // впровадження dll в чужій процес за допомогою CreateRemoteThread.
//
// внедрение dll в чужой процесс с помощью CreateRemoteThread.
// работать будет только там, где эта самая CreateRemoteThread реализована,
// а это nt/w2k/xp
// использовать так:
// loader.exe идентификатор_процесса полный_путь_и_имя_dll
// paul_shmakov@mail.ru
//
program loader;

{$APPTYPE CONSOLE}

uses
Windows, Messages, SysUtils;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
begin
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;

function Start(ProcessID: Cardinal; DllFileName: string): Boolean;
var
hProcess, hTh: THandle;
BytesWritten, ThreadID, DllNameLen: Cardinal;
LoadLibraryProc, MemPtr: Pointer;
ExitCode: DWord;
begin
Result := false;

//
// этот вызов нужен только для внедрения в системные процессы
// btw, нужны привилегии администратора
//
SetDebugPriv();

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,
true, ProcessID);

if hProcess <> 0 then
begin
DllNameLen := Length(DllFileName) + 1;

MemPtr := VirtualAllocEx(hProcess, nil, DllNameLen, MEM_COMMIT, PAGE_READWRITE);

if MemPtr <> nil then
begin
if WriteProcessMemory(hProcess, MemPtr, PChar(DllFileName), DllNameLen, BytesWritten) then
begin
LoadLibraryProc := GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

hTh := CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);

if hTh <> 0 then
begin
if (WaitForSingleObject(hTh, INFINITE) = WAIT_OBJECT_0) and
GetExitCodeThread(hTh, ExitCode) then
Result := ExitCode <> 0;

CloseHandle(hTh);
end;
end;

VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);
end;

CloseHandle(hProcess);
end;

end;


var
ProcessID: Cardinal;
DllName: string;
begin
if ParamCount < 2 then
begin
WriteLn("usage: loader.exe process_id dll_full_path_and_name");
Exit;
end;

ProcessID := StrToInt(ParamStr(1));
WriteLn("process id: " + IntToStr(ProcessID));

DllName := ParamStr(2);
WriteLn("dllname: " + DllName);

if ProcessID <> 0 then
begin
if Start(ProcessID, DllName) then
WriteLn("success")
else
WriteLn("fail");
end;
end.




Ketmar   (2002-11-09 17:00) [29]

впровадження DLL - баловство. не бачу, для чого б ви могли це застосувати. для звичайних завдань (хоча які, нафіг, звичайні завдання вимагають впровадження свого коду в чужій процес ?!) хуков цілком вистачає.
якщо ви вчитеся з цікавості - так читайте Ріхтера, вчіть Сі і переводите. всяко корисну справу. по дорозі ще, можливо, що-небудь цікаве дізнаєтеся. а якщо у вас термінове завдання (шеф наказав, курсовик горить і ти ди) - тоді інша розмова. тоді я кинуся кодом, а потім вже розтлумачу, що неясно. тому як горить. позаяк у вас не горить, значить - баловство. тон ваш мені не подобається, отже - не поділили.

зиж
і взагалі - давайте зійдемося на тому, що я не знаю і не вмію цього робити.

Satanas Nobiscum! 09-Nov-XXXVII AS



Василий2   (2002-11-09 17:08) [30]

paul_shmakov: Дякую!



paul_shmakov   (2002-11-09 17:16) [31]

2 Ketmar:
"Впровадження DLL - баловство ..... хоча які, нафіг, звичайні завдання вимагають впровадження свого коду в чужій процес ?!"

ну не скажіть, мені, наприклад, необхідно розширювати функціональність додатків (чужих, без вихідних текстів) для виконання тих функцій, які в них спочатку не були закладені. наприклад, є завдання функціонування якогось додатка в умовах підвищеної секретності. необхідно, наприклад, щоб всі файли, які видаляє цей додаток в процесі роботи, віддалялися без можливості відновлення, не за допомогою звичайної DeleteFile, як було закладено спочатку розробниками. і т.п.
при інтеграції успадкованих систем з новим програмним забезпеченням теж такі завдання часто з'являються.



Ketmar   (2002-11-09 18:00) [32]

2paul_shmakov:
а я і питав, НАВІЩО людині знати. якщо "для інтересу" - баловство. нехай сам шукає, більшого навчиться. % -)

до речі, ось цей шматочок викликає у мене сумніви: hTh: = CreateRemoteThread (hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);
після того, як LoadLibraryA-таки виконалася, куди воно повернеться? чи не є більш вірно потім викликати ExitThread? в Хелп написано, що процедура потоку "зазвичай не завершується" (мається на увазі, що не досягає фінального end). на всіх чи системах коректно припустити, що після завершення оной процедури буде повернення в туди, куди ExitThread посилає?

і ось цей ось код (підправлений% -) часом не ваш? а то не пам'ятаю, у кого зпіонерив% -)
var PDOSHeader: PImageDosHeader; PNTHeader: PImageNtHeaders; PImportDesc: PImageImportDescriptor; dwProtect: DWORD; PThunk: PImageThunkData; dwNewProtect: DWORD; dwAddressToIntercept: DWORD; WasProtected, Ok: Boolean; begin Result: = False; if IsBadReadPtr (Pointer (ModuleHandle), SizeOf (TImageNtHeaders)) then Exit; // check for correct DOS header PDOSHeader: = PImageDosHeader (ModuleHandle); if (PDOSHeader ^ .e_magic <> IMAGE_DOS_SIGNATURE) then Exit; // check for correct PE header PNTHeader: = PImageNtHeaders (DWORD (PDOSHeader) + DWORD (PDOSHeader ^ ._ lfanew)); if (PNTHeader ^ .Signature <> IMAGE_NT_SIGNATURE) then Exit; PImportDesc: = PImageImportDescriptor (DWORD (ModuleHandle) + DWORD (pNTHeader ^ .OptionalHeader.DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT] .VirtualAddress)); if (DWORD (PImportDesc) = DWORD (PNTHeader)) then Exit; dwAddressToIntercept: = DWORD (HookAddr); while (PImportDesc ^ .Name <> 0) do begin PThunk: = PImageThunkData (DWORD (ModuleHandle) + DWORD (PImportDesc ^ .FirstThunk)); while (PThunk ^ .ProcEntry <> nil) do begin if (DWORD (pThunk ^ .ProcEntry) = dwAddressToIntercept) then begin WasProtected: = IsBadWritePtr (@ pThunk ^ .ProcEntry, SizeOf (DWORD)); if WasProtected then Ok: = VirtualProtect (@ PThunk ^ .ProcEntry, SizeOf (DWORD), PAGE_EXECUTE_READWRITE, dwProtect) else Ok: = True; if Ok then begin // WriteLn ( "!"); PThunk ^ .ProcEntry: = OldProc; Result: = True; end; if Ok and WasProtected then begin dwNewProtect: = dwProtect; VirtualProtect (@ pThunk ^ .ProcEntry, SizeOf (DWORD), dwNewProtect, dwProtect); end; end; Inc (PChar (PThunk), SizeOf (TImageThunkData32)); end; Inc (PChar (PImportDesc), SizeOf (TImageImportDescriptor)); end; end;

Satanas Nobiscum! 09-Nov-XXXVII AS



paul_shmakov   (2002-11-09 18:37) [33]

2 Ketmar:
"Нехай сам шукає, більшого навчиться.% -)"
ось це правильно, але якщо людина сама не хоче вчитися - можна йому допомогти готовим - йому ж гірше в майбутньому;)

"До речі, ось цей шматочок викликає у мене сумніви: hTh: = CreateRemoteThread (hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);
після того, як LoadLibraryA-таки виконалася, куди воно повернеться? чи не є більш вірно потім викликати ExitThread? в Хелп написано, що процедура потоку "зазвичай не завершується" (мається на увазі, що не досягає фінального end). на всіх чи системах коректно припустити, що після завершення оной процедури буде повернення в туди, куди ExitThread посилає? "


брр ... не зовсім зрозумів вашу думку - видать роботи в свята позначається :)
тому викладу так, як я це все бачу. сподіваюся відповім :)
спрощено послідовність така:
1) об'єкт ядра "потік" створюється за допомогою виклику CreateThread або CreateRemoteThread. відбувається якась ініціалізація начебто виділення стека, едиб викликів dllmain з DLL_THREAD_ATTACH у завантажених dll і т.п.
2) починає виконуватися функція в контексті цього потоку, адреса якої був переданий в Create (Remote) Thread.
3) як тільки відбувається повернення з цієї функції, викликається ExitThread. тобто умовно код такий:
// дія відбувається в далекій галактиці, десь глибоко всередині ядра windows .... void DeepInternalStartThread (...., LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, ....) { // .... bla-bla-bla // .... bla-bla-bla // .... bla-bla-bla ExitThread (lpStartAddress (lpParameter)); }
4. все, потоку вже майже немає. в процесі виконання ExitThread виконується якась деініціалізацію, начебто оповіщення dll про DLL_THREAD_DETACH, видалення стека потоку і т.д. об'єкт ядра "потік" буде знищений коли закриються всі посилання на нього.

виходячи з цієї зразкової схеми ніяких проблем не видно. та й немає їх :)
код LoadLibrary виконується, а коли вона завершується - видаляється потік.


"На всіх чи системах коректно припустити, що після завершення оной процедури буде повернення в туди, куди ExitThread посилає?"

а ExitThread "нікуди не посилає" :) потік - це ж окрема нитка виконання. вона завершується викликом ExitThread - відповідно, далі вже нікуди нічого переходити, повертатися і надсилати не буде, тому що саме виконання коду припинено.

"І ось цей ось код (підправлений% -) часом не ваш? А то не пам'ятаю, у кого зпіонерив% -)"

:) може і мій. а що? насправді, авторство тут не так важливо - можна навіть сказати, що автор - microsoft, тому що маючи, певну ms, структуру pe файлу складно написати цей код інакше - у всіх він виходить приблизно однаковий.



paul_shmakov   (2002-11-09 18:44) [34]

до речі, CreateRemoteThread в win9x / me теж реалізована насправді. тільки вона з kernel32.dll не експортується :( спосіб визначення її точки входу ну дуже ізвращенскій. а то було б приємно ...
це так, до слова :)



Ketmar   (2002-11-09 19:13) [35]

я зрозумів. питання просто криво сформулював. ви-таки все відповіли. пішов каструвати Кассандру% -)

щодо CreateRemoteThread в Win9X: а як? що, руцямі шукати по сигнатурам і ти ди? втім, можна не відповідати, бо питання - чисте баловство і цікавість% -) все одно немає у мене цих систем, щоб перевірити.

щодо коду: просто я його з цього форуму колись скопіював, і забув, у кого (ну лінь мені було писати, а тут якраз валяється% -). а раптом автор образиться? % -))

і ще питання: чи можна припустити, що якщо я створюю процес за допомогою CreateProcess (blah-blah, CREATE_SUSPENDED, blah-blah), а потім роблю GetThreadContext, то в регістрі EAX знаходиться стартовий адресу процесу (тобто коректно обчислень EntryPoint з заголовка)? для мого Win2K Advanced Server це так, а для інших систем? не знаєте, бува?

Satanas Nobiscum! 09-Nov-XXXVII AS



paul_shmakov   (2002-11-10 13:36) [36]

"Щодо CreateRemoteThread в Win9X: а як? Що, руцямі шукати по сигнатурам і ти ди? Втім, можна не відповідати, бо питання - чисте баловство і цікавість% -) все одно немає у мене цих систем, щоб перевірити."

у мене теж цих систем немає, тому ця можливість вже не дуже актуальна для мене. але якщо є інтерес, то можна повивчати:
http://www.anticracking.sk/EliCZ/export/RT.ZIP
http://madshi.net
обидва пакети досить легко дізассембліруются. та й код там не дуже довгий.

"Чи можна припустити, що якщо я створюю процес за допомогою CreateProcess (blah-blah, CREATE_SUSPENDED, blah-blah), а потім роблю GetThreadContext, то в регістрі EAX знаходиться стартовий адресу процесу (тобто коректно обчислень EntryPoint з заголовка)? "

чесно кажучи, не знаю. і перевірити ніде. в будь-якому випадку - можна entrypoint і самостійно отримати.



сторінки: 1 вся гілка

Форум: "WinAPI";
Поточний архів: 2002.12.23;
Завантажити: [xml.tar.bz2];

Вгору





Пам'ять: 0.71 MB
Час: 0.045 c
6-74862
evgeniy1
2002-10-26 03:30
2002.12.23
Пошта


8-74851
сумний
2002-09-05 08:02
2002.12.23
Полігон в Teechart


6-74871
Мікель
2002-09-04 20:09
2002.12.23
скачати


14-74926
сатир
2002-10-30 13:26
2002.12.23
команда Шкодер


3-74610
Gaber
2002-12-05 10:30
2002.12.23
Перенесення даних з Excel в IB





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська