![]() |
eXeL@B —› Вопросы новичков —› Изменение длл |
Посл.ответ | Сообщение |
|
Создано: 18 апреля 2008 12:15 · Личное сообщение · #1 Драсте. Сейчас долблюсь над одной прогой - error smart (версия 2.7.2861.900). Защита там не очень и сложная но я наткнулся на другую проблему. Мне надо изменить длл . В файле все изменил , но в памяти когда загружается дллка код остается первоначальным. Как бороться с этой заразой? Прогу не получается выставить- огромная скотина. ![]() |
|
Создано: 18 апреля 2008 13:12 · Поправил: HandMill · Личное сообщение · #2 Лови на LoadLibrary (если этим методом происходит загрузка) из exe (тоесть вообще патчи exe, а не dll в файле, а сам exe уже будет патчить dll в памяти). Если же загрузка dll статическая - то патчи по импорту(тоесть базовая точка будет любая функция из таблицы импорта dll). Потом отсчитывай от места загрузки / адреса из таблицы импорта адрес того что ты там собираешься патчить. Тоесть идея состоит в том, что бы пропатчить ехе, а он уже в процессе будет изменять код dll. Ну и вот приблизительно что у тебя может получится: call LoadLibraryA __exe: jmp patch_place ; передаём управление на наш патч xxxxxxxx patch_place: mov __exe, ORIGINAL_CODE ; восстанавливаем в ехе оригинальный код add eax, PATCH_ADDRESS ; получаем адрес места где собираемся вносить изменения mov dword ptr ds:[eax], PATCH_DATA ; патчим нужное место столько раз, сколько тебе нужно mov dword ptr ds:[eax+4], PATCH_DATA ; патчим нужное место столько раз, сколько тебе нужно sub eax, PATCH_ADDRESS ; восстанавливаем содержимое регистра eax jmp __exe ; передаём управление на оригинальный код Быть может это изврат, но таким вот образом можно патчить и пакованные dll (например накрытые аспром) причём абсолютно без распаковки и в обход всяких там механизмов антиотладки(ессесно не крутых). З.Ы.: а луче для новичка - сварганить search and replace patch - так долго думать не прийдётся пропатчилось оно или нет(лог покажет) ----- все багрепорты - в личные сообщения ![]() |
|
Создано: 18 апреля 2008 13:21 · Личное сообщение · #3 pycha пишет: В файле все изменил , но в памяти когда загружается дллка код остается первоначальным. Варианты: 1. Скорее всего ты промахнулся в файле. Менял что-то где-то не там. 2. Ты уверен, что в памяти осталось как было? Может быть это только отладчик так показывает. Проверь наверняка. В ольки грохни файл(ы) анализа (*.udd). 3. Теоретически код может "перезаписываться" по ходу выполнения программы. Проверить это просто - если секция кода НЕ имеет атрибут записи (как обычно), значит такого быть не может. 4. Ты уверен, что файл пропатчил вообще? Проверь в Hiew'e или каком-нибудь дизасме. ----- Всем привет, я вернулся ![]() |
|
Создано: 18 апреля 2008 22:01 · Поправил: pycha · Личное сообщение · #4 В файле я точно не промазал в Hdasm показывает что все пропатчено а адреса в файле точно такие как и в памяти . Ради чистоты эксперимента переимновал длл и переместил в другую папку. В памяти она всеравно была ( хоть и в папке не создалась) Вот часть кода проги где идет вызов длл. .text:0041A17E mov eax, [esp+30h] .text:0041A182 push eax .text:0041A183 lea ecx, [esp+18h] .вызов на длл text:0041A187 call ds:?Compare@?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@A TL@@QBEHPBD@Z ; ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>::Comp are(char const *) .text:0041A18D test eax, eax .text:0041A18F jnz short loc_41A1D3 .text:0041A191 push ecx .text:0041A192 lea edx, [esp+18h] .text:0041A196 mov ecx, esp .text:0041A198 mov [esp+24h], esp .text:0041A19C push edx .text:0041A19D call ds:??0?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@QA E@ABV01@@Z ; ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>::CStr ingT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>(CStringT<char, StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>::CStringT<char,StrTraitM FC_DLL<char,ATL::ChTraitsCRT<char>>> const &) .text:0041A1A3 push 1 .text:0041A1A5 .text:0041A1A5 loc_41A1A5: ; CODE XREF: .text:0041A12Aj .text:0041A1A5 ; .text:0041A153j ... .text:0041A1A5 call sub_41A3B0 .text:0041A1AA push 0 .text:0041A1AC push 0 .text:0041A1AE push offset aApplicationReg ; "Application registered!" .text:0041A1B3 call ?AfxMessageBox@@YGHPBDII@Z ; AfxMessageBox(char const *,uint,uint) .text:0041A1B8 mov ecx, dword_455BCC .text:0041A1BE mov eax, [ecx] .text:0041A1C0 mov edx, [ecx+1020h] .text:0041A1C6 mov eax, [eax+164h] .text:0041A1CC Как мне новичку легче будет найти нужный код в проге? HandMill З.Ы.: а луче для новичка - сварганить search and replace patch - так долго думать не прийдётся пропатчилось оно или нет(лог покажет) - я смысл вродебы понял , переспрошу - попытатся найти индентичный код в ехе и его там изменить? ![]() |
|
Создано: 21 апреля 2008 22:49 · Личное сообщение · #5 |
|
Создано: 22 апреля 2008 10:08 · Личное сообщение · #6 |
|
Создано: 22 апреля 2008 14:15 · Личное сообщение · #7 |
|
Создано: 22 апреля 2008 19:07 · Личное сообщение · #8 |
|
Создано: 23 апреля 2008 08:25 · Личное сообщение · #9 |
|
Создано: 23 апреля 2008 10:29 · Личное сообщение · #10 |
|
Создано: 23 апреля 2008 13:31 · Личное сообщение · #11 |
|
Создано: 23 апреля 2008 16:06 · Личное сообщение · #12 pycha пишет: Или же я чтото не доглядел Уже лучше. Начинаешь соображать ![]() На будущее, чтоб разговор складывался проще, ссылку на жертву и конкретные действия (патчил файл-такой-то по смещению такому-то). pycha пишет: если просто меняеш прыжок то выкидывает мэсаг что прога зарегана, но прога так и остается не зарегистрированой Давай думай. Вызывается func1, ты меняешь результат после выхода, а прога по прежнему ограничена. Если меняешь значение в func1, то всё ок. Что это означает? ----- Всем привет, я вернулся ![]() |
|
Создано: 24 апреля 2008 01:22 · Поправил: pycha · Личное сообщение · #13 Вот именно вся проверка (как я понимаю) идет в длл файлах и если я не ошибаюсь то все системные .Изменение длл нужного эфекта не дало . Прогу иследую дальше. Не выставлял прогу ибо папка с установленой прогой весит 32 метра , сегодня наконец-таки (наконецто :s6 ![]() ![]() |
|
Создано: 24 апреля 2008 08:41 · Поправил: Rush · Личное сообщение · #14 pycha Ничего там менять не надо в системных длл. Проверка примитивная, можешь для самообучения кейген намутить (навскидку там все просто). Вот здесь смотри регистр eax .text:0041A103 mov eax, [esp-0EC0h+RegCode] - серийник на имя .text:0041A107 push eax .text:0041A108 lea ecx, [esp-0EBCh+RegCode2] .text:0041A10C call ds:MFC80_1482 .text:0041A112 test eax, eax .text:0041A114 jnz short loc_41A12C Где-то выше генератор серийника от имени. Интересно, с чего ты решил копаться в библе. Если не можешь по названию сообразить что за библа, то хотя бы в гугле поищи про нее по названию. Тогда понятно будет - копаться в самописной библе, в которой возможно находится защита или ты нарвался на одну из общеизвестных системных библиотек. Теоретически хитрый программер может зашить проверку в функи системных длл, но такого, по крайней мере, мне не встречалось. R.$. Посмотрел повнимательнее - там по ходу дела 3 варианта серийника (триал, полный и еще что-то) судя по количеству констант, от которых он генерится и количетсву проверок. До кучи есть еще интересное место: .text:0040D07D mov eax, [esp+24h+arg_0] .text:0040D081 setnle bl .text:0040D084 test eax, eax - вот здесь eax должно быть больше 2 .text:0040D086 jnz short loc_40D0BA В этой функе проверяется триал и т.д. Эта хрень запускается из многих мест в проге. Вот тебе сколько задачек - разбирайся, отламывай, кейгень и т.д. ![]() |
|
Создано: 24 апреля 2008 11:01 · Поправил: pycha · Личное сообщение · #15 Я просто увидел что в msvcr80.dll для того чтобы прога выкинула сообщение что она зарегана (чтобы не сработал проыжок 0041A18F ) в функции по адресу 78144В20 должен обнулятся еах, что собственно я хотел и сделать. Я всех системных длл не знаю, а темболее клон лежал в подпапке проги вот я и подумал что все происходит в нем PS Так и не пойму зачем он там ![]() |
|
Создано: 24 апреля 2008 12:36 · Личное сообщение · #16 |
![]() |
eXeL@B —› Вопросы новичков —› Изменение длл |