xPoison:
//{{HEX}} прислал мне эту месагу как вариант статьи которая в ближайшее время появится на нескольких русских Security сайтах. Я заранее откомментировал статью и сделал апдейт программы о которой пойдет речь. Для читателей не особенно разбирающихся в кодинге и взломе программ, где то ближе к концу текста автор высказал свои мнения по поводу "взломов" и свое отношение к журналу "Хакер".

xSHaRewareZ. Взлом xSHaReZ 2.0

Инструменты: Softice, WinDowse, Unpecompact, ProcDump, мозги (Highly recommended)
Сложность: сложно

Так в чем жеж там дело. Прога иногда выдает месагу о том что это демка + не дает запускать более 5 потоков сразу. Ну и Zero флаг ей в руки. Для начала распакуем ее прогой UnPecompact, чтобы мне было удобно листинги кода брать :). Ваще-то и без этого можно. 

Первое что мы будем искать так это место где прога считывает данные из spinedit в котором указано число потоков. Ставить bpx на всякие там обыкновенные функции чтения из окна тут не покатит. hmemcpy тоже отпадает. В этой проге все делается через сообщения. Т.е. данные передаются и отсылаются через sendmessage.

xPoison >> Надо же, не ожидал я от себя таких извратов %)

Делать будем так: поставим число поток равным 20, перейдем во вкладку где кнопка scan, а потом поставим bmsg на handle этого spinedit с количеством потоков. 
Просто bmsg xxx, где xxx - handle этого spinedit.  Теперь жмем Scan. Попадаем в айс где-то в глубине какого-то кода. Жать f12 придется очень много раз. В конце концов мы окажемся на выходе из
процедуры EnableWindow. Это значит что здесь деактивируется spinedit на момент сканирования.

xPoison >> В прилагаемом в конце статьи исходнике видно, что SpinEdit отключается в самую последнюю очередь, хотя maybe Delphi произвольно меняет последовательность кода во время компиляции или maybe я в асме плохо понимаю. 
xPoison <<

Жмем F12 пока. Не окажемся тут:

:004E2707 B80A000000 mov eax, 0000000A
:004E270C E86F05F2FF call 00402C80
:004E2711 8BF0 mov esi, eax
:004E2713 83FE09 cmp esi, 00000009 <- Пока меньше 9 запусков ничо не выводим
:004E2716 7C50 jl 004E2768 <- когда прыгаем - месаги нету

Это место, где выводится достающая месага. Просто jmp вместо jl. 
Жмем F5. Мы опять попадем в айс где-то в глубине какого-то кода, опять
немеряно раз f12. Рано или поздно мы оказываемся тут:

:004E293C E84BD9F7FF call 0046028C
:004E2941 0FBFC0 movsx eax, ax <-в Eax находится число потоков
:004E2944 A3C8914E00 mov dword ptr [004E91C8], eax <- вот это бред

xPoison >> это не бред =)

:004E2949 A1C8914E00 mov eax, dword ptr [004E91C8] <- два раза туда-сюда

xPoison >> это Rnd - рандомайзер, генерирует случайное число от 1 до 10 =)

:004E294E 3B05C4914E00 cmp eax, dword ptr [004E91C4] <- в 004E91C4 находится 5
:004E2954 760A jbe 004E2960 <- прыжок если >=5

xPoison >> Куда прыжок то? В сурце единственный "if -> then" выводит сообщение о ограничениях демо версии если рандомайзер сгенерил число больше 9-ти. 
xPoison <<

Тут тоже делаем 
:004E2954 jmp 004E2960

А теперь последнее, что осталось сломать так это возвращение
значения числа потоков (прога ставит 5). Если бы прогу писали без извращений,

xPoison >> автор (xPoison) вообще маньяк похоже =)

то значение ставилось бы процедурой setwindowtexta или setdlgitemtexta, но тут это не катит. Тут все сделано на виндовских месагах (windows messages). Т.е. xPoison сам определил сообщения для изменения текста в spinedit, у какой подлый... 🙂

