Возможный вариант такой: Код (Text): static main() { auto i, j, k; i = ScreenEA(); j = ItemSize(i); for(k = i; k < j+i; k++) { PatchByte(k, 0x90); } } Однако, тупая ида (или я тупой ) не хочет удалять xref, параметры о функциях, которые я так гупаю. Поэтому я думаю, быть может, скрипт надо конкретно усложнить? Что-нибудь вида if(по k у нас сидит функция) DelFunction(k); if(по k сидит xref) DelCodeXref(k); Вопросы: 1. прав ли я? 2. если я прав, то какие функции есть для определения таких вещей и как это делать корректно?
Да, она не удаляет ссылки. Можно сделать адрес 'Undefined', но ссылки на него все равно останутся. Их нужно удалять самому. Можно сделать, например, так: --------------------------- auto ScrEA, curr; ScrEA = ScreenEA(); curr = RfirstB0(ScrEA); while (curr != 0xffffffff) { // Message ("%x\n",curr); DelCodeXref(curr,ScrEA,0); // Если поставить здесь флаг '1', // то после удаления последней ссылки, // код по ScrEA будет объявлен 'undefined' curr = RnextB0(ScrEA,curr); } --------------------------- Если нужно удалить ссылки на данные, то используются функции del_dref, DfirstB, DnextB. Как быть с функциями, я наверняка не знаю (к тому же задача до конца не ясна), но можно попробовать что-то вроде этого. Если нужно просто удалить в IDA пропатченную функцию, то все просто: DelFunction(ScrEA); // если ScrEA не принадлежит функции, то ничего не произойдет. Если же нужно удалять функцию, только если патчится ее первый байт, то нужно определить текущее смещение в пределах функции: off = GetFuncOffset(ScrEA); Но ее возвращаемое значение - строка типа 'funcname+offset' Нужно что-нибудь такое: --------------------------- off = GetFuncOffset(ScrEA); i = strstr (off, '+'); if (i != 0xffffffff) { off_num = atol(substr(off,i+1,-1)); if (off_num == 0) DelFunction(ScrEA); // мы в начале, удаляем функцию. } --------------------------- А вот как быть с параметрами функций, я не знаю, они по DelFunction не удаляются...
Да, еще забыл. Выше приведен пример удаления ссылок НА пропатченный адрес. Если же нужно (а, наверно, нужно!) удалять ссылки ИЗ данного адреса, то нужно пользоваться функциями без индекса 'B' в конце (Rfirst0, Rnext0). Для данных, понятно, это вообще не нужно...