eXeL@B —› Вопросы новичков —› Введение в реверсинг с нуля, используя IDA PRO |
<< 1 ... 9 . 10 . 11 . 12 . 13 . >> |
Посл.ответ | Сообщение |
|
Создано: 28 ноября 2016 22:13 · Поправил: yashechka · Личное сообщение · #1 Привет Всем. Здесь буду потихоньку выкладывать новый курс по ИДЕ (перевод статей автора Рикардо Нарваха) А тут, красивые PDF. Как только закончу снимать отладку, перейду на реверсинг с нуля и на что-то ещё. Буду рад услышать любые комментарии по курсу Также всем Спасибо за лайки. === | Сообщение посчитали полезным: Apocalypse, zds, srm60171, =TS=, gleco1, Gideon Vi, Djeck, zNob, SReg, ksol, filyaxxxcom, N_E_O, Orlyonok, Abraham, mak, ClockMan, VodoleY, Bad_guy, verdizela, negoday, _k0NkurS, TOM_RUS, vnekrilov, anonymous, HandMill, DICI BF, olafudaf, tRuNKator, CoolMax_86, TryAga1n, AtilkaShooter, CyberGod, BiteMoon, d745150, mr_yoda2, IranR, Nau, AlxVD, needmic, Diabolic, hlmadip, BAHEK, CKAP, Norinke, Znoy, YoY, Medsft, oxiusova, ww00, awoland, Isaev, rukop84, Rio, Hugo Chaves, papavlo, r_e, ac86, ys72 |
|
Создано: 10 мая 2019 20:34 · Личное сообщение · #2 |
|
Создано: 10 мая 2019 20:35 · Личное сообщение · #3 |
|
Создано: 10 мая 2019 20:52 · Личное сообщение · #4 yashechka, благодарю за ссылку, но это не для 8051 и не увидел исходников, в которых можно что-то подчерпнуть для моей задачи, кроме того эти загрузчики, как я понял, написаны с использованием СДК, а мне показалось, что для моих загрузчиков должно хватить idc-скрипта или на python-е, хотя из-за недостатка опыта может и ошибаюсь f13nd, благодарю за ответ, но поскольку прошивки отличаются, то вручную каждый раз выбирать я уже замучился и-за разных адресов и раскладки в памяти по сегментам. Кроме того непонятно, как переименовывать битовые переменные (нашел только способ изменения руками в i51.cfg файле, но для каждой версии приходится плодить новый вариант), также не понял как менять из idc-скрипта некоторые байты, ну, и со станицами кода не понятно как поступить, т.к. адресное пространство микроконтроллера 64К и при выходе из подпрограмм ИДА сваливается на нулевую страницу... Как бы к этому подступиться? |
|
Создано: 10 мая 2019 21:09 · Личное сообщение · #5 Это конечно не Ида, но вот посмотрите Добавлено спустя 2 минуты | Сообщение посчитали полезным: PhilXe |
|
Создано: 10 мая 2019 22:10 · Личное сообщение · #6 PhilXe пишет: что для моих загрузчиков должно хватить idc-скрипта или на python-е idc.loadfile() и ida_bytes.patch_bytes() в принципе позволяют из скрипта загружать файлы. Наверное можно так сделать, но если собираешься перед загрузкой файл анализировать, про idc лучше забудь, только петон. Про сегменты честно говоря не представляю себе в чем проблема, единственный проц с сегментацией, который я нормально знаю, прекрасно себя чувствует без условного деления на сегменты, вся межсегментная адресация срастается правильно. ----- 2 оттенка серого | Сообщение посчитали полезным: PhilXe |
|
Создано: 11 мая 2019 01:28 · Личное сообщение · #7 f13nd пишет: idc.loadfile() и ida_bytes.patch_bytes() в принципе позволяют из скрипта загружать файлы. Наверное можно так сделать, но если собираешься перед загрузкой файл анализировать, про idc лучше забудь, только петон благодарю, сначала попробую на idc, т.к. с python-ом я пока вообще не знаком, а если не получится, тогда буду просить помощи и пытаться смотреть примеры на нем. К сегментам вернусь после того, как что-то первоначальное заработает... |
|
Создано: 27 мая 2019 14:13 · Личное сообщение · #8 мне нужно было решить задачи: 1) опознать файл; 2) выбрать процессор; 3) загрузить файл; 4) модифицировать его У меня было ИДА5.5, но у нее нет функционала пользовательских загрузчиков на idc и python, который появился только с версии 5.6, поэтому обновился до версии 5.7. Первую задачу в черновом варианте удалось решить на основе изучения примера загрузчика БИОС в ИДА, но выбрать тип процессора не удалось. Возникло предположение, что нужна другая версия, начал искать и обновился до версии 6.1, в которой удалось выбрать тип процессора, но не удалось выбрать конкретный процессор. Долго бился, но не получилось, поэтому предположил, что нужна более старшая версия ИДА. Нашел на просторах 6.8, но с упоминанием о какой-то проблеме, поэтому начал искать другую и нашел 7.0. Версия 7.0 оказалась уже с установщиком, который все установил, и мне удалось выбрать процессор, однако, появился доп.вопрос: вместе с установщиком имеется какой-то патч -- для чего он? нужно ли его применить? и т.п. или же можно продолжить работы и никакой потом проблемы не возникнет в дальнейшем? либо наоборот нужно сначала применить патч во избежание в дальнейшем чего-то мне неизвестного сейчас? Подскажите, пожалуйста, новичку. Заранее благодарю всех откликнувшихся |
|
Создано: 27 мая 2019 14:35 · Личное сообщение · #9 PhilXe пишет: но не удалось выбрать конкретный процессор Насколько могу судить, выбор конкретного проца это применение профиля из \cfg (только он и содержит упоминания о конкретных процессорах). Если не найдешь апи для этого, файл всегда можно пропарсить питоноскриптом и применить его содержимое с помощью idc.set_name(), idc.create_dword() и т.д. PhilXe пишет: вместе с установщиком имеется какой-то патч -- для чего он? Скорей всего это патч для блек-листа, чтобы более новая пиратская ида при открытии базы, созданной старой пиратской идой, не заявила, что пиратство это плохо и не закрылась. ----- 2 оттенка серого | Сообщение посчитали полезным: PhilXe |
|
Создано: 27 мая 2019 15:09 · Поправил: PhilXe · Личное сообщение · #10 f13nd пишет: выбор конкретного проца это применение профиля из \cfg (только он и содержит упоминания о конкретных процессорах) да, я нашел там файл i51.cfg, в котором есть образцы нескольких разных моделей процессоров этого семейства и создал по образцу несколько своих, но из моего загрузчика только выскакивает окно ИДЫ с просьбой подтвердить выбор (или изменить), а как из скрипта выбрать сразу и исключить доп.вопросы я пока не понял f13nd пишет: Если не найдешь апи для этого, файл всегда можно пропарсить питоноскриптом и применить его содержимое с помощью idc.set_name(), idc.create_dword() и т.д. а есть какие-то примеры как этим пользоваться на практике? и еще попутно вопрос: сами процессоры семейства i8051 8-разрядные с 16-разрядным адресным пространством, соответственно, ИДА позволяет для них в качестве данных задать либо 8-битный байт, либо 16-битное слово, но для меня требуется некоторые данные представлять в виде 32-битных двойных слов -- можно ли этого добиться через интерфейс или из скрипта idc / py ? f13nd пишет: это патч для блек-листа т.е. если нет перспектив когда-то в будущем открывать свои базы с разобранными файлами в более новых версиях ИДЫ, то патч можно не использовать? а когда появится версия свежее 7.0 тогда его и применить? |
|
Создано: 27 мая 2019 15:54 · Личное сообщение · #11 PhilXe пишет: а есть какие-то примеры как этим пользоваться на практике? Ну вот например, делалось давно, idc внутри питона. На голом питоне не сильно будет отличаться PhilXe пишет: требуется некоторые данные представлять в виде 32-битных двойных слов Скорей всего достаточно будет создать 32битную область памяти. Где-то была тема про кофеварку, там 16битный проц где без проблем дворды объявляются. PhilXe пишет: патч можно не использовать? Можно и не использовать. Не понадобится - не пользуйся, я обычно патчу сам что надо, всякие сомнительные патчи без описания не ставлю. ----- 2 оттенка серого | Сообщение посчитали полезным: PhilXe |
|
Создано: 08 июня 2019 15:37 · Поправил: PhilXe · Личное сообщение · #12 продвижки с версией 7.0 есть, т.е. загрузчик распознает файл и правильно его загружает, но при этом есть ряд проблем, которые хотелось бы все-таки как-то решить: 1) после загрузки я создаю 32-битный сегмент, но это не позволяет представлять данные в виде 32-битных двойных слов (только 8-битный байт или 16-битное слово). В результате экспериментов было установлено, что это из-за завязки не на битность сегмента, а из-за выбранного конкретного ассемблера, т.е. если вручную заменить в Target Assembler выставленный по-умолчанию ASMI на 2500A.D., то 32-битные данные можно выбирать и в 16-битном сегменте. Соответственно, вопрос: как из idc-скрипта заменить Target Assembler на нужный? 2) попутно вопрос: как из idc-скрипта заменить значение Number of opcode bytes вместо нуля по-умолчанию на нужное, например, 3 или 4? 3) поскольку я пока не нашел способа как после задания в idc-скрипте целевого процессора (семейство 8051) дополнительно выбрать его конкретную модель, прописанную в i51.cfg, то пришлось там удалить все предустановленные модели и создать одну фиктивную, хотя это и не убрало появление этого диалогового окна. Однако, несмотря на то, что у этого фиктивного процессора я указал только сегменты, но ИДА самостоятельно задала точки входа и пометила векторы прерываний по адресам 0х0003, 0х000В, 0х0013, 0х001В, 0х0023 и 0х0033, хотя в моей модели нет последнего вектора аппаратно, а остальные программно не используются, поэтому по этим адресам находятся вместо кода данные, что вызывает неправильное дизассемблирование. Я попытался посмотреть количество точек входа сразу после загрузки функцией GetEntryPointQty() и получаю значение 0, что правильно, далее я создал нужные мне 3 точки входа для реальных векторов прерываний и через GetEntryPointQty() проверил их количество, но в базе ИДА это не изменило ее поведения, т.е. она по-прежнему дизассемблирует исходя из "ее" списка точек входа. Я посмотрел через <Ctrl-E> этот список и увидел в нем три "моих" точки и еще 7 "ее" точек (6 векторов и адрес сброса 0х0000), причем "мои" точки имеют заданное мной значение ординала, а "ее" точки для 6-ти векторов с пустыми ординалами, а для адреса сброса указан {main entry]. Чтобы я не указывал в файле i51.cfg для фиктивного процессора изменения поведения ИДА не происходит, из чего складывается впечатление, что при отсутствии выбора из загрузчика модели конкретного процессора уже после отработки загрузчика ИДА задает какие-то свои внутренние предустановки, соответсвенно, вопрос: можно ли их поменять и/или переопределить из idc-скрипта? 4) создаваемые мной в загрузчике сегменты для кода (CODE), данных (DATA) и внутренней памяти (RAM) отрабатываются нормально, но мне не удается создать сегмент для области спец.регистров микроконтроллера (FSR) так, чтобы его адресация была не с нуля, а с адреса 0х80, хотя ИДА сама создает этот сегмент правильно, но тогда из моего загрузчика нет возможности задать имена этим спец.регистрам, соответственно, вопрос: как создать такой сегмент с адресацией не с нуля, а с произвольным значением? 5) при попытке разных вариантов обходных решений по проблемам п.п.3,4 мне понадобилось выполнить из idc-скрипта запуск повторного анализа, но как это сделать я не нашел, соответственно, вопрос: как из idc-скрипта выполнить reAnalyze? |
|
Создано: 09 июня 2019 03:22 · Личное сообщение · #13 1. idc.get_inf_attr(38) - номер выбранного ассемблера, idc.set_target_assembler(1) - установка второго 2. Наверное тебе надо options -> general -> number of opcode bytes (non-graph) 3. idc.del_items(0,0x0002,BADADDR) 4. Скорей всего никак, насколько могу судить это не сегмент вообще (не содержит неинициализированных данных), захардкожен самим дизасм-модулем. Причина в отсутствии в иде поддержки адресных пространств. 5. idc.auto_mark_range(0,BADADDR,40) ----- 2 оттенка серого | Сообщение посчитали полезным: PhilXe |
|
Создано: 09 июня 2019 20:03 · Поправил: PhilXe · Личное сообщение · #14 Уважаемый f13nd, благодарю за ответы. 1) сработало отлично, но вопрос: а как удалось узнать, что именно attr(38)? 2) я в файле ida.cfg задал OPCODE_BYTES = 4, но в некоторых случаях хотелось бы не руками выставлять 3, а из загрузчика в зависимости от анализа прошивки -- может быть тоже через какой-то attr можно к этому добраться? 3) с этим пока разбираюсь в части конкретного применения; 4) самое интересное то, что если я создаю этот сегмент самостоятельно, то ИДА этот сегмент отображает с адресацией, начинающейся с нуля, но при дизассемблировании работает правильно, т.е. как буд-то бы с ее созданным сегментом, который начинается с адресации 0х80... 5) сработало отлично, но возник доп.вопрос: нужно ли после этого использовать команду auto_wait() ? |
|
Создано: 09 июня 2019 20:43 · Личное сообщение · #15 PhilXe пишет: а как удалось узнать, что именно attr(38)? Открой \idc\idc.idc, там расписаны апи и константы. Code:
PhilXe пишет: OPCODE_BYTES = 4 Code:
PhilXe пишет: нужно ли после этого использовать команду auto_wait() ? В описании так и сказано: Code:
----- 2 оттенка серого | Сообщение посчитали полезным: PhilXe |
|
Создано: 09 июня 2019 22:10 · Личное сообщение · #16 а можно ли из idc-скрипта запросить через открытое окно выбор из предложенных вариантов? Добавлено спустя 31 минуту и еще вопрос: пытаюсь использовать сигнатуры для библиотечных функций, поэтому не зная правильной методики поступил так -- в дизассемблированном коде отыскал такие функции самостоятельно, скопировал оп-коды в отдельный pat-файл заменяя изменяемые при компиляции и линковке байты на точки, но такой процесс оказался несколько трудоемким. В раздумьях, как бы попробовать автоматизировать это из ИДы, хотя в идеале бы как-то попробовать разобрать сами библиотеки компилятора... |
|
Создано: 09 июня 2019 23:23 · Поправил: f13nd · Личное сообщение · #17 PhilXe пишет: а можно ли из idc-скрипта запросить через открытое окно выбор из предложенных вариантов? Не слышал ничего про ide с автокомплитом для idc. PhilXe пишет: пытаюсь использовать сигнатуры для библиотечных функций Могу только сюда отправить ----- 2 оттенка серого |
|
Создано: 09 июня 2019 23:42 · Поправил: PhilXe · Личное сообщение · #18 еще напрягает одно неудобство -- мне удобно представление некоторых переменных в двоичном виде, но по-умолчанию ИДА не отображает лидирующие нули, поэтому приходится вручную делать Toggle leading zeroes, а хочется автоматизировать скриптом либо выставить на постоянку, но set_inf_attr(INF_GENFLAGS, get_inf_attr(INF_GENFLAGS) | INFFL_LZERO) не срабатывает, хотя написано, что должно https://www.hex-rays.com/products/ida/support/idadoc/1510.shtml -- может знаете решение? P.S. |
|
Создано: 10 июня 2019 07:10 · Личное сообщение · #19 PhilXe пишет: по-умолчанию ИДА не отображает лидирующие нули Любой юнит (инструкцию/данные) ты можешь взять ('string generate_disasm_line(long ea, long flags);'), переработать и заменить на свою строку ('void set_manual_insn(long ea, string insn);'). Альтернатива - 'string print_operand(long ea, long n);' и 'success op_man(long ea, long n, string str);' - для отдельных операндов. ----- 2 оттенка серого |
|
Создано: 10 июня 2019 11:32 · Личное сообщение · #20 |
|
Создано: 10 июня 2019 11:45 · Личное сообщение · #21 PhilXe пишет: т.е. "включить" заявленный штатный режим отображения лидирующих нулей ИДА не получится? Никогда этим не интересовался. PhilXe пишет: или на горячую кнопку можно только то, для чего существует функция, объявленная в idc.idc? Если единожды запустить этот скрипт, при нажатии Alt+1 будет вызываться anyaction() Code:
При запуске иды <...>ida64.exe -S"autorun.idc" скрипт будет запущен автоматом. Можно немного усложнить, добавив пункт в контекстное меню файла, при котором файл будет открыт в иде и с авторан-скриптом. ----- 2 оттенка серого |
|
Создано: 10 июня 2019 19:31 · Личное сообщение · #22 f13nd пишет: #include <idc.idc> static main() { DelHotkey("Alt+1");AddHotkey("Alt+1","anyaction"); } static anyaction(void) { } а как бы сделать по anyaction() действие Toggle leading zeros для операнда текущей команды? Добавлено спустя 26 минут после загрузки открывается окно, в начале которого следующие строки: CODE:0000 ; +-------------------------------------------------------------------------+ CODE:0000 ; | This file has been generated by The Interactive Disassembler (IDA) | CODE:0000 ; | Copyright (c) 2017 Hex-Rays, <support@hex-rays.com> | CODE:0000 ; +-------------------------------------------------------------------------+ CODE:0000 ; Processor : 8032 [RAM=65791 ROM=0 EPROM=0 EEPROM=0] CODE:0000 ; Target assembler: ASMI CODE:0000 ; Byte sex : Big endian Как получить из скрипта Target assembler Вы мне ранее уже подсказали, а чем и как можно получить содержимое предыдущей строки Processor : 8032 ? |
|
Создано: 10 июня 2019 20:01 · Личное сообщение · #23 idc.set_flag(INF_OUTFLAGS,OFLG_LZERO,1) И должно быть достаточно в авторан-скрипте выполнить один раз, горячая клавиша не нужна. Добавлено спустя 4 минуты PhilXe пишет: Как получить из скрипта Target assembler Вы мне ранее уже подсказали, а чем и как можно получить содержимое предыдущей строки Processor : 8032 ? По идее примерно так: auto proc; proc = sprintf("%s%s%s%s%s%s%s%s",GetCharPrm(INF_PROCNAME + 0),GetCharPrm(INF_PROCNAME + 1),GetCharPrm(INF_PROCNAME + 2),GetCharPrm(INF_PROCNAME + 3), GetCharPrm(INF_PROCNAME + 4),GetCharPrm(INF_PROCNAME + 5),GetCharPrm(INF_PROCNAME + 6),GetCharPrm(INF_PROCNAME + 7)); Но эту возможность в 7.0 благополучно похерили. Переходи на питон, где idaapi.get_inf_structure().procname работает ----- 2 оттенка серого | Сообщение посчитали полезным: PhilXe |
|
Создано: 10 июня 2019 20:09 · Личное сообщение · #24 f13nd пишет: set_flag(INF_OUTFLAGS,OFLG_LZERO,1) просто нет слов, снимаю шляпу перед Вами -- работает отлично!!! теперь бы еще как-то получить текст строки "CODE:0000 ; Processor : 8032 [RAM=65791 ROM=0 EPROM=0 EEPROM=0]" в скрипте и получится обойти проблему невозможности создать из загрузчика сегмент FSR |
|
Создано: 10 июня 2019 20:32 · Личное сообщение · #25 |
|
Создано: 10 июня 2019 21:16 · Личное сообщение · #26 f13nd пишет: Это профиль из .cfg, можно попробовать по-колхозному сделать в каждом профиле уникальное имя какому-то из сегментов, имя сегмента можно будет забирать из скрипта get_segm_name(ea) идея мне понравилась, но эксперимент показал, что при работе с загрузчиком это не работает, т.е. можно писать любой текст, но разделы создаются либо загрузчиком, который не "знает" что писать, либо потом чем-то встроенным в ИДА для 8051-го семейства, поэтому остается только как-то получить в скрипт текст указанной строки, по которой все остальное сделает скрипт... а есть ли возможность выгрузить конкретную строку во внешний файл и потом загрузить эту строку из файла? |
|
Создано: 10 июня 2019 21:46 · Личное сообщение · #27 |
|
Создано: 11 июня 2019 21:29 · Личное сообщение · #28 Наконец удалось перевести главу #65. Это самая большая глава. В ней почти 90 страниц, поэтому это заняло столько времени. Она будет разбита на несколько страниц. Завтра оформлю другие. | Сообщение посчитали полезным: morgot, SReg, HandMill, Hugo Chaves |
|
Создано: 13 июня 2019 19:02 · Личное сообщение · #29 |
|
Создано: 14 июня 2019 01:09 · Личное сообщение · #30 |
|
Создано: 16 июня 2019 21:58 · Личное сообщение · #31 Добавлено спустя 3 минуты Итак, друзья. Остался всего один последний перевод. Это глава #67 И я обещаю вложить в него душу и всё то, чему я научился за эти 66 глав. Он будет сразу релизным. На его основе я буду готовить весь курс снова сначала. Буду рад услышать комментарии и критику. А сейчас нужно только подождать, потому что там 66 страниц. | Сообщение посчитали полезным: HandMill, mak, ksol |
<< 1 ... 9 . 10 . 11 . 12 . 13 . >> |
eXeL@B —› Вопросы новичков —› Введение в реверсинг с нуля, используя IDA PRO |