![]() |
eXeL@B —› Вопросы новичков —› Обход защиты памяти |
Посл.ответ | Сообщение |
|
Создано: 01 мая 2011 22:47 · Поправил: kostay_scr · Личное сообщение · #1 Вообщем стоит на Защита похоже зашита в netc.dll и\или core.dll - сколькол не мучался результата не достиг. Пробовал обходить перехватом api - не получилось. Нопил всё что можно по HBP on acces на интересуещем байте - тоже ничего, хотя доступ к байту прекращался - всё равно. Пожка ope-source, но сурсов netc нет ![]() Сурсы можно посмотреть Там в папке shared лежат решения для msvc. Надеюсь на любую помощь - я уже совсем в тупике) Выкладываю отдельно core.dll и netc.dll: Поменять нужно процедурку проверки чек сумм в client.dll - чтобы один файлик всегда проходил проверку) Вот что я нашел: По адресу этих команд(search for->sequence of commands в ольке) в netc идёт какая то проверка вызываемаяя из разных мест: push ecx xor eax,eax push esi inc ecx ANY 3 mov edx,eax shr edx, 8 P.S. Возможно части dll криптованные. ![]() |
|
Создано: 01 мая 2011 23:29 · Поправил: hlmadip · Личное сообщение · #2 |
|
Создано: 02 мая 2011 00:56 · Поправил: kostay_scr · Личное сообщение · #3 Просто отсоединяет от сервера или если запускать с патченой dll - connection timed out. Да нет в том то и дело что не отправляет, а скорее всего просто перестаёт обрабатывать входящие пакеты - они идут, а длл события не вызывает. DLL может и кажется нормальной, но с какого перепуга она каким то непонятным циклом лезет в память(код) других DLL? ![]() |
|
Создано: 02 мая 2011 13:36 · Личное сообщение · #4 |
|
Создано: 02 мая 2011 16:18 · Личное сообщение · #5 |
|
Создано: 02 мая 2011 16:49 · Личное сообщение · #6 |
|
Создано: 02 мая 2011 17:03 · Поправил: kostay_scr · Личное сообщение · #7 Вот код того цикла если поможет (он лезет в .code других модулей - нашёл с помощью HBP on access): Code:
Что делает этот цикл мозгов у меня понять не хватило ![]() И вот код одной из вызывающих процедур: Code:
Всего цикл вызывают 5 процедур 2Kaimi Перехватывал fopen() в msvcrt90.dll - перехват сам то сработал, но оказался бесполезным потому что интересующий файл после открытия загружался в буфер и проверялась чексумма, и потом из того же буфера использовался - сработало только если бы для проверки чек суммы и загрузки использовались два fopen'a. Спасибо всем за внимание. P.S. У вас тут просто отличный тег для кода ![]() ![]() |
|
Создано: 03 мая 2011 04:01 · Личное сообщение · #8 |
|
Создано: 03 мая 2011 12:24 · Поправил: kostay_scr · Личное сообщение · #9 |
|
Создано: 03 мая 2011 13:16 · Поправил: VodoleY · Личное сообщение · #10 |
|
Создано: 03 мая 2011 14:29 · Поправил: kostay_scr · Личное сообщение · #11 |
|
Создано: 03 мая 2011 20:54 · Личное сообщение · #12 |
|
Создано: 03 мая 2011 22:03 · Личное сообщение · #13 |
|
Создано: 04 мая 2011 00:35 · Поправил: kostay_scr · Личное сообщение · #14 hlmadip Да нужна ![]() HiEndsoft Да если бы я сам ничего не делал Просто уже идеи закончились - просто не представляю что еще можно попробовать: И нопил, и возвращаемое значение подменял, и функции перехватывал - толку ноль ![]() Спасибо за совет - обязательно посмотрю, только не подскажите где? А если защита построена на исключениях - тогда просто поменять права доступа к памяти? Как я сам не додумался - ведь у меня постоянно выскакивало исключение E06D7363 - Пришлось в настройках исключить, а потом я про него и забыл. P.S. Были бы деньги запостил бы в запрос на взлом ![]() ![]() |
|
Создано: 04 мая 2011 07:35 · Личное сообщение · #15 |
|
Создано: 04 мая 2011 11:15 · Поправил: kostay_scr · Личное сообщение · #16 Так я посмотрел страницы памяти - на коде доступ R, а не RE - или должно быть R? Доступ почему то установить не удалось, буду разбираться дальше.. HiEndSoft спасибо за идею! Добавлено: Странно почему то в cmd.exe тоже нигде нет доступа на исполнение, чтобы это значило? Добавлено2: Как я и предполагал в 2 ольке всё отображается нормально - к сожалению доступ к памяти нормальный - RE для кода. ![]() |
|
Создано: 05 мая 2011 21:43 · Личное сообщение · #17 VodoleY пишет: kostay_scr я б сказал что твоя процедура 44095A0 расшифровывает DWORDс резултатом в [esp+4] Как раз таки нет ![]() Интересно место Code:
Напрашивается вывод, что указатели на блоки хранятся в виде таблицы их дескрипторов вида ((Address >> 8) - 0x4010) и могут быть перемешаны в любом порядке. То есть, при si = 0, адрес блока 0x00401000, что совпадает с началом секции кода в большинстве exe-модулей. Но si может быть и 0xC000, адрес будет тогда соответсвовать началу секции кода, например, блокнота (0x01001000). Предельный адрес блока получается 0x01400F00 (при si = 0xFFFF). Таким образом для подсчёта контрольных сумм областей памяти из dll-модулей этот алго не подходит без копирования оттуда в область 0x00401000..0x01400F00. Далее, код Code:
укладывает полученные ворды в таблицу с базой [EBP + 0x14]. Причем esi и есть те самые 2-байтовые дескрипторы... Уже расписался вовсю ![]() Не исключено, что аналогичный в каждой защищаемой dll. Также может быть, что перед вызовом 044022E0 в Code:
меняется константа 0x4010 на соответствующую для dll. ----- IZ.RU ![]() |
|
Создано: 05 мая 2011 23:19 · Поправил: kostay_scr · Личное сообщение · #18 DenCoder Спасибо, спасибо, спасибо! Буду искать VirtualProtect и VirtualAlloc - по моему точно были такие функции в импорте. Проверю с другими адресами - может есть и другой код. Код этот нашёл по HBP на доступ к изменяемым данным. Я уж думал никто ничего не напишет, а тут бац - всё расписали! ![]() ![]() Кстати - какая чек сумма?Стандартная вроде CRC? P.S. Код этот лез в память другой dll - и очевидно всех важных dll в этом процессе, но например msvcrt90 не проверяет. Попробую "полечить" проверку чексуммы))) Правда процедурка данная вызывается аж из пяти мест - так что придёться надеть халат, взять скальпель в руки и за работу)) Теперь, благодаря вам, хотя бы знаю что искать! ![]() |
|
Создано: 05 мая 2011 23:27 · Поправил: DenCoder · Личное сообщение · #19 kostay_scr пишет: Кстати - какая чек сумма?Стандартная вроде CRC? Хз, какая. Надо смотреть алгоритмы, сравнивать... DenCoder пишет: Далее, код Code:
укладывает полученные ворды в таблицу с базой [EBP + 0x14]. Причем esi и есть те самые 2-байтовые дескрипторы... Кстати, в моём анализе ошибка - у esi нет ограничений. Меня сконфузило MOV WORD PTR DS:[EDX+ESI*2],BX. Это просто может означать, что защищаемые dll хранят две таблицы Также, может быть одно из двух: 1) Таблица дескрипторов имеет фиксированный размер; 2) Размер таблицы где-то прописан. ----- IZ.RU ![]() |
|
Создано: 05 мая 2011 23:31 · Поправил: kostay_scr · Личное сообщение · #20 |
|
Создано: 05 мая 2011 23:39 · Поправил: DenCoder · Личное сообщение · #21 kostay_scr пишет: Значит этот код может с успехом проверять всё что ему заблагоразумиться и можно не искать VirtualProtect? Варианты выше 3-мя постами остаются в силе, если на адресе 04402349 не найдёте адресов из защищаемых dll. kostay_scr пишет: P.S. Код этот лез в память другой dll - и очевидно всех важных dll в этом процессе, но например msvcrt90 не проверяет. Тогда не нужен VirtualProtect ![]() UPD. Хотя первой таблицы может и не быть вообще, могут использоваться более сложные механизмы в реализации определения защищаемых областей, но с точки зрения наглядности и экономности более простые ----- IZ.RU ![]() |
|
Создано: 05 мая 2011 23:50 · Личное сообщение · #22 |
|
Создано: 06 мая 2011 00:01 · Личное сообщение · #23 kostay_scr пишет: Буду смотреть куда указывает 04402349 - посмотрим что там... Я имел в виду условный бряк туда поставить, чтоб останов был, если esi указывает на интересующие диапазоны. В ольке 2, кстати, глюки с условными бряками - не всегда срабатывают. Только что проверил - первый раз после xor ebx, ebx бряк с условием ebx == 0 не сработал. Но сработоло сразу, когда убрал и поставил новый не через Conditional, а через Conditional log... ----- IZ.RU ![]() |
|
Создано: 06 мая 2011 00:05 · Поправил: kostay_scr · Личное сообщение · #24 |
|
Создано: 10 мая 2011 08:40 · Поправил: Siarogka1 · Личное сообщение · #25 чтобы тем не плодить напишу здесь, распаковал и пропатчил exe(был запакован Аrmadillo), чтобы при запуске в памяти менял пару байтов в загруженной dll , но при попытке сделать это прога вылетает, в олли показана, что на ту секцию куда хочу писать стоит доступ R. подскажите или функцию или команду, чтобы разрешить запись в тот участок памяти? ![]() |
|
Создано: 10 мая 2011 09:16 · Личное сообщение · #26 |
|
Создано: 10 мая 2011 21:05 · Поправил: Siarogka1 · Личное сообщение · #27 |
![]() |
eXeL@B —› Вопросы новичков —› Обход защиты памяти |