Модифицирование кода в IDA

Тема в разделе "WASM.BEGINNERS", создана пользователем ManWithNoName, 30 сен 2005.

  1. ManWithNoName

    ManWithNoName New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2005
    Сообщения:
    31
    Адрес:
    Москва
    /*Может быть стоило запостить этот вопрос в теме WASM.BEGINNERS :)*/ В общем вопрос в следующем: если я хочу изменить ассемблерную инструкцию сразу в IDA 4.8.0, то как мне это сделать? Нашёл в хэлпе про Edit|Patch - но что то не находу в меню такого пункта. Где это? Есть какой HotKey для этого? И как я понял, это изменение будет во внутренней базе данных Иды, а как это изменение сбросить в файл? Жму File/Produce File/Create File., но там говорится, что это не поддерживается...

    Буду рад объяснениям как это сделать.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    ManWithNoName

    Сколько можно повторять этот вопрос! Поиск совсем не рулит, ага?



    Залезь в конфиг иды, найдёшь там про патчи.



    Изменения работают только для dos/com файлов, для PE можно делать диффы, а потом использовать различные патчеры или руками править.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    АП!!!!1111 Поиск - хорошо, да не все найдешь....

    1) Пропатчить образ из под ИДЫ можно IDC скриптом:
    Код (Text):
    1. auto ea,raw,h;
    2. ea=ScreenEA();
    3. raw=va2raw(ea);
    4. h=fopen(GetInputFile(),"r+");
    5. fseek(h,0,raw);
    6. for(;ea<ItemEnd(ea);ea++) {fputc(Byte(ea),h);};
    7. fclose(h);
    но для этого надо уметь получать смещение в файле (raw). По идее,
    raw = ea - segment_start_ea + segment_start_raw,
    причем segment_start_ea = SegStart(ea),
    а segment_start_raw - это "Offset to raw data for section", прописан в таблице секций, под идой показывается в начале сегментов:
    Код (Text):
    1. UPX_____:30064000 ; Section 5. (virtual address 00064000)
    2. ...
    3. UPX_____:30064000 ; Offset to raw data for section: 00062A00
    4. ...
    5. UPX_____:30064000 UPX_____        segment para public 'CODE' use32
    Итак, первый вопрос - как средствами IDC-скрипта получить смещение в файле текущей позиции?

    2) Не совсем понятно, что произойдет при запуске отладчика, если пропатчить и базу ИДЫ, и оригинальный файл.

    3) Есть замечательные функции PatchByte(), PatchWord(), и даже PatchDword(), а вот в меню Edit нет последней, зато есть пункт "Assemble...", этот чудо-ассемблер можно юзать программно?
     
  4. SloT

    SloT New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2008
    Сообщения:
    72
    GoldFinch
    Ты опаздал на 3 года =).
     
  5. HuXTUS

    HuXTUS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2007
    Сообщения:
    240
    Ахахах)) Некрофил
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SloT HuXTUS
    Человек задаёт вопрос, а не отвечает на него.
     
  7. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    2) При запуске отладчика данные берутся с диска.
    3) в idagui.cfg прописать DISPLAY_PATCH_SUBMENU = YES
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    это я знаю, мне интересно есть ли аналог "assemble" для IDC скриптов?
     
  9. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Вроде нет. Можно из плагина, ph.notify(processor_t::assemble(...)).
     
  10. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    АП.
    1)
    В окошке "patch ..." IDA показывает смещение в файле, как его получить в idc-скрипте?!
     
  11. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Никак, вычисляй сам.
     
  12. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вобщем пока придумал только 1 способ определить file offset:
    Код (Text):
    1. static _SectionRawOffset(ea) {
    2.     auto line;
    3.     line=LineA(SegStart(ea),3);
    4.     if ("; Offset"!=(substr(line,0,8))) {Message("_SectionRawOffset failed./n");return -1;};
    5.     return xtol(substr(line,-9,-1));}
    6.  
    7. static _ea2raw(ea) {return ea-SegStart(ea)+_SectionRawOffset(ea);}