Доброго всем времени суток, у меня такой вопрос: работаю над файлом, в который зашита всякая хрень - картинки, аудио и прочее, возможно ли все последовательности байтов, которые начинаются, например, с 47 49 46 38 39 61 и заканчиваются байтами 00 3B, автоматически загнать в массивы?
qqwe, да я понимаю, что тут нужен скрипт, просто думал кто-нибудь ссылку на что-то похожее даст или шаблон для скрипта скинет. Всё-таки писать скрипты с нуля - немного тяжеловато.
.. и книжки. например, криса и криса игла (во блин, тоже крис. только что заметил) точнее образ мышления IDA и the IDA PRO book. the unnoficial guide to the ...итд итп. она на идовском сайте в буках рекомендуется ну и еще есть. гугль все находит
qqwe, спасиб, книжку эту (the IDA PRO book) как раз и читаю. Правда, боюсь, процесс осмысления прочитанного займёт некоторое неопределённое время. )))
ну а вы начните с книжки нашего криса. а ихнего с раздела 4. и не читать, а пробегать. ну и примеры + немедленные испытания + написание чегото своего. не надо понимать и разбираться. скрипто-интерфейс иды разрабатывали под хорошую пьянку. свихнетесь. только то, что вам надо
qqwe, "их" Крис тоже доступным языком пишет + читаю, по совету reverser`а, примеры из папки "idc". Думаю, через пару дней общая картина нарисуется. )))
Если "загнать в массивы" означает "удалить все переменные и код, что внутри этих участков IDA насоздавала", то примерно так: (код вводить в диалоге Shift+F2 = File->IDC command, пробелы расставлять по вкусу, сканирование происходит в текущем сегменте, то есть в том, где стоит курсор) Код (Text): auto i,j; for (i=SegStart(here);i<SegEnd(here);i++) if (Dword(i)==0x38464947 && Word(i+4)==0x6139) { for (j=i;j<SegEnd(here);j++) if (Word(j) == 0x3B00) break; Message("creating array at %x with size %x\n", i, j-i); MakeUnknown(i,j-i,3); MakeByte(i); MakeArray(i,j-i); i=j; } Если, например, нужно вынести все такие последовательности в файлы с именами 1.gif,2.gif,..., то примерно так: Код (Text): auto i,j,a,s,f; a=1; for (i=SegStart(here);i<SegEnd(here);i++) if (Dword(i)==0x38464947 && Word(i+4)==0x6139) { for (j=i;j<SegEnd(here);j++) if (Word(j) == 0x3B00) break; s=ltoa(a,10)+".gif";a++; f=fopen(s,"wb"); savefile(f,0,i,j-i); fclose(f); i=j; } Перед экспериментами базу на всякий случай лучше сохранить, чтобы была возможность откатиться при ошибке.
diamond, ещё раз спасибо за Вашу помощь, всё работает, вот только некоторыё Gif`ы скрипт не совсем корректно распознаёт из-за того, что в теле изображения есть дополнительные байты 00 и 3B. Можно это как-нибудь попроще обойти, без написания полноценного парсера? Код (Text): auto i,j,a,s,f; a=1; for (i=SegStart(here);i<SegEnd(here);i++) if (Dword(i)==0x38464947 && Word(i+4)==0x6139) { for (j=i;j<SegEnd(here);j++) if (Word(j) == 0x3B00) break; Message("creating array at %x with size %x\n", i, j-i); s="_"+ltoa(a,10)+".gif"; a++; MakeUnknown(i,(j+2)-i,3); MakeByte(i); MakeArray(i,(j+2)-i); MakeNameEx(i,s,0x01); f=fopen(s,"wb"); savefile(f,0,i,(j+2)-i); fclose(f); i=j; }
Ну, для этого не нужен полноценный парсер, вполне достаточно вычисления длины, а это не так уж сложно. Код (Text): ...if (Dword(i)==0x38464947 && Word(i+4)==0x6139) { j=13;if (Byte(i+10)&0x80) j=j+(6<<(Byte(i+10)&7)); while (Byte(i+j)!=0x3B) { 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; while (Byte(i+j)) j=j+Byte(i+j)+1; j=j+1; } ...здесь как раньше, только длина фрагмента равна j+1, а не j+2-i... }
Как элегантно, я-то с дуру выбрал проверку значений байтов, следующих за окончанием файла. ))) Ещё раз спасибо за науку.