xPoison >> threads := 5;
xPoison >> udThreadCount.Position := threads;
xPoison >> аж сам запутался от своей подлости =)) threads - внутренняя переменная хранящая количество рабочих потоков, udThreadCount - отображает (!!! не регулирует, а просто отображает) в Демо версии это количество потоков.
xPoison >> Вся фишка в том (Дельфи кодеры меня поймут), что автор не очень хорошо знаком с набором стандартных компонентов предоставляемых Delphi. SpinEdit-a как таковово в Delphi не существует. Есть TUpDown который можно привязать например к TEdit и нажимая на две маленькие стрелки вверх-вниз менять текст (точнее цифры) в TEdit. Так же TUpDown имеет полезное свойство Position, которое внутренне (т.е. не визуально) хранит значение, которое ассоциируется с TEdit, этим свойством я и пользуюсь почти всегда.
xPoison <<

Ну ничего. Естественно хочется поставить bpx на sendmessagea. Но ведь эту процедуру выполняет куча приложений + нам нужно отловить только сообщение на установку текста. Будем делать так: сначала прицепимся на нажатие клавиши Scan т.е. поставим bmsg xxx wm_lbuttondown (xxx - handle для кнопки Scan). Найдем процедуру которая соответствует дельфовому OnClick. Потом поставим bpx на начало этой процедуры и снова потом нажмем Scan. Зачем нам именно эта процедура? А затем, что текст меняется тока при нажатии Scan. После того как у нас есть адрес начала этой процедуры мы после нажатия на кнопку Scan попадем в айс как раз в ее начало. Теперь можно смело ставить bpx на sendmessagea и нажимая F10 идти по коду запоминая, где в этой процедуре "OnClick" сработает брейкпоинт. Потом найдя место вызова нужно поставить брейкпоинт как раз перед самим сall sendmessagea чтобы проверить какому элементу будет отсылаться сообщение. Одним из параметров для sendmessagea является handle окна, которому отсылается сообщение. Ну и еще перед этим sendmessagea должно передаваться само значение которое будет присвоено spinedit. Вот такой фигней я страдал. А теперь о том как жеж оно в жизни:
Начало процедуры "OnClick" будет по адресу 4E25EC. Sendmessagea сработает в Call по адресу 4E2702. Но очень интересно выглядит код перед этим Call:

:004E26EB C705C8914E0005000000 mov dword ptr [004E91C8], 00000005 <- Интересно а зачем тут 5?

xPoison >> а х3, чисто случайно оказалось =)

:004E26F5 8B8770030000 mov eax, dword ptr [edi+00000370]
:004E26FB 668B15C8914E00 mov dx, word ptr [004E91C8]
:004E2702 E8A9DCF7FF call 004603B0 <- а тут Sendmessage

Если зайти в call 004603B0 то полистав код можно увидеть такую штуку.

:00460451 50 push eax <-в Eax ща 00000005, к чему бы это?
:00460452 6A00 push 00000000
:00460454 6867040000 push 00000467
:00460459 8BC3 mov eax, ebx
:0046045B E81057FDFF call 00435B70
:00460460 50 push eax <-а тут в Eax загоняется Handle
:00460461 E86E7BFAFF Call user32!SendMessageA

Вот такая фигня. Значит чтобы не меняло на пятерку надо сделать 
:004E26EB jmp 004E2707 и все.

xPoison >> все эти джампы для меня честно говоря темный лес =) Но если почитать код, то в принципе, не устанавливая переменной threads 5, мы получим число, которое Дельфи в runtime дает всем неинициализированным переменным, imho (серьезно я таких деталей не знаю) равно 0.
xPoison <<

Потом я еще у него в проге глюк нашел. Перед 
:00460461 E86E7BFAFF Call user32!SendMessageA
есть такой код:

:004603CA 668BBB04020000 mov di, word ptr [ebx+00000204] 
:004603D1 663BF7 cmp si, di <- опять же проверка записано ли 5 в spinedit

xPoison >> я читаю и потихоньку осознаю, что у меня 25% кода делают всякие проверки =)

:004603D4 0F848C000000 je 00460466 - если равны значит менять не надо.

