Black Falcon 입팀과제 Yoda's Write by FireM@rine
INDEX
Protector
02 CONTENTS 파일보호기법 (Protector) Protector 사용목적 크래킹 (Crackin) 방지 프로그램이크랙되어서불법적으로사용되는것방지 ( 게임보앆프로그램 ) 코드및리소스보호 PE 파일자체를보호하며파일이실행되었을때프로세스메모리를보호하여덤프를뜨지못하게함 특징 리버싱을막기위한다양한기법이추가 프로텍터들로압축된 PE파일들의크기는오히려원본 PE파일보다커지는경향 디버깅하기매우어려움 프로텍터종류 상용프로텍터 : ASProtect, Themida, SVKP 등 공개용프로텍터 : UltraProtect, Morphine, Yoda Protector 등
02 CONTENTS 파일보호기법 (Protector) 파일보호기법이란? Protector 실제악성코드에서사용되고있는실행압축해제를어렵게하는방법 yoda s Crypter, yoda Protecter, PE Crypt 등 암호화, 코드치환, 디버거무력화, API Redirection 등 파일보호시 PEP, OEP 위치
Yoda s Protector Yoda s Cryptor 어셈블리소스를기반으로 Ashkbiz Danehkar가맊든공개용프로텍터 현재마지막버전인 1.03.3를끝으로개발이중단됨 디버깅및디스어셈블링으로부터영향을받지않게맊듦 ( 보호함 ) 대부분의 PE파일을지원하고용량이작음
첫번째주요기능 Ollydbg 를종료시킴 Protector 는여러개의 API 의결합을이용해서모든실행중인프로세스들의 PID 번호를구하고현재실행된프로세스 ( Ollydbg ) 를검색 Protector 는타겟프로세스의 PID 와스스로의 PID 를비교한다음, 서로의 PID 가다르면그프로세스를종료 관렦된핵심 API 함수 : GetCurrentProcessID() 두번째주요기능 Protector 는 API 를이용해서입력장치들을막고사용자를시스템에서차단시키고다른검사들과복호화를시작 검사중에 Protector 가멈추거나 Ollydbg 가발견되면시스템은사용자의지시를기다림 ( 입력장치들이모두차단된상태에서사용자는컴퓨터를재시작할수밖에없음 [Ctrl+Alt+Del 가능 ]) 모든과정이정상적으로진행된다면 Protector 는 API 로차단한입력장치를해제 관렦된핵심 API 함수 : BlockInput()
Calc.exe( 계산기 ) 를 Packing Yoda s Protector 로패킹을하기위해 yp1.03.3 을실행해서패킹할파일을올림 패킹할파일 패킹될파일이름설정
Protect 를클릭하면파일을성공적으로보호했다는메세지창을띄우면서완료 파일크기가 114KB 에서 87KB 으로작아짐 패킹된파일 원본파일
MUP 를하기위해서패킹된 calc.exe 를 Ollydbg( 디버거 ) 안에서로드 OEP 찾기 모든 Exception 무시
BlockInput API 무력화 user32.dll 나올때까지실행 (F9) User32.dll 이로딩되면 Break on new module (DLL) 기능을해제 (Uncheck)
[Options] - [Debugging Option] - [Events] 탭의 "Break on new module (DLL)" 체크 BlockInput API 의실행을가로채기위해서 user32.dll 의로딩을중단해야됨
user32.dll 이로드될때까지 F9(Run) 클릭 Unknown Command 를맊날경우 Shift+F9( 강제실행 ) <Unknown Command 확인 >
user32.dll 로드 <user32.dll 로드 >
"Break on new module (DLL)" 를해제 (Uncheck) 더이상 DLL 로드시마다멈출필요가없음
BlockInput API 를수정하기위해서찾아감 user32.dll 모듈의 BlockInput API 에도달
BlockInput API 를수정해서입력장치들을사용할수있게함 BlockInput API 를없애기위해 RETN 4 전까지모든 code 를 NOP 로채움 RETN 4 에 Break Point BlockInput API 중단
Ollydbg 의종료를막기위해 PID 를얻음 LordPE 를실행해서 Ollydbg.exe 의 PID 를알아냄 (5B8) 참고 - Yoda Protector 는프로세스의 PID 를얻을때모든프로세스들이충돌없이실행되기위해서 CreateToolHelp32Snapshot 함수를사용함 - 스스로의 PID 를얻기위해서 GetCurrentProcessId 함수를사용 - Yoda Protector 는자신을시작한프로세스가자기의 PID 와동일한 PID 를갖고있는지확인 (ex. 보호된파일이 Debugger 를통해시작됐는지여부 ) - 만약 PID 가다르다면보호된파일은그프로세스를종료시킴
GetCurrentProcessId API 를수정하기위해서찾아감 코드화면에서 [Ctrl + G] 를눌러 GetCurrentProcessId 입력 kernel32.dll 모듈의 GetCurrentProcessId API 에도달
GetCurrentProcessId API를수정해서 Ollydbg의종료를막음 GetCurrentProcessId 는보호된파일의 PID를리턴 Ollydbg의 PID를리턴시키기위해변경 보호된파일의 PID가 Ollydbg의 PID라고인식하고 Ollydbg를종료하지않음 나머지는 NOP로채움 Ollydbg 의 PID 인 5B8 로바꿈 Ollydbg 의 PID 를리턴
Ollydbg 를 IsDebugerPresent 검색으로부터숨김 Plug-in 사용 [Plugins] [Olly Advanced] [Options] 클릭
실행후 BlockInput API 의 Break Point 에서두번멈춤 RETN 4 에서 2 번 Break 가걸림
OEP 가있는 code 에 Break Point Memory Map( 단축키 [Alt + M]) 을실행 첫번째섹션에 Set memory breakpoint on access 설정후실행하면 OEP 에도달
OEP 실행 (F9) 후패딩공간을맊나면 Shift + F9( 강제실행 ) OEP
OEP확인후 Dump OllyDump를사용해서덤프 [Plugins] [OllyDump] [Dump debugged process] 클릭 IAT를맞춰줌 ImportREC Tool 이 IAT 를맞춰주는보편적인 Tool
PEiD 로 MUP 전과후를비교