Разбираем REvil. Как известный шифровальщик прячет вызовы WinAPI

Не так давно атаке подверглась международная система денежных переводов Travelex, и виновником этого оказался шифровальщик REvil, чем и привлек мое внимание. Забегая вперед, скажу, что в этом трояне использованы простые, но эффективные методы обфускации, которые не позволяют нам так просто увидеть используемые им вызовы WinAPI. Давай посмотрим, как устроен этот энкодер изнутри.

По доброй традиции загрузим семпл в DiE и поглядим, что он нам покажет.

REvil в приложении DiE

DiE считает, что файл ничем не упакован. Хотя постой-ка, давай переключимся на показания энтропии секций.

REvil в приложении DiE

Судя по названиям секций, файл упакован UPX, но их энтропия выглядит очень странно. Почему тогда DiE не распознал упаковщик? Ну, например, сигнатура UPX может быть намеренно искажена, чтобы запутать дизассемблеры. Так или иначе, перед нами упакованный файл, поэтому загружаемся в отладчик x64dbg. Давай поставим точку останова на функцию VirtualAlloc, которая мелькает у нас в окрестностях точки входа, и запустим троян.

Брякаемся на функции и выходим из нее в наш код. В итоге видим такую картину:

008F9552 | FF55 B4       | call dword ptr ss:[ebp-4C]    | VirtualAlloc
008F9555 | 8945 F0       | mov dword ptr ss:[ebp-10],eax | <---- мы находимся здесь
008F9558 | 8365 DC 00    | and dword ptr ss:[ebp-24],0   |
008F955C | 8B85 58FFFFFF | mov eax,dword ptr ss:[ebp-A8] |
008F9562 | 0FB640 01     | movzx eax,byte ptr ds:[eax+1] |

Осматриваемся дальше, видим интересный кусок кода в конце функции, в которой мы оказались:

00569C10 | 8985 5CFFFFFF | mov dword ptr ss:[ebp-A4],eax |
00569C16 | 8B85 5CFFFFFF | mov eax,dword ptr ss:[ebp-A4] |
00569C1C | 0385 68FFFFFF | add eax,dword ptr ss:[ebp-98] |
00569C22 | C9            | leave                         |
00569C23 | FFE0          | jmp eax                       | Интересный переход!

Не забываем: при отработке функции VirtualAlloc адрес выделенной памяти находится в eax. Ставим точку останова на этот переход, попутно переходим на дамп (адрес в eax) и смотрим, что будет происходить в выделенной памяти. Для этого ставим на начале этой памяти однократную точку останова на запись, и отладчик останавливается на цикле записи данных в память. Вот так выглядит часть цикла:

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *