IDA IDC - удаление данных по текущему EA

Тема в разделе "WASM.RESEARCH", создана пользователем volodya, 10 мар 2005.

  1. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Возможный вариант такой:


    Код (Text):
    1.  
    2. static main()
    3. {
    4. auto i, j, k;
    5. i = ScreenEA();
    6. j = ItemSize(i);
    7. for(k = i; k < j+i; k++)
    8. {
    9.     PatchByte(k, 0x90);
    10. }
    11. }
    12.  




    Однако, тупая ида (или я тупой ;)) не хочет удалять xref, параметры о функциях, которые я так гупаю. Поэтому я думаю, быть может, скрипт надо конкретно усложнить?

    Что-нибудь вида



    if(по k у нас сидит функция)

    DelFunction(k);

    if(по k сидит xref)

    DelCodeXref(k);



    Вопросы:

    1. прав ли я?

    2. если я прав, то какие функции есть для определения таких вещей и как это делать корректно?
     
  2. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138


    Да, она не удаляет ссылки. Можно сделать адрес '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 не удаляются...
     
  3. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Да, еще забыл. Выше приведен пример удаления ссылок НА пропатченный адрес. Если же нужно (а, наверно, нужно!) удалять ссылки ИЗ данного адреса, то нужно пользоваться функциями без индекса 'B' в конце (Rfirst0, Rnext0).

    Для данных, понятно, это вообще не нужно...
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Большое спасибо! Я вкурил.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

    Что значит "удаление данных"?

    я так и не понял суть вопроса %)
     
  6. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    PatchByte/HideItem