ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > Реверсинг
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Просто очень простой лоадер
  #1  
Старый 21.12.2006, 11:26
Аватар для hidden
hidden
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
Провел на форуме:
5887054

Репутация: 1292


По умолчанию Просто очень простой лоадер

Простейший способ написания лоадера.

Вступление: Вот приобрёл себе карточку (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
 2
6CACE0 EB 33 jmp     short 6CAD15
 &
748366 75 4C jnz     short 7483B4
 2
748366 EB 4C jmp     short 7483B4
Вот он лоадер, полный код
Код:
format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32a.inc'

proc DllEntryPoint hinstDLL, fdwReason, lpvReserved
        stdcall PatchByte, $6CACE0, $EB
        stdcall PatchByte, $748366, $EB
        xor     eax, eax ; 0 - Косяк какой-то произошел, так что можешь выгружать
        ret
endp

proc PatchByte, addr ,dta
        invoke  VirtualProtect, [addr], 1, PAGE_EXECUTE_READWRITE, esp, eax
        mov     al, byte[dta]
        mov     ebx, [addr]
        mov     byte[ebx], al
        pop     eax
        invoke  VirtualProtect, [addr], 1, eax, esp, eax
        pop     eax
        ret
endp

data import
  library KERNEL32,'KERNEL32.DLL'
  import KERNEL32,VirtualProtect,'VirtualProtect'
end data

data fixups
end data
Думаю эта программа в пояснении не нуждается
--------
Кстати лоадер сохранять под именем "Custom.asm"

Ещё там какая-то чушь с сохранением, какой формат не выберешь, всё-равно сохраняется в .ncf, зато когда его переоткроешь, можно экспортировать в любой другой, например в .cap

Последний раз редактировалось hidden; 21.12.2006 в 20:27..
 
Ответить с цитированием

  #2  
Старый 21.12.2006, 13:16
Аватар для _Great_
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Ниче так, молодец, лови плюсик (не один, а целых 7 %))

Цитата:
Чтоб не писать его на модификацию всего одного байта, я добавил туда и обход назойливого окна с благодарностью за использование приала, появляющегося во время закрытия программы, так что теперь модифицируются не 1, а 2 байта
да, железная логика
 
Ответить с цитированием

Продолжение...
  #3  
Старый 22.12.2006, 08:33
Аватар для hidden
hidden
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
Провел на форуме:
5887054

Репутация: 1292


По умолчанию Продолжение...

И так в процессе использования я наткнулся ещё на одну неудобную особенность, количество захватываемых пакетов не может превышать 20k, но ведь это не дело, нужно больше, значит надо исправить.

Что править: На сколько я понял, это ограничение не относится к триальности программы, а предусмотрено при разработке, так-как она при старте сразу олакейтит требуемый буфер, так что ставить запредельные размеры крайне не желательно, особенно если не слишком много оперативной памяти. Учитывая то, что это ограничение не относится к триальности, разработчики не старались его как-то защищать(а жаль, было-бы проще), они просто вписали его в поле MaxValue, в настройках элемента формы(программа была написана в Delphi). Немножко познакомимся с форматом форм Delphi, на первый взгляд, смешенный текст и бинарный код немного отпугивает, но абсолютно ничего сложного там нет, просто последовательно записанные имена параметров и их значения, разберём по подробнее...

Немного о формате форм в Delphi:
Код:
00 00 0B 54 45 6C 53 70 ? 69 6E 45 64 69 74 0E 73  TElSpinEdit s
70 69 6E 4D 61 78 50 61 ? 63 6B 65 74 73 04 4C 65  pinMaxPackets Le
66 74 03 A0 01 03 54 6F ? 70 02 20 05 57 69 64 74  ft а  Top   Widt
68 02 71 06 48 65 69 67 ? 68 74 02 18 06 43 75 72  h q Height   Cur
73 6F 72 07 07 63 72 49 ? 42 65 61 6D 21 56 65 72  sorcrIBeam!Ver
74 53 63 72 6F 6C 6C 42 ? 61 72 53 74 79 6C 65 73  tScrollBarStyles
2E 53 68 6F 77 54 72 61 ? 63 6B 48 69 6E 74 08 19  .ShowTrackHint  
56 65 72 74 53 63 72 6F ? 6C 6C 42 61 72 53 74 79  VertScrollBarSty
6C 65 73 2E 57 69 64 74 ? 68 02 12 1E 56 65 72 74  les.Width   Vert
53 63 72 6F 6C 6C 42 61 ? 72 53 74 79 6C 65 73 2E  ScrollBarStyles.
42 75 74 74 6F 6E 53 69 ? 7A 65 02 12 21 48 6F 72  ButtonSize  !Hor
7A 53 63 72 6F 6C 6C 42 ? 61 72 53 74 79 6C 65 73  zScrollBarStyles
2E 53 68 6F 77 54 72 61 ? 63 6B 48 69 6E 74 08 19  .ShowTrackHint  
48 6F 72 7A 53 63 72 6F ? 6C 6C 42 61 72 53 74 79  HorzScrollBarSty
6C 65 73 2E 57 69 64 74 ? 68 02 12 1E 48 6F 72 7A  les.Width   Horz
53 63 72 6F 6C 6C 42 61 ? 72 53 74 79 6C 65 73 2E  ScrollBarStyles.
42 75 74 74 6F 6E 53 69 ? 7A 65 02 12 13 55 73 65  ButtonSize   Use
43 75 73 74 6F 6D 53 63 ? 72 6F 6C 6C 42 61 72 73  CustomScrollBars
20 20 20 20 20 20 20 20 ? 05 56 61 6C 75 65 03 D0           Value ?
07 08 4D 61 78 56 61 6C ? 75 65 03 20 4E 08 4D 69   MaxValue  N Mi
6E 56 61 6C 75 65 03 D0 ? 07 20 20 20 20 20 20 20  nValue ?
49 6E 63 72 65 6D 65 6E ? 74 03 E8 03 0E 4C 61 72  Increment ш  Lar
67 65 49 6E 63 72 65 6D ? 65 6E 74 02 0A 20 20 20  geIncrement 
20 20 20 20 20 41 6C 69 ? 67 6E 6D 65 6E 74 07 0D       Alignment
74 61 4C 65 66 74 4A 75 ? 73 74 69 66 79 20 20 20  taLeftJustify
54 6F 70 4D 61 72 67 69 ? 6E 02 02 0B 42 6F 72 64  TopMargin  Bord
65 72 53 69 64 65 73 0B ? 07 65 62 73 4C 65 66 74  erSides ebsLeft
08 65 62 73 52 69 67 68 ? 74 06 65 62 73 54 6F 70   ebsRight ebsTop
20 20 20 20 20 20 20 20 ? 65 62 73 42 6F 74 74 6F          ebsBotto
6D 00 0B 54 72 61 6E 73 ? 70 61 72 65 6E 74 08 0B  m Transparent 
42 6F 72 64 65 72 53 74 ? 79 6C 65 07 08 62 73 53  BorderStyle bsS
69 6E 67 6C 65 05 43 74 ? 6C 33 44 20 20 20 20 20  ingle Ctl3D
Это именно тот фрагмент, который нужно подправить, нашел я его по уникальному имени элемента формы, и классу окна, название которого можно посмотреть воспользуюсь утилитой "Spy++", входящей в комплект Visual Studio или SDK. И так, сразу перед названием класса, идёт непонятный символ, это на самом деле даже не символ, а байт указывающий, сколько следующих байт образуют строку, в данном случае параметр(название класса), смотрим в HEX'e это 0E(14), отсчитываем 14 байт и попадаем на значение, так-как основное значение это имя, а оно может быть только строка, то первый байт это её длина. Идём дальше, отсчитываем её длину, и попадаем на 04(4), это длина следующего параметра, дальше его имя("Left"), тип(03 - word [номера типов кажется можно посмотреть или в system.pas или в windows.pas]), значение(A0 01 - 416) и дальше следующий параметр. Вот так всё просто...

