Разбираю дизассемблерный листинг одной программы и возникла проблема. При дизассембрировании некой внутренней функции возникает такой листинг: Code (Text): ... 0040384F . 894B 04 MOV DWORD PTR DS:[EBX+4],ECX 00403852 . 8933 MOV DWORD PTR DS:[EBX],ESI 00403854 . 8943 0C MOV DWORD PTR DS:[EBX+C],EAX 00403857 . 8953 10 MOV DWORD PTR DS:[EBX+10],EDX 040385A 66 DB 66 ; CHAR 'f' 0040385B 0F1F4400 DD xxx.00441F0F 0040385F 00 DB 00 00403860 > 891C24 MOV DWORD PTR SS:[ESP],EBX 00403863 . B8 02000000 MOV EAX,2 00403868 . 89D6 MOV ESI,EDX 0040386A . 894424 04 MOV DWORD PTR SS:[ESP+4],EAX .... Что значат эти нераспознанные инструкции? Скорее всего это вызов функции, т.к. выше через стек передаются параметры, но почему тогда и olly, и IDA, и Hiew едут крышей при дизасме.
66 - префикс изменения 32/16 бит операнда. 0f - означает что дальше идет расширенный код. Правильно наверно так: 66 0F1F44 0000 - операция с 16-разрядным операндом вместо 32-разрядного, с опкодом 0F1F и mod|rm 44. Операнд 16-битный - 0000. Что за операция - надо в мануале смотреть. Но кажется - NOP )))
Всего лишь nop? И зачем интересно компилятор так извращался? Чтобы с толку сбить? Причем я бы еще понял, если бы она была на асме написана, но она же написана на С!
да это действительно ноп. все от 0f 19 до 0f 1e нопы без байта mod:reg:rm. 0f 1f это ноп с байтом mod:reg:rm. 0f 18 вообщем то тоже ноп И 4 префетча (группа). Я кстати когдато этими нопами антивири отправлял курить в сторонку =)
Т.е. код вручную правили? Кстати, при трассировке команды отладчик действительно никаких изменений в регистрах не показывает (кроме EIP, конечно).
Нет, прога во-первых большая, ну и на C или на ассемблере она написана я смогу отличить по листингу. Точно на C.
Скорее всего код вставил именно компилятор Си. Просто использовалось что-нибудь типа Align 16, стандартный вход в процедуру скомпилировался как есть, потом компилер решил сделать этот самый ALIGN, и подыскал наиболее оптимальный NOP на 6 байт размером. Следующая после него команда начинается с кратного 16 адреса.
Поиск по "66 0F 1F 44 00" на Гугле дает любопытные результаты. А вот что советует Интел : Table 4-1. Recommended Multi-Byte Sequence of NOP Instruction Length Assembly Byte Sequence 2 bytes 66 NOP 66 90H 3 bytes NOP DWORD ptr [EAX] 0F 1F 00H 4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H 5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H 6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H 7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H 8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H 9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H Это гарантия, что какая-то прога для виртуалок не использует это как спец-прерывание...
В х64 VC практикует, причем пачками, "666690", как "xchg ax,ax". Ида об этом байтосочетании не знает.
помнится я както тут выкладывал таблы всех команд и их вариаций...если загнать их в иду то видно что она много чего не знает.
IDA 5.1 what's new Не оно? Edit: вот кстати из 5.2 Code (Text): CODE:00000000 db 66h CODE:00000000 66 90 nop CODE:00000002 0F 1F 00 nop dword ptr [eax] CODE:00000005 0F 1F 40 00 nop dword ptr [eax+00h] CODE:00000009 0F 1F 44 00 00 nop dword ptr [eax+eax+00h] CODE:0000000E 66 0F 1F 44 00 00 nop word ptr [eax+eax+00h] CODE:00000014 0F 1F 80 00 00 00 00 nop dword ptr [eax+00000000h] CODE:0000001B 0F 1F 84 00 00 00 00 00 nop dword ptr [eax+eax+00000000h] CODE:00000023 66 0F 1F 84 00 00 00 00 00 nop word ptr [eax+eax+00000000h]
итак ида 5.2.0908 пажалста =) Code (Text): seg000:003211E1 prefetcht2 byte ptr [ebp+0] seg000:003211E8 prefetcht2 byte ptr [esi+0] seg000:003211EF prefetcht2 byte ptr [edi+0] seg000:003211EF ; --------------------------------------------------------------------------- seg000:003211F6 db 0Fh seg000:003211F7 db 18h seg000:003211F8 db 20h seg000:003211F9 db 0Fh seg000:003211FA db 18h seg000:003211FB db 21h ; ! seg000:003211FC db 0Fh seg000:003211FD db 18h seg000:003211FE db 22h ; " seg000:003211FF db 0Fh seg000:00321200 db 18h seg000:00321201 db 23h ; # seg000:00321202 db 0Fh seg000:00321203 db 18h seg000:00321204 db 24h ; $ seg000:00321205 db 0 seg000:00321206 db 0Fh seg000:00321207 db 18h seg000:00321208 db 24h ; $ seg000:00321209 db 1 seg000:0032120A db 0Fh seg000:0032120B db 18h seg000:0032120C db 24h ; $
reverser Вот видишь, 66 90 не распознаёт. Или это не команда? WinDbg говорит "xchg ax,ax", но мало ли..
Именно так оно и есть. Вот что написано перед той таблицей, что я привел : The one-byte NOP instruction is an alias mnemonic for the XCHG (E)AX, (E)AX instruction. значит 66 90 - xchg ax,ax А вот hiew 7.26 понимает только nop 1 и 2 байта - а дальше труба. Про спец-прерывание я ступил - в виртуалках используют запрещенные команды. Вот в эмуляторах можно сделать любую команду специальной.
Статьи Криса Касперски... http://www.dotfix.net/module.php?module=@6e786b3667787162786e77607062 атака через back door Для управления виртуальной машиной многие эмуляторы используют специальный (и, по обыкновению, недокументированный) back door механизм вроде того, что есть в soft-ice (см. INT 03h в Interrupt List’е Ральфа Брауна). Virtual PC использует для той же цели инвалидные инструкции процессора (например, 0Fh 3Fh 07h 0Bh), а VM Ware "магический" порт ввода/вывода VM Ware поддерживает большое количество самых различных команд, подробно исследованных Ken’ом Kato и описанных в его статье "VMware’s back" (http://chitchat.at.infoseek.co.jp/vmware/backdoor.html).