Pull to refresh

Comments 36

Может кто-то упустил — демо версия IDA-ы теперь поставляется с x64 декомпилятором. Если у вас нет непубилчной электронной почты — можно воспользоваться сервисом для генерации email адреса на 10 минут. Хватит чтобы получить письмо по реквесту и скачать демку.
Так то у них и фриваре есть, скачивается без всяких почт — IDA Freeware

  • 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


Я именно ей и … эмм… добавлял функционал в один САПР (эх, когда-нибудь допишу стать про это увлекательное действо)

Не смешите. Этим пользоваться невозможно.

Ни скриптов, ни плагинов, не обновляется, базы не сохраняет. Смешно же.

Наоборот, Freeware базы сохраняет, а вот Demo не сохраняет.
Чуть ли не самый нужный и важный компонент — декомпилятор. От одного только дизассемблера смысла особо нет
Имхо, не всегда от одного дизассемблера смысла особо нет. В анализе какого-нибудь обфусцированного кода декомпилятор может стать бесполезным.
Или иногда до декомпилятора дело не доходит, в дизассемблере становится понятно, что происходит.
P.S. Отличная статья, спасибо автору.
А после распаковки, когда код нормальный — всё равно лучше иметь декомпилятор, чем не иметь.
Все проблемы можно решить WD-40, скотчем или отладчиком. И если проблема не решается, значил мало WD-40 или мало скотча или отладчик не той разрядности.
Кстати, а есть сейчас инструменты более легковесные, чем мощные профессиональные декомпиляторы? Например типа утилиты hiew, только в современном интерфейсе.
Что-то типа шестнадцатеричного редактора, совмещенного с ассемблером/дизассемблером, работающим «на лету». Т.е. скажем окно разделено на две части, вводишь несколько 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'и все сделают за нас, зачем напрягаться. Прям гарик из Губермана вспоминается:

Наука Коммерческий open-source в нас изменит все, что нужно,
и всех усовершенствует вполне,
мы станем добродетельно и дружно
блаженствовать — как мухи на гавне.
IDA по началу пугает и кажется ужасной, но свое дело делает очень хорошо.
Попытка перейти на Ghidra провалилась, не то из за лени, не то всё таки пока недотягивает.

По мне так, основной недостаток это отсутствие дебаггера, скорость анализа. Интерфейс гидры несомненно требует тренировок — отлИчные от ИДЫ хоткеи и новое окошко на каждый открытый пункт меню — это вообще неудобно. В ИДЕ гораздо удобнее это реализовано через tab-control-ы.

Мне вот, как человеку, который имеет хобби реверс-инжиниринга игр на старые платформы, типа Sega MD, PSX, AmigaOS, Гидра зашла очень хорошо, т.к. обладает всем, чем должна обладать среда реверс-инжиниринга данных платформ.

Например, на PSX есть оверлеи: блоки, которые имеют один и тот же адрес и размер, но могут содержать разные данные, в зависимости от загруженных в них данных. Гидра имеет типы блоков Byte Mapped, BitMapped, Overlay — самое оно.
Я давно забросил реверс. Как-то стало не интересно, что-ли. По старой памяти в закромах есть очень старенький IDA Pro, который эпизодически расчехляется для проверки того я косячу или все же закрытая библиотека не очень здорово написана (речь в основном об ARM Cortex-M). Бывает это крайне редко, но бывает. Посмотреть гидру все никак руки не доходят. Наверное пора. Да Radare2 смотрел. Интересный инструмент, но после даже старых версий IDA как-то не прижился.

Спасибо за статью. Вы еще на шаг подвинули меня к скачиванию и опробованию наконец этой самой Гидры.
> Я давно забросил реверс. Как-то стало не интересно, что-ли.

