Comments 36
- no commercial use is allowed
- lacks all features introduced in IDA > v7.0
- lacks support for many processors, file formats, etc...
- comes without technical support
Я именно ей и … эмм… добавлял функционал в один САПР (эх, когда-нибудь допишу стать про это увлекательное действо)
Чуть ли не самый нужный и важный компонент — декомпилятор. От одного только дизассемблера смысла особо нетИмхо, не всегда от одного дизассемблера смысла особо нет. В анализе какого-нибудь обфусцированного кода декомпилятор может стать бесполезным.
Или иногда до декомпилятора дело не доходит, в дизассемблере становится понятно, что происходит.
P.S. Отличная статья, спасибо автору.
Что-то типа шестнадцатеричного редактора, совмещенного с ассемблером/дизассемблером, работающим «на лету». Т.е. скажем окно разделено на две части, вводишь несколько hex-кодов в область слева — тут же получаешь дизассемблированный код справа, вводишь ассемблерный код — тут же налету он компилируется в hex-код.
Вот это все интересует для основных архитектур, не только x86, x86-64, но и ARM, MIPS, IA-64 и т.д.
Но чуть запутаннее, чем >окно разделено на две части
В radare2 по сути такой функционал (и в его gui-фронтенде Cutter), особенно это заметно, когда прокручиваешь листинг в visual режиме. Иногда это хорошо, иногда нет.
Я начал пилить github.com/pfalcon/ScratchABlock до того, как за-opensource'или Binnavi, потом RetDec, потом Ghidra. Но после того, как в моей сорсо-мусорксе накопилось штук 20 сторонних проектов, и я понял, что «не нужно ждать милости от природы». OpenSource-нье той троицы разумеется серьезно изменило scene, я теперь поменьше за тем кодом, побольше на пляже ;-). Не тороплюсь, жду, может google'ы, avast'ы и nsa'и все сделают за нас, зачем напрягаться. Прям гарик из Губермана вспоминается:
и всех усовершенствует вполне,
мы станем добродетельно и дружно
блаженствовать — как мухи на гавне.
Попытка перейти на Ghidra провалилась, не то из за лени, не то всё таки пока недотягивает.
По мне так, основной недостаток это отсутствие дебаггера, скорость анализа. Интерфейс гидры несомненно требует тренировок — отлИчные от ИДЫ хоткеи и новое окошко на каждый открытый пункт меню — это вообще неудобно. В ИДЕ гораздо удобнее это реализовано через tab-control-ы.
Например, на PSX есть оверлеи: блоки, которые имеют один и тот же адрес и размер, но могут содержать разные данные, в зависимости от загруженных в них данных. Гидра имеет типы блоков Byte Mapped, BitMapped, Overlay — самое оно.
Спасибо за статью. Вы еще на шаг подвинули меня к скачиванию и опробованию наконец этой самой Гидры.
Мой камент habr.com/ru/post/480824/#comment_21116368 выше. Пришли большие корпорации и обо%^%ли всю романтику. Также серьезно подкосил тот факт, что теперь большинство аудитории RE-тулз это не чуваки которые смотрят, «или все же закрытая библиотека не очень здорово написана» и заодно переписывают ее в OpenSource, а сецурити-рысерчеры, которые колупаются во всяких помойных бинарниках, ища старые openssl-баги. Фуууу, тошнота ;-).
> Интересный инструмент, но после даже старых версий IDA как-то не прижился.
github.com/pfalcon/ScratchABit, закос под иду версии где-то 4й. Никакой гуйни, только терминал, только хардкор. Писал по памяти, может чё не так. Главное, что никаких цэ-ха-ха и перекомпиляций. Что-то не так? Пропатчил и перезапустил.
Хм… как раз сегодня дошли руки до подкаста Noise Security Bit #0x25 (о Ghidra и прочих дизассемблерах) (автор — matrosov):
Авторский поток сознания на тему инструментов для обратного анализа. В частности сравниваются наиболее популярные инструменты такие как: IDA, Ghidra и прочие Binary Ninja.
Совпадение или статья своего рода "ответка"?
Жуть какая-то, а не декомпилятор: на 3-х мегабайтной DLL'ке упал с нехваткой памяти (на хосте 24 гигабайта). Над 2-х мегабатной ntdll.dll работал 3198.20s (53 минуты), в пике выедал 12 гигабайт оперативы.
В результате:
// Address range: 0x18002f0a0 - 0x18002f0df
int64_t RtlDetermineDosPathNameType_U(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5) {
// 0x18002f0a0
g1005 = a4;
g1008 = a2;
g1006 = a1;
g1000 = a5 & -0x10000 | 92;
g1007 = a3 & -0x10000 | 47;
int16_t v1 = a4;
if (v1 == 92) {
// 0x18002f0d4
return g1002;
}
if (v1 == 47) {
// 0x18002f0d4
return g1002;
}
if (v1 == 0 || *(int16_t *)(a4 + 2) != 58) {
// 0x18002f0ce
g1002 = 5;
return 5;
}
// 0x18002f0c1
if (*(int16_t *)(a4 + 4) != 92) {
// bb
g1002 = function_18002f107(a1, a2, 47, a4);
}
// 0x18002f0c8
g1002 = 2;
return 2;
}
// Address range: 0x18002f107 - 0x18002f113
int64_t function_18002f107(int64_t a1, int64_t a2, int64_t a3, int64_t a4) {
// 0x18002f107
g1005 = a4;
g1007 = a3;
g1008 = a2;
g1006 = a1;
g1002 = 3;
return 3;
}
ulonglong RtlDetermineDosPathNameType_U(short *param_1)
{
short sVar1;
/* 0x2f0a0 905 RtlDetermineDosPathNameType_U */
if ((*param_1 != 0x5c) && (*param_1 != 0x2f)) {
if ((*param_1 == 0) || (param_1[1] != 0x3a)) {
return 5;
}
if ((param_1[2] != 0x5c) && (param_1[2] != 0x2f)) {
return 3;
}
return 2;
}
if ((param_1[1] != 0x5c) && (param_1[1] != 0x2f)) {
return 4;
}
if ((param_1[2] != 0x3f) && (param_1[2] != 0x2e)) {
return 1;
}
sVar1 = param_1[3];
if ((sVar1 != 0x5c) && (sVar1 != 0x2f)) {
return (ulonglong)((-(uint)(sVar1 != 0) & 0xfffffffa) + 7);
}
return 6;
}
Как оно должно примерно выглядеть (https://doxygen.reactos.org/d0/d23/sdk_2lib_2rtl_2path_8c.html#a1513c153ef5a711f294d8f3254c0212b)
RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U ( IN PCWSTR Path )
{
if (IS_PATH_SEPARATOR(Path[0]))
{
if (!IS_PATH_SEPARATOR(Path[1])) return RtlPathTypeRooted;
if ((Path[2] != L'.') && (Path[2] != L'?')) return RtlPathTypeUncAbsolute;
if (IS_PATH_SEPARATOR(Path[3])) return RtlPathTypeLocalDevice;
if (Path[3]) return RtlPathTypeUncAbsolute;
return RtlPathTypeRootLocalDevice;
}
else
{
if (!(Path[0]) || (Path[1] != L':')) return RtlPathTypeRelative;
if (IS_PATH_SEPARATOR(Path[2])) return RtlPathTypeDriveAbsolute;
return RtlPathTypeDriveRelative;
}
}
0:000> u 0x18002f0a0
ntdll!RtlDetermineDosPathNameType_U:
00000001`8002f0a0 6641b85c00 mov r8w,5Ch
00000001`8002f0a5 66ba2f00 mov dx,2Fh
00000001`8002f0a9 66443901 cmp word ptr [rcx],r8w
00000001`8002f0ad 7425 je ntdll!RtlDetermineDosPathNameType_U+0x34 (00000001`8002f0d4)
00000001`8002f0af 663911 cmp word ptr [rcx],dx
00000001`8002f0b2 7420 je ntdll!RtlDetermineDosPathNameType_U+0x34 (00000001`8002f0d4)
00000001`8002f0b4 66833900 cmp word ptr [rcx],0
00000001`8002f0b8 7414 je ntdll!RtlDetermineDosPathNameType_U+0x2e (00000001`8002f0ce)
00000001`8002f0ba 668379023a cmp word ptr [rcx+2],3Ah
00000001`8002f0bf 750d jne ntdll!RtlDetermineDosPathNameType_U+0x2e (00000001`8002f0ce)
00000001`8002f0c1 6644394104 cmp word ptr [rcx+4],r8w
00000001`8002f0c6 753f jne ntdll!RtlDetermineDosPathNameType_U+0x67 (00000001`8002f107)
00000001`8002f0c8 b802000000 mov eax,2
00000001`8002f0cd c3 ret
00000001`8002f0ce b805000000 mov eax,5
00000001`8002f0d3 c3 ret
00000001`8002f0d4 6644394102 cmp word ptr [rcx+2],r8w
00000001`8002f0d9 0f8503180800 jne ntdll!RtlDetermineDosPathNameType_U+0x81842 (00000001`800b08e2)
00000001`8002f0df 668379043f cmp word ptr [rcx+4],3Fh
00000001`8002f0e4 7514 jne ntdll!RtlDetermineDosPathNameType_U+0x5a (00000001`8002f0fa)
00000001`8002f0e6 0fb74106 movzx eax,word ptr [rcx+6]
00000001`8002f0ea 66413bc0 cmp ax,r8w
00000001`8002f0ee 0f85fe170800 jne ntdll!RtlDetermineDosPathNameType_U+0x81852 (00000001`800b08f2)
00000001`8002f0f4 b806000000 mov eax,6
00000001`8002f0f9 c3 ret
00000001`8002f0fa 668379042e cmp word ptr [rcx+4],2Eh
00000001`8002f0ff 74e5 je ntdll!RtlDetermineDosPathNameType_U+0x46 (00000001`8002f0e6)
00000001`8002f101 b801000000 mov eax,1
00000001`8002f106 c3 ret
00000001`8002f107 66395104 cmp word ptr [rcx+4],dx
00000001`8002f10b 74bb je ntdll!RtlDetermineDosPathNameType_U+0x28 (00000001`8002f0c8)
00000001`8002f10d b803000000 mov eax,3
00000001`8002f112 c3 ret
Серьезно — просто интересно. Без всяких претензий.
> Серьезно — просто интересно. Без всяких претензий.
Вопрос с подколкой… У вас глаз к какому количеству мегабайт такого дизассемблера в день пристрелялся? А к скольким архитектурам, где каждый вендор из кожи вон лезет, чтобы сделать мнемоники непохожими на других (иначе другие его засудят, как же так, он назвал свою инструкцию MOV, спер наше IP!!11)?
Вы как хотите, а мы свой моск в помойку превращать не желаем. Нам-с подавайте платфорно-независимый ассемблер, с элементами структурного синтаксиса. В народе также известен как «C».
Мне просто показалось, что такая декомпиляция скорее путает, чем помогает. Впрочем, ответ в стиле «регулярно работаем и понимаем где читать, где не читать, а где селедку заворачивать» меня вполне устроит. Уточнять дальше я не буду.
А ваше определение языка С я, пожалуй, запомню. Мне оно понравилось.
GHIDRA vs. IDA Pro