/\ /\ / \_ _/ \ ____/ /__ T E A M . F I F T Y . T H R E E __\ \____ \__ ____\\- ____ -//____ __/ / /_____ ______\ \__________\ \ _/ /_\ \_________________________-// // ____/ /_\ \_ __\ _\ ____ /___ _ \_ \/ // ___\/_ /__ ))______________\_ _______\_|__ /____\/_____\ /gf _/______________(( \___\\- /___//- /____((- TEAM FiFTY THREE TUTORiALS PACK # SEVENTEEN Обфускация Кода Автор..: zyzygy Перевод: NightCat//TEAM-53 1. Теория Что я понимаю под обфускацией кода? Обфускаци - это когда код спрятан внутри кусков мусорных данных. Этот трюк сейчас часто используется в упаковщиках. 2. Практика Я предалгаю попрактиковаться с двумя программами: Редактор.: RADASM Assembler: MASM32 Я буду использоваться вот этот код в данной статье. Он ничего не делает, а лишь выводит два окошка с сообщениеями. .386 .model flat, stdcall ;32 bit memory model option casemap :none ;case sensitive include windows.inc include kernel32.inc include user32.inc include shell32.inc includelib kernel32.lib includelib user32.lib includelib shell32.lib .data caption db "Fine",0 text db "Hi!",0 text1 db "Bye!",0 .code start: assume fs:nothing ;устанавливаем SEH, если дела идёт криво push _seh push fs:[0] mov fs:[0],esp invoke MessageBox,NULL,addr text,addr caption,MB_OK call @call @call:pop eax ;дельта-оффсет add eax,0Eh ;добавляем в ЕАХ кол-во байт, чтобы очутиться в настоящем коде. jmp eax ;прыгаем в настоящий код, чтобы он начал исполняться. dd 00E95564h ;мусор, рэндомно dd 0E9830048h cmp eax,1 ;Настоящий код jne next jmp exit next: invoke MessageBox,NULL,addr text1,addr caption,MB_OK exit: invoke ExitProcess,0 _seh: pop fs:[0] mov ebx,[esp+4] mov esp,ebx jmp next end start А вот мусорный код: dd 00E95564h dd 0E9830048h Он замаскирует настоящий код. Теперь мы всё это ассембриуем и загружаем в дебаггер (Я использовал Ollydbg). 00401026 . E8 00000000 CALL testt.0040102B 0040102B $ 58 POP EAX 0040102C . 83C0 0E ADD EAX,0E 0040102F . FFE0 JMP EAX 00401031 64 DB 64 ; 'd' 00401032 55 DB 55 ; 'U' 00401033 E9 DB E9 00401034 . 0048 00 ADD BYTE PTR DS:[EAX],CL 00401037 . 83E9 83 SUB ECX,-7D 0040103A . F8 CLC 0040103B . 0175 02 ADD DWORD PTR SS:[EBP+2],ESI 0040103E . EB 13 JMP SHORT testt.00401053 Наш главный код лежит по адресу 00401039. Во время трассировки мы находим, что выполняется CMP EAX, 1. Если такой мусорный код был по всему настоящему коду, тогда результат мог бы быть более искажённым. ДЛя этого нам нужно использовать макросы. Наш главный мусорный код должен быть макросом и мы должны иметь возможность вызывать его тогда, когда захотим. Macro: garbage macro db 0e8h,00,00,00,00 ;call to get delta offset pop eax ;delta offset add eax,0Ch ;add the necessary bytes to jump to the actual code jmp eax ;jump to the actual code dw 8965h ;garbage values dd 70e9a654h ;garbage values endm Этот маркос со всем спраляется. Я хочу заострить внимание только на одном. ВО время вызовов APIшек, убедитесь, что вы используете "call keyword" вместо "invoke keyword". Это даст вам больше места для добавления мусорного кода. Итак, вот наш новый код с макоросом: garbage macro db 0e8h,00,00,00,00 pop eax add eax,0Ch jmp eax dw 8965h dd 70e9a654h endm .data caption db "Fine",0 text db "Hi!",0 text1 db "Bye!",0 data db 00h .code start: assume fs:nothing push _seh push fs:[0] mov fs:[0],esp invoke MessageBox,NULL,addr text,addr caption,MB_OK мусор cmp eax,1 мусор je next next: мусор push 0 push offset caption мусор push offset text1 push 0 мусор call MessageBox мусор push 0 мусор call ExitProcess _seh: pop fs:[0] мусор mov ebx,[esp+4] mov esp,ebx мусор jmp next end start Как вы может видеть, я свободно использовал марко macro и во время ассемблирования и загрузки всего этого дела в дебаггер, вот, что вы увидите (только кусок): 0040104A . 70 74 00 ASCII "pt",0 0040104D > E8 00000000 CALL test.00401052 00401052 $ 58 POP EAX 00401053 . 83C0 0C ADD EAX,0C 00401056 . FFE0 JMP EAX 00401058 65 DB 65 ; 'e' 00401059 89 DB 89 0040105A 54 DB 54 ; 'T' 0040105B A6 DB A6 0040105C E9 DB E9 0040105D . 70 6A 00 ASCII "pj",0 00401060 > 68 00304000 PUSH test.00403000 ; ASCII "Fine" 00401065 . E8 00000000 CALL test.0040106A 0040106A $ 58 POP EAX 0040106B . 83C0 0C ADD EAX,0C 0040106E . FFE0 JMP EAX 00401070 . 65:8954A6 E9 MOV DWORD PTR GS:[ESI-17],EDX 00401075 . 70 68 JO SHORT test.004010DF 00401077 . 0930 OR DWORD PTR DS:[EAX],ESI 00401079 . 40 INC EAX 0040107A . 006A 00 ADD BYTE PTR DS:[EDX],CH 0040107D . E8 00000000 CALL test.00401082 00401082 $ 58 POP EAX 00401083 . 83C0 0C ADD EAX,0C 00401086 . FFE0 JMP EAX 00401088 65 DB 65 ; 'e' 00401089 89 DB 89 0040108A 54 DB 54 ; 'T' 0040108B A6 DB A6 0040108C E9 DB E9 0040108D 70 DB 70 ; 'p' 0040108E . E8 63000000 CALL ;\MessageBoxA 00401093 . E8 00000000 CALL test.00401098 00401098 $ 58 POP EAX 00401099 . 83C0 0C ADD EAX,0C Искажённый код. Только во время трассировки можно нормально взглянуть на настоящий код. Чем больше вы знаете о конструкции опкодов, тем лучшие и алгоритмы вы можете создать. Стэк тут очень полезен. Вы можете хранить там адреса джампов, например. Еще можно спрятать ваши джампы. Один из самых простых путей - использовать регистры для джампов. Вот например нах обычный hardcoded-jump: 0044F42E |. 74 06 JE SHORT 0044F436 В дебагерре мы видим адрес 0044F436. Но если вы кое-что измените: mov eax, 0044F436 jmp eax Ассемблер может, а может и не собрать это как обычный джамп на 0044F436. Ну ив заключение статьи вот еще один пример. Макро внутри макро: garbage1 macro dw 025FFh add ebx,26h db 53h,0C3h dw 025ffh endm garbage macro db 0e8h,00,00,00,00 pop eax cmp data,1 ;проверка, которая решит что делать - jmp eax/push ebx & ret db 074h,10h mov ebx,eax add eax,13h db 0ebh,0Ch garbage1 add eax,26h jmp eax dw 8965h dd 0560cee8h db 00h endm Я написал еще один марос и вызываю его из первого. Если вы посмотрите на импорт, FF25 в OllyDbg (или любом другом дебаггере) используется в качестве JMP DWORD PTR. Так что я использовал это как мусорный код. Мы просто грузим правильный адрес для джампа прямо в ebx, кладём в стэк и возвращем. Довольно распостранённый приём. Ассемблируйте и засуньте в дебаггер. КОНЕЦ Это лишь самые азы обфускации кода. Существует масса всевозможных концептов и идей, которые можно использовать для обфускации. Я надеюсь эта статья помогла вам.