/*Может быть стоило запостить этот вопрос в теме WASM.BEGINNERS */ В общем вопрос в следующем: если я хочу изменить ассемблерную инструкцию сразу в IDA 4.8.0, то как мне это сделать? Нашёл в хэлпе про Edit|Patch - но что то не находу в меню такого пункта. Где это? Есть какой HotKey для этого? И как я понял, это изменение будет во внутренней базе данных Иды, а как это изменение сбросить в файл? Жму File/Produce File/Create File., но там говорится, что это не поддерживается... Буду рад объяснениям как это сделать.
ManWithNoName Сколько можно повторять этот вопрос! Поиск совсем не рулит, ага? Залезь в конфиг иды, найдёшь там про патчи. Изменения работают только для dos/com файлов, для PE можно делать диффы, а потом использовать различные патчеры или руками править.
АП!!!!1111 Поиск - хорошо, да не все найдешь.... 1) Пропатчить образ из под ИДЫ можно IDC скриптом: Код (Text): auto ea,raw,h; ea=ScreenEA(); raw=va2raw(ea); h=fopen(GetInputFile(),"r+"); fseek(h,0,raw); for(;ea<ItemEnd(ea);ea++) {fputc(Byte(ea),h);}; 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): UPX_____:30064000 ; Section 5. (virtual address 00064000) ... UPX_____:30064000 ; Offset to raw data for section: 00062A00 ... UPX_____:30064000 UPX_____ segment para public 'CODE' use32 Итак, первый вопрос - как средствами IDC-скрипта получить смещение в файле текущей позиции? 2) Не совсем понятно, что произойдет при запуске отладчика, если пропатчить и базу ИДЫ, и оригинальный файл. 3) Есть замечательные функции PatchByte(), PatchWord(), и даже PatchDword(), а вот в меню Edit нет последней, зато есть пункт "Assemble...", этот чудо-ассемблер можно юзать программно?
2) При запуске отладчика данные берутся с диска. 3) в idagui.cfg прописать DISPLAY_PATCH_SUBMENU = YES
вобщем пока придумал только 1 способ определить file offset: Код (Text): static _SectionRawOffset(ea) { auto line; line=LineA(SegStart(ea),3); if ("; Offset"!=(substr(line,0,8))) {Message("_SectionRawOffset failed./n");return -1;}; return xtol(substr(line,-9,-1));} static _ea2raw(ea) {return ea-SegStart(ea)+_SectionRawOffset(ea);}