Но в этом месте конкретный глюк: оно работает через раз. Т.е. в первый раз я загоняю 15, жму скан оно в этом месте перепрыгивает и не меняет, во второй раз жму скан оно тут не прыгает и меняет. Эх мля x-релиз. X - наверно значит хреновый. 🙂

xPoison >> Тут уж я не удержусь и выскажу некоторые соображения, по поводу "Х", по поводу "крекеров", ну и естсно по поводу кодинга =) Хочу предупредить, что это всего _мои_ лишь "соображения", они распространяются "As is", никаких гарантий в "случае потерянной или не полученной прибыли" я не даю =) Все разложим по полочкам, от пункта к пункту.

1) По поводу "Х": я заметил, что тема актуальности журнала как была, так и остается животрепещущей, и тревожит сознание некоторого количества особо "продвинутых" "перцев", регулярно высказывающих свои замечания по поводу контента, оформления, etc. самого издания. Мне не хотелось бы спорить, особенно в свете последних публикаций на сайте поддержки - www.xakep.ru, но imho Xakep отличное коммерческое издание, которое,
в свою очередь неплохо помогает начинающим ориентироваться в тех ситуациях, которые возникают на рынке компьютерных технологий в данный момент. Я регулярно вижу молодых людей поступающих "после универа" на какую либо работу, и не умеющих "жать батоны" ни в чем, кроме, опять же коммерчески удачной тулзенки Microsoft Word. Я смотрю и плачу =) компьютерная неграмотность в наше время оборачивается достаточно большими убытками, скажу проще, люди жмущие батоны в МС Ворд реально теряют бабло (баки, президенты, зеленые бумажки, нозови как хочешь). Было бы очень приятно, если бы все читатели "Х" попрошествии года-двух становились бы сертифицированными сисадминами =) Но есственно
это не реально. Большинство из них станут бухгалтерами, юристами, экономистами... Но, в свою очередь, любой перец почитавший "Х" 
в любой момент забабахает отличный отчет для начальства в "Excel" как минимум (это именно та фишка за которую глупые дядьки 
платят деньги .. другим глупым дядькам), я в этом просто не сомневаюсь. Скажу больше, в данный момент журнал планирует сделать
цикл статей по конкретному (\m/) кодингу на Delphi, C++ (Win, Linux). A это открывает внимательным и талантливым читателям такие 
возможности по зарабатыванию "этих приевшихся буказоидов", о которых даже не мечтают консервативные преподаватели их школ 
и универов. 

Ну-у-у , э-э-э, о чем это мы... Да, хотелось бы
отметить, что xSharez, как и автор программы не имеют почти никакого отношения к журналу
в данный момент, но в тоже время, такие критические замечания насчет "х-релиз" и "х-значит хреновый" абсолютно бессмысленны.
Складывается простое впечатление, что автор оригинального текста пытается заработать определенную репутацию (реально он ее
и заработал, в течении предыдущих 2 дней я с довольно
неприятным ощущением отвечал на приваты в IRC типа "гыгы, твой хШарез
крекнули, что будешь делать ламер?"). Что я буду делать, я
объясню в следующем пункте...

2) По поводу "крекера": Собственно отметить тут нечего =) Крек, как таковой не особенно удался. Он и не мог быть удачным, я несколько
раз говорил интересующимся, что для Демо и Коммерческой версии просто используются 2 разных .ехе файла.
Что тут ломать я уже даже не знаю =) Вообще, если мыслить отвлеченно, Крек - это великая фишка, Крек (хех, с большой буквы) это культ =). Он делает нам доступными
такие проги как MS Windows, Office, Borland Delphi, The Bat (млин, у тебя что mIRC не крекнутый? ), я боюсь даже предположить,
в какой жоп# мы бы оказались без первоклассных крекеров. Мы можем без особых (как правило 30-ти дневных ограничений)
заморочек юзать в России любую приличную прогу и похихикивать над америкосами тратящими на эти вещи бабло, сравнимое
со стоимостью их домашних писюков. Но с другой стороны, если прогу делает наш, русский кодер... Делает специально
(вообще то в документашке он пишет, что прога предназначена строго для администрирования =)... специально
для взлома криво настроенных писюков с шарами? Автор (xPoison - перехожу на изложение в 3-м или 2-м лице, с литературой неважнецки
в школе было =) делает минимальные ограничения, только для того, чтобы "перцы" просто не переломали весь русский инет
(в смысле провайдеров), чтобы прога не валялась на всех варезных сайтах (с америкосов в любом случае нужно брать деньги
за такое удовольствие) и... ???
Уфф... SideX перекинулся со мной парой слов на эту тему в IRC : "02:30 <SideX> ну лана забей, всё равно не серьезно такой софт ломать =)".
Я тоже так думаю =)

