Вопрос по автоматизации рутинных действий в IDA

Тема в разделе "WASM.BEGINNERS", создана пользователем Magdy, 19 окт 2009.

  1. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    Доброго всем времени суток, у меня такой вопрос: работаю над файлом, в который зашита всякая хрень - картинки, аудио и прочее, возможно ли все последовательности байтов, которые начинаются, например, с 47 49 46 38 39 61 и заканчиваются байтами 00 3B, автоматически загнать в массивы?
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    idc

    хотя я и не понял о чем вы, но все равно

    idc
     
  3. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    qqwe, да я понимаю, что тут нужен скрипт, просто думал кто-нибудь ссылку на что-то похожее даст или шаблон для скрипта скинет. :) Всё-таки писать скрипты с нуля - немного тяжеловато.
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    В папочке "idc" есть куча примеров.
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    .. и книжки. например, криса и криса игла (во блин, тоже крис. только что заметил)
    точнее
    образ мышления IDA
    и
    the IDA PRO book. the unnoficial guide to the ...итд итп. она на идовском сайте в буках рекомендуется

    ну и еще есть. гугль все находит
     
  6. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    qqwe, спасиб, книжку эту (the IDA PRO book) как раз и читаю. Правда, боюсь, процесс осмысления прочитанного займёт некоторое неопределённое время. )))
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ну а вы начните с книжки нашего криса. а ихнего с раздела 4. и не читать, а пробегать. ну и примеры + немедленные испытания + написание чегото своего.
    не надо понимать и разбираться. скрипто-интерфейс иды разрабатывали под хорошую пьянку. свихнетесь. только то, что вам надо
     
  8. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    qqwe, "их" Крис тоже доступным языком пишет + читаю, по совету reverser`а, примеры из папки "idc". Думаю, через пару дней общая картина нарисуется. )))
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Если "загнать в массивы" означает "удалить все переменные и код, что внутри этих участков IDA насоздавала", то примерно так: (код вводить в диалоге Shift+F2 = File->IDC command, пробелы расставлять по вкусу, сканирование происходит в текущем сегменте, то есть в том, где стоит курсор)
    Код (Text):
    1. auto i,j;
    2. for (i=SegStart(here);i<SegEnd(here);i++)
    3. if (Dword(i)==0x38464947 && Word(i+4)==0x6139)
    4. {
    5. for (j=i;j<SegEnd(here);j++) if (Word(j) == 0x3B00) break;
    6. Message("creating array at %x with size %x\n", i, j-i);
    7. MakeUnknown(i,j-i,3);
    8. MakeByte(i);
    9. MakeArray(i,j-i);
    10. i=j;
    11. }
    Если, например, нужно вынести все такие последовательности в файлы с именами 1.gif,2.gif,..., то примерно так:
    Код (Text):
    1. auto i,j,a,s,f;
    2. a=1;
    3. for (i=SegStart(here);i<SegEnd(here);i++)
    4. if (Dword(i)==0x38464947 && Word(i+4)==0x6139)
    5. {
    6. for (j=i;j<SegEnd(here);j++) if (Word(j) == 0x3B00) break;
    7. s=ltoa(a,10)+".gif";a++;
    8. f=fopen(s,"wb");
    9. savefile(f,0,i,j-i);
    10. fclose(f);
    11. i=j;
    12. }
    Перед экспериментами базу на всякий случай лучше сохранить, чтобы была возможность откатиться при ошибке.
     
  10. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    diamond, спасибо, именно то что нужно!!!
     
  11. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    diamond, ещё раз спасибо за Вашу помощь, всё работает, вот только некоторыё Gif`ы скрипт не совсем корректно распознаёт из-за того, что в теле изображения есть дополнительные байты 00 и 3B. Можно это как-нибудь попроще обойти, без написания полноценного парсера?

    Код (Text):
    1. auto i,j,a,s,f;
    2. a=1;
    3. for (i=SegStart(here);i<SegEnd(here);i++)
    4. if (Dword(i)==0x38464947 && Word(i+4)==0x6139)
    5. {
    6. for (j=i;j<SegEnd(here);j++) if (Word(j) == 0x3B00) break;
    7. Message("creating array at %x with size %x\n", i, j-i);
    8. s="_"+ltoa(a,10)+".gif";
    9. a++;
    10. MakeUnknown(i,(j+2)-i,3);
    11. MakeByte(i);
    12. MakeArray(i,(j+2)-i);
    13. MakeNameEx(i,s,0x01);
    14. f=fopen(s,"wb");
    15. savefile(f,0,i,(j+2)-i);
    16. fclose(f);
    17. i=j;
    18. }
     
  12. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Ну, для этого не нужен полноценный парсер, вполне достаточно вычисления длины, а это не так уж сложно.
    Код (Text):
    1. ...if (Dword(i)==0x38464947 && Word(i+4)==0x6139)
    2. {
    3. j=13;if (Byte(i+10)&0x80) j=j+(6<<(Byte(i+10)&7));
    4. while (Byte(i+j)!=0x3B)
    5. {
    6. if (Byte(i+j)==0x2C){if (Byte(i+j+9)&0x80) j=j+(6<<(Byte(i+j+9)&7));j=j+11;}else j=j+2;
    7. while (Byte(i+j)) j=j+Byte(i+j)+1;
    8. j=j+1;
    9. }
    10. ...здесь как раньше, только длина фрагмента равна j+1, а не j+2-i...
    11. }
     
  13. Magdy

    Magdy New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    7
    Как элегантно, я-то с дуру выбрал проверку значений байтов, следующих за окончанием файла. ))) Ещё раз спасибо за науку.