![]() |
eXeL@B —› Вопросы новичков —› Как пропатчить DLL-модуль в памяти? |
Посл.ответ | Сообщение |
|
Создано: 13 декабря 2009 02:38 · Личное сообщение · #1 В программе при загрузке подгружаются модули .DLL Я нашёл в каких местах одного из DLL нужно подменить байты, чтобы в программе стали доступны все лицезированные возможности. DLL запакована. Quick Unpacker показывает: PESniffer EP Scan: PEtite v2.1 PEiD scanning... PEtite 2.x [Level 0] -> Ian Luck В начале файла-DLL находится загрузчик-распаковщик. Я в распаковщик встроил свой код, который после распаковки меняет нужные байты в памяти. Т.к. программа проверяет целостность своих файлов, то пришлось ещё добавить нужные байты, чтобы сходилась контрольная сумма. Всё это до недавнего времени работало, но теперь появилась ещё какая-то доп. проверка целостности файлов, которую мой DLL уже не проходит. Подскажите, каким образом можно поменять эти очень нужные байты в памяти, не меняя DLL-файл? Попробовал ABEL loader generator на основную программу, не получается. Пишет, что это защищённая область памяти DLL Что можно сделать? ![]() |
|
Создано: 13 декабря 2009 03:34 · Поправил: SVLab · Личное сообщение · #2 |
|
Создано: 13 декабря 2009 05:13 · Личное сообщение · #3 krobol2000 Ты либу патченную не хочешь больше трогать? ну тогда напиши ещё одну и запихни весь код с "инЪекцией" туда, назови её lpk.dll ![]() ![]() SVLab пишет: А почему ты думаешь, что правка в памяти тебе поможет? возможно там и происходит дополнительная проверка. Не совсем понял, что ты имеешь в виду...Разве нельзя загасить эту проверку в памяти таким же образом как и всё остальное? Да и вообще что мешает просто расковырять эксешник и глянуть что там и как?! ![]() |
|
Создано: 13 декабря 2009 13:23 · Личное сообщение · #4 SVLab, доп. проверки целостности в памяти пока нет, т.к. менял эти байты дебаггером и всё работает. MasterSoft, DLL надо оставить оригинальным (сам файл), а вот в памяти после того, как он распакуется, поменять нужные байты. Про lpk.dll не понял. Про VirtualProtect читал, например, здесь www.xakep.ru/magazine/xa/118/062/1.asp - то что мне нужно это способ №3. Это проделывает генератор лоадера - ABEL, но только для ехе-шника. Есть ли похожая программа для изменения подгружаемых DLL? ![]() |
|
Создано: 13 декабря 2009 14:31 · Поправил: SVLab · Личное сообщение · #5 |
|
Создано: 13 декабря 2009 15:54 · Личное сообщение · #6 SVLab, да, сам себя exe проверяет, т.е. в него встроить нельзя. К тому же он часто обновляется, поэтому при каждом обновлении придётся заново встраивать патчер. Насколько я понял, выход такой: на masm32 (сегодня установил его) пишу лоадер, который - запускает основную программу "main.exe" - через 5-10 сек (думаю столько хватит, чтобы main.exe загрузила DLL - "protect.dll") ищет в памяти нужный модуль protect.dll - патчит в protect.dll нужные байты - лоадер заканчивает работу, а программа продолжает работать в полнофункциональном режиме. В аттаче loader.asm, то что я нашёл за образец. Теперь в него нужно вставить код, который реализует патчинг нужной dll. Как это сделать? Либо, второй вариант: - с помощью ABEL генерю лоадер, который в основную программу main.exe добавит код, который пропатчит нужный модуль после загрузки этого модуля. на примере изменение API MessageBoxA: в main.exe вставляем JMP и по адресу JMP: 00401026 PUSHAD; сохраняем регистры в стек ; далее следуют четыре параметра, передаваемые в стек перед вызовом VirtualProtect 00401027 PUSH 00401060; указатель на нулевой байт - параметр "lpflOldProtect" 0040102C MOV EAX,40; Помещаем в EAX параметр "flNewProtect", который разрешает запись в область памяти, где располагается наша DLL 00401031 PUSH EAX; кладем параметр в стек 00401032 PUSH 8; параметр "dwSize", который представляет собой размер области памяти 00401034 PUSH 7E3A05C1; параметр "lpAddress" - начальный адрес области памяти 00401039 CALL VirtualProtect; вызываем VirtualProtect 0040103E MOV EAX,[401100]; помещаем в eax первые 4 байта машинного кода 00401043 MOV EBX,7E3A05C1; в ebx помещаем адрес, по которому будет записано машинное слово 00401048 MOV [EBX],EAX; записываем машинный код в тело API-функции 0040104A MOV EAX,[401104]; помещаем в eax 4 последних байта машинного кода 0040104F MOV EBX,7E3A05C5; в ebx помещаем адрес, по которому будет записано машинное слово 00401054 MOV [EBX],EAX; записываем машинный код в тело API-функции 00401056 POPAD; восстанавливаем регистры перед вызовом MessageBoxA 00401057 CALL MessageBoxA 0040105C JMP 00401013; переходим к дальнейшему выполнению программы По этому методу есть несколько вопросов: как узнать адрес памяти в которую загружен DLL (ан-но 7E3A05C1). Какой метод попроще и как реализовать хоть какой-то? ![]() ![]() |
|
Создано: 13 декабря 2009 16:41 · Поправил: _ruzmaz_ · Личное сообщение · #7 krobol2000 пишет (в loader.asm): invoke SuspendThread,addr pinfo.hThread ; Тормозим нашу прогу А к моменту вызова SuspendThread (после Sleep) прога других потоков не наклепает? Или просто с protect.dll работает только этот поток? Перед WriteProcessMemory возможно еще придется VirtualProtectEx вызывать. ![]() |
|
Создано: 13 декабря 2009 16:59 · Поправил: BoRoV · Личное сообщение · #8 |
|
Создано: 13 декабря 2009 17:19 · Личное сообщение · #9 |
|
Создано: 13 декабря 2009 18:20 · Личное сообщение · #10 |
|
Создано: 13 декабря 2009 20:14 · Личное сообщение · #11 |
|
Создано: 13 декабря 2009 20:39 · Личное сообщение · #12 |
|
Создано: 14 декабря 2009 01:33 · Личное сообщение · #13 Загружаю программу в olly debugger - когда стоит на оеп, то нужного dll ещё не загружено. В процессе выполнения программы вызывается функция, которая загружает необходимые для работы dll-ки. Т.е. dll грузятся программой. Программа использует MVC и грузит dll функцией QtCore4.load@QLibrary@@QAE_NXZ которая вызывает в свою очередь функцию kernel32.LoadLibraryW ![]() |
|
Создано: 14 декабря 2009 07:08 · Поправил: ClockMan · Личное сообщение · #14 |
|
Создано: 14 декабря 2009 18:17 · Личное сообщение · #15 LOADER.EXE - загружена по адресу 0401000h из него, с помощью kernel32.CreateProcessA запускаю основную программу MAIN.EXE MAIN.EXE - загружена по адресу 0401000h. В ней подгружается TARGET.DLL с помощью kernel32.LoadLibraryW. TARGET.DLL загружена по адресу 01161000h (но это частный случай). Как из LOADER.EXE попасть в адресное пространство процесса MAIN.EXE, чтобы изменить TARGET.DLL в памяти по адресу 01161000h? ClockMan, PUSH "KERNEL32.dll" CALL kernel32.GetModuleHandleA показывает адрес местной копии модуля kernel32.dll Соответственно PUSH "TARGET.DLL"; CALL kernel32.GetModuleHandleA; - результат EAX=0 =( ![]() |
|
Создано: 14 декабря 2009 18:48 · Личное сообщение · #16 krobol2000 тут простых путей мало. 1) как тебе все и говорят, твой лоадер должен запустить процесс засуспендженным и выполнить инжект своей длл, которой уже будет проще работать в контексте данного процесса ( можешь погуглить на эту тему ). далее один из вариантов по таймеру сканить не подгрузилась ли длл как тебе тут советовали и тогда ее патчить, или же хучить сплайсингом LoadLibraryEx и анализировать имя длл, а потом патчить. 2) вся логика остается в лоадыре он будет отпускать и суспендить процесс через какое-то время и сканировать всю память процесса ( т.е. читать по 0x1000 память ) и искать сигнатуру из кода твоей длл, чтобы распознать что она уже загружена, далее делаешь подсчет насколько тебе нужно сместится относительно найденного адреса чтобы пропатчить ее. ну это то что счас в голову пришло ![]() |
|
Создано: 14 декабря 2009 20:12 · Личное сообщение · #17 1 как и написал RSI твой лоадер должен запустить процесс засуспендженным 2 пишешь сразу после CALL QtCore4.load@QLibrary@@QAE_NXZ EBh,FEh (т.е зацикливаешь прогу) 3 Через ResumeThread продолжаешь работу 4 ставишь в своем лоадере задержку секунд 5 5 Стопоришь процесс через SuspendThread 6 Через GetThreadContext получаешь значение EAX (поидее там должен быть адрес куда загрузилась dll) 7 Меняешь EBh,FEh на оригинальные, патчишь длл, продолжаешь работу (ResumeThread) 8 Собственно и всё INVOKE ExitProcess,0 ![]() |
|
Создано: 14 декабря 2009 22:50 · Личное сообщение · #18 |
|
Создано: 15 декабря 2009 04:26 · Личное сообщение · #19 |
![]() |
eXeL@B —› Вопросы новичков —› Как пропатчить DLL-модуль в памяти? |