Мой камент habr.com/ru/post/480824/#comment_21116368 выше. Пришли большие корпорации и обо%^%ли всю романтику. Также серьезно подкосил тот факт, что теперь большинство аудитории RE-тулз это не чуваки которые смотрят, «или все же закрытая библиотека не очень здорово написана» и заодно переписывают ее в OpenSource, а сецурити-рысерчеры, которые колупаются во всяких помойных бинарниках, ища старые openssl-баги. Фуууу, тошнота ;-).

> Интересный инструмент, но после даже старых версий IDA как-то не прижился.

github.com/pfalcon/ScratchABit, закос под иду версии где-то 4й. Никакой гуйни, только терминал, только хардкор. Писал по памяти, может чё не так. Главное, что никаких цэ-ха-ха и перекомпиляций. Что-то не так? Пропатчил и перезапустил.
Спасибо. Посмотрю при случае. Кстати к GUI в IDA очень долго привыкал. Навигация по JMP'ам и CALL'ам в консоли долго казалась более удобной. Да и обзорность у консоли лучше. На современном мониторе развернутая консоль — это не VGA 80x25 символов. Есть в ней своя прелесть.

Хм… как раз сегодня дошли руки до подкаста Noise Security Bit #0x25 (о Ghidra и прочих дизассемблерах) (автор — matrosov):


Авторский поток сознания на тему инструментов для обратного анализа. В частности сравниваются наиболее популярные инструменты такие как: IDA, Ghidra и прочие Binary Ninja.

Совпадение или статья своего рода "ответка"?

Спасибо, гляну.
Да, это действительно совпадение, но неудивительное. Т.к. Гидра сейчас очень популярной стала. А точнее, у меня это после общения с саппортом Иды накипело.
К сожалению, добавлять новые элементы в голосование не могу. Насколько хорош этот декомпилятор?
Там какой-то Питон нужен, я вроде его поставил, но что-то всё равно не стыкуется. Думал, может, надо 32битный Питон ещё поставить, тоже поставил. В общем, у кого-то работает, но явно не у меня. Хрупкие все эти Питоны, ломаются на раз-два.

Жуть какая-то, а не декомпилятор: на 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;
}

Как декомпилирует эту же функцию гидра (потребляя ~ 1 гигабайт при анализе файла)
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
Слушайте, посмотрел я на результаты декомпиляции… Потом на листинг… Потом еще раз на результаты декомпиляци… и возник у меня вопрос. Скажите, а вам как реверс-мастеру правда нужен декомпилятор? Мои допотопный IDA Pro если его и содержит, то я им не пользовался никогда. Глаз видимо к дизассемблеру пристрелялся. Особенно с учетом толково проставляемых IDA комментариев (и, особенно, правильной простановке констант как в примерах ниже '.' '/' ':'. По мне с такого толку сильно больше, чем в таком декомпилированном коде.

Серьезно — просто интересно. Без всяких претензий.
Полезно иногда как способ ужать вывод дизассемблера без покупки 30дюймовой ретины
> Глаз видимо к дизассемблеру пристрелялся.

> Серьезно — просто интересно. Без всяких претензий.

Вопрос с подколкой… У вас глаз к какому количеству мегабайт такого дизассемблера в день пристрелялся? А к скольким архитектурам, где каждый вендор из кожи вон лезет, чтобы сделать мнемоники непохожими на других (иначе другие его засудят, как же так, он назвал свою инструкцию MOV, спер наше IP!!11)?

Вы как хотите, а мы свой моск в помойку превращать не желаем. Нам-с подавайте платфорно-независимый ассемблер, с элементами структурного синтаксиса. В народе также известен как «C».
Подкол засчитан. Действительно, если собрать все мои работы с реверсом, то может байт на 200 в день и набежит. Реально редко. Но потому и вопрос задал.

Мне просто показалось, что такая декомпиляция скорее путает, чем помогает. Впрочем, ответ в стиле «регулярно работаем и понимаем где читать, где не читать, а где селедку заворачивать» меня вполне устроит. Уточнять дальше я не буду.

А ваше определение языка С я, пожалуй, запомню. Мне оно понравилось.
Sign up to leave a comment.

Articles