Чуть позже мы поболтали в ИРЦке с Хексом ({[HEX]}- ом, крекером), я ему кинул кусок исходника, мы поизучали =)
В общем к единому мнению так и не пришли, в конце беседы я заметил пару лишних строк в коде, отметил пару мелких недочетов и
углубился в дебаг (ушел в оффлайн). Пара часов и новый релиз был уже на сайте. Т.е. далее, по поводу патча, придется
немного изменить =)
xPoison <<

И последнее, что осталось - это патч.
В конце файла есть до фига ноликов которые видать были оставлены для крэкеров 🙂 Ну так мы их и заюзаем.
Итак, вот как я его пропатчил:

0006F10A: EB65 (1) jmp 0006F171

0006F171: 823D54294E0076 cmp byte ptr [004E2954],76 <- проверка на распакованость
0006F178: 7517 (1) jnz 0006F191
0006F17A: C60516274E00EB mov byte ptr [004E2716],EB
0006F181: C60559294E00EB mov byte ptr [004E2959],EB
0006F188: 66C705EB264E00EB1A mov word ptr [004E26EB],1AEB
0006F191: 89F8 mov eax,edi <- то что я заменил на jmp (0006F10A)
0006F193: E974FFFFFF (2) jmp 0006F10C <- возврат в прогу

После этого надо будет еще поменять атрибуты секций юзая procdump - "Pe editor", на E0000060 (т.е. любые данные). Кому интересно почему такое число (E0000060) возьмите инфу по pe заголовку. И прочтите про атрибуты секций.
Вот и все.

xPoison >> Ну и отлично {[HEX]}, ты потратил немного времени, потом я тоже немного (причем полезно, убрал несколько багов), все довольны =)

далее часть 3: "про кодинг" привожу часть исходника которая была подвергнута дизассемблированию и детальному изучению =)

Чистый паскаль, во всей программе я юзал пару модулей из библиотеки RX + модуль inet.pas, отвечающий за преобразование 
IP адреса типа string а IP общепринятого в кодинге типа.

// full version ####
// eIP := edEndIP.Text;
// threads := udThreadCount.Position;

// trial version ###
fmMain.Caption := 'xSHaReZ scanner - demo';
eIP := IPToStr(StrToIp(bIP) + 254);
edEndIP.Text := eIP;
threads := 5;
udThreadCount.Position := threads;
i := Random(10);
if i >= 9 then
Application.MessageBox(PChar(GetStrRes('TrialText', LangList, #13)), PChar(fmMain.Caption),
MB_OK + MB_ICONINFORMATION);
Randomize;
// trial version ###

edThreadCount.Enabled := False;
udThreadCount.Enabled := False;

Ну все в общем то видно, когда я делаю полную версию, я удаляю комментарии из первой части, когда Демо - из второй.
Первый раз количество потоков (та фишка на которой крекер сосредоточил все внимание) берется из "SpinEdit",
второй - она жестко равна 5-ти. визуальные компоненты отключаются в конце кода.

Собственно и все. Хотелось бы выразить благодарность {[HEX]} (за то, что заставил меня почитать исходник еще раз
и исправить 3-4 визуальных бага), юзерам из IRC которые заставили меня сосредоточиться на этой небольшой проблемке
и, видимо, написать эти комментарии.

Check Also

Туннель во времени. Выводим данные с компьютера через Network Time Protocol

Содержание статьиЧто такое NTPСтруктура пакета NTPОграничения на трафик по порту UDP-123Ко…

Оставить мнение