![]() |
Просто очень простой лоадер
Простейший способ написания лоадера.
Вступление: Вот приобрёл себе карточку (Netgear WG511T) WiFi с поддержкой Injection (теперь буду снифать все встречающиеся на пути безпроводные сети), несмотря на то что в линухе есть её поддержка, согласитесь в винде горазно удобнее, не дело все не в этом, а в проге которая снифает этот трафик, прога называется "CommView Wifi", дело в том что снифает она не все пакеты, пока не приобретёшь лицензионную, так я и побежал покупать прогу для карточки, пользовательская цена на которую в 4 раза больше цены самой карточки. Действия: Времени у меня было не много, так что я закинул её в ольку, а она говорит что прога запакована, ну я F9, после какого-то исключения Shift+F9 и вот она запустилась. Дальше нахожу первую попавшеюся функцию, находящуюся в самой программе, запускаю OllyDump, и указываю её в качестве Ентри поинт, дамплю и закидую в IDA. Посик багов: Вспоминаю, что же мне в ней не нравилось, ах да вместо некоторых пакетов она пишет "ОЦЕНОЧНАЯ ВЕРСИЯ ОТОБРАЖАЕТ ТОЛЬКО ЧАСТЬ СОБРАННЫХ ПАКЕТОВ", эта строка находится в языковом файле под идентификатором "S_HALF_PACKETS", вот я и нахожу в сдампленом файле через IDA эту строку, нажимаю X (XRef), единственный XRef ведёт на занесение в edx адреса этой строки с последующим вызовом функции, а пару инструкций вверх стоит сравнение ячейки памяти с нулём и в случае не совпадения обход этого места другим путём, ну я сразу перехожу в ольку меняю jne на jmp и о чудо, я вижу абсолютно все пакеты, если поотлавливать занесение значений в эту переменную, думаю можно было бы и выйти на какую-нибудь общую функцию проверки на триал, а может и нет, но мне и этого вполне достаточно, и я решил писать лоадер. Чтоб не писать его на модификацию всего одного байта, я добавил туда и обход назойливого окна с благодарностью за использование приала, появляющегося во время закрытия программы, так что теперь модифицируются не 1, а 2 байта Кодерство: Залез в справку в надежде найти ещё чего-нибудь что они заблокировали, чтоб исправить, и наткнулся на интерфейс подключаемых моделей. Если в программу модно подключить dll модули, то проблемы с лоадерами моментально отпадают, а тут ещё и интерфейс представлен элементарнейший, с примерами на С++ и Delphi, но достаточно уже того, что она загрузит этут dll(причём сама уже будет в распакованном и абсолютно незащищенном виде), а потом уже будет проверять, подходит она ей или нет, а dll загрузится, сделает что надо, и скажет что что-то не получилось, так что программа её сразу-же и выгрузит, даже килобайта памяти не потратится. Задача лоадера: Заменить Код:
6CACE0 75 33 jnz short 6CAD15Код:
format PE GUI 4.0 DLL-------- Кстати лоадер сохранять под именем "Custom.asm" Ещё там какая-то чушь с сохранением, какой формат не выберешь, всё-равно сохраняется в .ncf, зато когда его переоткроешь, можно экспортировать в любой другой, например в .cap |
Ниче так, молодец, лови плюсик (не один, а целых 7 %)) :)
Цитата:
|
Продолжение...
И так в процессе использования я наткнулся ещё на одну неудобную особенность, количество захватываемых пакетов не может превышать 20k, но ведь это не дело, нужно больше, значит надо исправить.
Что править: На сколько я понял, это ограничение не относится к триальности программы, а предусмотрено при разработке, так-как она при старте сразу олакейтит требуемый буфер, так что ставить запредельные размеры крайне не желательно, особенно если не слишком много оперативной памяти. Учитывая то, что это ограничение не относится к триальности, разработчики не старались его как-то защищать(а жаль, было-бы проще), они просто вписали его в поле MaxValue, в настройках элемента формы(программа была написана в Delphi). Немножко познакомимся с форматом форм Delphi, на первый взгляд, смешенный текст и бинарный код немного отпугивает, но абсолютно ничего сложного там нет, просто последовательно записанные имена параметров и их значения, разберём по подробнее... Немного о формате форм в Delphi: Код:
00 00 0B 54 45 6C 53 70 ? 69 6E 45 64 69 74 0E 73 TElSpinEdit sИсправление: Очевидно нужно исправить параметр "MaxValue", который имеет тип word и значение 20 4E(20к), в чём проблема?, а в том что в переменной word может содержатся значение не превышающее 65535, т.е. даже если я запишу туда FF FF, я увеличу лимит только до 64к, тогда я решил править структуру... Чтобы не привести к краху создания окна, нужно чтоб структура оставалась последовательная, т.е. длина параметра, имя параметра, длина/тип значения и само значение, так и сделаем... Я указываю вместо word(03), integer(04) получается значение теперь занимает не 2, а 4 байта, также произошло нарушение структуры, приводящие к краху создания окна, чтоб этого избежать после значения должен идти параметр, занимающий оставшееся место, на параметре который я затёр, а затёр я "MinValue", это не слишком важный параметр, хотя если бы даже там стоял важный параметр, можно былоб переместить его на другое место и затереть не важный. И так "MinValue" занимал 8 байт -2, остаётся 6, какой параметр занимает 6 байт?, мне сразу пришел в голову "Height", так что смотрим результат. Код:
07 08 4D 61 78 56 61 6C ? 75 65 03 20 4E 08 4D 69 MaxValue N MiКод:
07 08 4D 61 78 56 61 6C ? 75 65 04 20 4E 08 4D 06 MaxValue N M Дополненный патчер: Код:
format PE GUI 4.0 DLLПароль: ThereIs[No]AnyPhoto;) ЗЫ А ведь ни на одном я кряка для версии новее 5.3 я не нашел, хотя программа довольно полезная и популярная :\ |
| Время: 07:26 |