Первый раз столкнулся с дизасмом КПК-ной проги, более-менее команды понятны, но вот на этом (см.листинг из иды в прицепе) - споткнулся. Первые три строчки - это просто пример вызова функции, а далее собственно она сама. Причем до цикла, начинающегося с loc_B32A8 вроде все понятно (из юникодовой строки вида "11111-22222-3333-44444444" делается "1111122222333344444444"), а вот что происходит в цикле и далее - не ясно. Может кто поможет реверснуть, а?
Ерунда какая-то: на работе аттач прекрасно скачивается, в то время как дома - битый приходит... Выложил сюда _http://slil.ru/23642758 Зеркало1 _http://www.rapidshare.ru/124448 Зеркало2 _http://rapidshare.com/files/8971160/listing.rar.html Хватит пока?
А Вы не пробовали найти какой оригинальный форум по Вашей модели КПК? Здесь всё-таки WASM, а не ARMASM. Чтобы дать ответ на Ваш вопрос нужно знать по-минимуму набор команд, а лучше всего архитектуру конкретного чипа. А ещё лучше взять какую-нить среду, типа Keil, вырезать из Вашего бинарика асм код и погонять его на левых данных. Так хоть будет понятно назначение блоков инструкций. Не вооружённым глазом совершенного бестолоча (это я о себе) в ARM можно заметить, что блоки кода повторяются, видимо они действуют одинаково для каки-то частей вводимой строки. "Одинаковых" блоков 10 штук, если считать с метки loc_B32A8, самое интересное, что в конце какой-то стандартный код с проверкой. Код (Text): .text:000B357C CMP R11, #0 ; Set cond. codes on Op1 - Op2 .text:000B3580 BEQ loc_B359C ; Branch .text:000B3584 LDR R0, =unk_F5D50 ; Load from Memory .text:000B3588 MOV R3, #0 ; uType .text:000B358C LDR R2, =unk_DEDC4 ; lpCaption .text:000B3590 LDR R1, =a07458b58 ; lpText .text:000B3594 LDR R0, [R0] ; hWnd .text:000B3598 BL MessageBoxW ; Branch with Link .text:000B359C .text:000B359C loc_B359C ; CODE XREF: CheckLicenseNumber+464 j .text:000B359C MOV R0, R6 ; Rd = Op2 .text:000B35A0 ADD SP, SP, #0x60 ; Rd = Op1 + Op2 .text:000B35A4 LDMFD SP!, {R4-R11,PC} ; Load Block from Memory Если ноль, то прыгаем вне MessageBoxW(). Заметим, что это не call, а именно branch. Хотя, елси честно, call в наборе инструкций я не заметил и что такое переход со ссылкой не совсем понимаю. А, там ещё выше есть проверка, ну тогда я пас. Очень интересно деление на одинаковый части кода, заметьте, что они практически идентичные. Может строка бьётся на части и с каждой частью какие манипуляции делаются? Между прочим количество цифр в строке 10*2 (без нолей unicode и дефисов). Если по-вашему первая часть листинга убирает дефисы и на это понадобилось столько (!) операций, то вполне можно предположить, что после метки loc_B32A8 идёт просто попарное сравнение цифирок. Это всё на что меня хватило без знания асм'а ARM.
ну что сказать до вычисления математики, а она действительно начинается с loc_B32A8, происходит формирование строки с номером лицензии без дефисов, цифры друг за другом. Начиная с loc_B32A8 начинается цикл обработки получившейся строки, тело цикла до 000B34F4. Далее окончательные вычисления и решение о правильности номера лицензии принимается в строке по адресу 000B3538. А дальше все очень просто - если номер лицензии подходит, ТО наша функция возвращает 1, если нет, то 0. Если вам надо оторвать от лицензии только один экземпляр программы, то пропатчьте эту функцию так чтобы она вообще ничего не делала а сразу возвращала 1. Другой вопрос если вам надо написать кейген.
binom Спасибо за исследование кода. Задача стоит написать кейген, поэтому, если у вас есть возможность - нельзя ли перевести на язык выского уровня или на обычный асм то, что происходит в цикле B32A8-B34F4 ? Я что-то не могу въехать в логику происходящего там
К сожалению в данный момент у меня нет свободного времени. Возможно я смогу посмотреть код на Новогодних праздниках. Пока могу помоч только советом. Процессоры архитектуры ARM имеют два набора команд, которые зависят от режима работы процессора. Это режимы ARM и Thumb. В вашем коде используются команды режима ARM. У меня есть документация которая Вам сможет помочь. Пишите мыло, я сброшу.
Други, каллеги... Как ваще скормить той же иде эту ARMовскую бадягу: Офф. сайт проги _http://www.codebrowser.org/zap/download.php Как найти точку входа и пр. первые шаги... Мож еще чем поковырять кроме иды... Я со смартами первый раз... Заранее, спс.
В иде надо нажать файл>ньюв, далее выбрать закладку ".....PDA....". а далее смотря что с тебя есть для исследования
twgt Точна, после установки vs .net опознал как // Format : Microsoft.Net assembly // Processor : cli После класич. асма куча ДИКИХ вопросов: 1. как с такими "конструкциями" (...class public, ...System.Windows.Forms, ...filed private class) работать? 2. что лежит в sub_....{....}? (некое подобие асм-инструкций?? нужен мануал!) 3. в чем отличие ldarg.0 и ldarg.1? ......... Где кого "ловить"? Что куда передается\принимается? и почему cli когда на девайсе стоит ARM? .........и т.д. и т.п. Код (Text): .class public auto ansi bm extends [System.Windows.Forms]System.Windows.Forms.Form // DATA XREF: sub_54C0+11w // sub_54C0+64r ... { .field private class [System.Windows.Forms]System.Windows.Forms.MenuItem a .field private class [System.Windows.Forms]System.Windows.Forms.MenuItem b // DATA XREF: sub_54C0+1Cw // sub_54C0+7Br ... ....................... ....................... .field private static unsigned int8[] h // DATA XREF: sub_5950+44r // sub_5AD0+11w ............................. ............................. .field private class [System.Windows.Forms]System.Windows.Forms.MainMenu k // DATA XREF: sub_54C0+6w sub_54C0+59r ... .method assembly hidebysig specialname void .ctor() // CODE XREF: sub_58A0+76p { ldarg.0 call void [System.Windows.Forms]System.Windows.Forms.Form::.ctor() ldarg.0 call void bm::g() ldarg.0 ldfld class [System.Windows.Forms]System.Windows.Forms.Label bm::c ldstr "This program is not registered. \r\nInput correct rigistration code or press Trial menu for continue with limited mode." callvirt void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(class System.String) ret } .method family virtual hidebysig void Dispose(bool disposing) { ldarg.0 ldarg.1 call void [System.Windows.Forms]System.Windows.Forms.Form::Dispose(bool) ret } Плз, пните на путь истиный...