Исправление: Очевидно нужно исправить параметр "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
6E 56 61 6C 75 65 03 D0 ? 07 20 20 20 20 20 20 20  nValue ?
Код:
07 08 4D 61 78 56 61 6C ? 75 65 04 20 4E 08 4D 06   MaxValue  N M 
58 65 69 67 75 68 74 D0 ? 07 20 20 20 20 20 20 20  Height ?
Заключение: Я не затирал байты попавшие в новый параметр, потому, что учится то, что этот параметр состоит из 4х байт отличных от нулей, то какие бы они не были, это значение будет больше 16M, и если поставить его в 16M, програма выделит буффер в ~450Мб и будет страшно тормозить, так что больше и не нужно.

Дополненный патчер:
Код:
format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32a.inc'

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
        stdcall BPatch, $6CACE0, $EB ; Теперь пакеты не через один
        stdcall BPatch, $748366, $EB ; И нет больше этого назойлевого окна
        stdcall BPatch, $9DA3A4, $04 ; Тип Integer
        stdcall BPatch, $9DA3A9, $06 ; Длина нового параметра
        stdcall DPatch, $9DA3AA, 'Heig' ; Первая часть нового параметра
        stdcall WPatch, $9DA3AE, 'ht' ; и его оконцовка
        xor     eax, eax ; 0 - Типа косяк какой-то произошел, так что можешь выгружать
        ret
endp

proc BPatch, addr, dta
        invoke  VirtualProtect, [addr], 1, PAGE_EXECUTE_READWRITE, esp, eax
        mov     al, byte[dta]
        mov     ebx, [addr]
        mov     byte[ebx], al
        pop     eax
        invoke  VirtualProtect, [addr], 1, eax, esp, eax
        pop     eax
        ret
endp

proc WPatch, addr, dta
        invoke  VirtualProtect, [addr], 2, PAGE_EXECUTE_READWRITE, esp, eax
        mov     ax, word[dta]
        mov     ebx, [addr]
        mov     word[ebx], ax
        pop     eax
        invoke  VirtualProtect, [addr], 2, eax, esp, eax
        pop     eax
        ret
endp

proc DPatch, addr, dta
        invoke  VirtualProtect, [addr], 4, PAGE_EXECUTE_READWRITE, esp, eax
        mov     eax, [dta]
        mov     ebx, [addr]
        mov     [ebx], eax
        pop     eax
        invoke  VirtualProtect, [addr], 4, eax, esp, eax
        pop     eax
        ret
endp

data import
  library KERNEL32,'KERNEL32.DLL'
  import KERNEL32,VirtualProtect,'VirtualProtect'
end data

data fixups
end data
Вот и линк на эту(5.5.532) версию: http://www.rapidshare.ru/298921 Перезалил (2 Июня, 2007)
Пароль: ThereIs[No]AnyPhoto;)

ЗЫ А ведь ни на одном я кряка для версии новее 5.3 я не нашел, хотя программа довольно полезная и популярная :\

Последний раз редактировалось hidden; 02.06.2007 в 23:02..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Народ, как взломать php.sbp чат? Даже не взломать, а просто наказать админа floxton Чаты 0 13.01.2005 23:46
Всё просто, но у меня, балбеса, не получается Вертлявый Чаты 0 24.11.2004 16:08
Небольшой отрывок от книги T-REX Болталка 0 19.10.2004 05:19



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