이번 포스팅에서는 x64 환경에서 IAT Hooking을 통해 Microsoft에서 제공되는 Notepad 프로그램의 WriteFile API를 후킹하는 실습을 진행해본다. WriteFile API는 파일을 저장할 때 호출되는 API 이다. 이 때 저장되는 내용을 MessageBoxA API로 띄우도록 해당 API를 Hooking해보도록 한다. [ IAT64.dll ] 여기서 WriteFile이 존재하는 DLL을 api-ms-win-core-file-l1-1-0.dll으로 지정했는데 PE 구조를 살펴본 결과 IAT 상에 저 DLL에 WriteFile API가 존재하기 때문에 저렇게 했다. 그러나, 노트북으로 할 때는 KERNEL32.dll 이기 때문에 다시 수정해서 진행했다. ( 반드시 PE구조를 살펴본..
64비트 MASM으로 작성한 IAT Hooking 자료. 이번 포스팅에서는 위 링크에서 MASM으로 작성한 x64 IAT Hooking 코드를 C언어로 변경한 코드를 소개한다. 자료가 없어서 직접 변경한 소스코드이며, MASM 코드는 x32 IAT Hooking 코드와 크게 다르지 않기 때문에 별도로 포스팅하지 않는다. 어셈블리 튜토리얼 (16) 64비트 api hooking(IAT) - {}.cook(c, c#, java, php, js, asm); 4.5. api hooking(IAT) 마찬가지로 32비트와 크게 다르지 않다. 이전 예제처럼 fastcall함수콜 방식에서 파라메터 설정하는 부분과 메모리주소(포인터)의 크기가 dword가 아닌 qword이라는 점만 제외하면 똑같으니 이 부분만 확인하면서..
이전 포스팅에서 MASM을 이용해 작성한 32bit IAT Hooking에 대해서 소개했다. 이번 포스팅에서는 이 어셈블리 코드를 C언어로 변환해 작성한 코드를 소개한다. 리버싱 핵심원리 책에서 제공된 코드는 현재 환경에서 정상적으로 동작하지 않고, C언어로 작성된 해당 코드가 없기 때문에 진행했다. MASM 32Bit IAT Hooking 포스팅 [MASM] MASM으로 작성한 IAT Hooking을 통한 API Hooking ch4njun.tistory.com [ IAT32.DLL ] [5] : lpApiMessageBoxW 변수는 Dynamic Library상에서 실제 API가 존재하는 주소를 저장하는 공간이다. Hooking 되지 않은 기존 API 호출을 위해 저장한다. [6] : IAT 상에서 ..
우선 이 코드는 MASM 코드로 작성된 것을 보고 작성했으며, 이를 C언어로 그대로 바꿔서 작성했습니다. "리버싱 핵심원리"에 나와있는 코드는 현재 Windows 10 환경에서 제대로 동작하지 않는것을 확인했습니다. 우선 MASM 코드를 살펴보고 분석해보자. [ iat32.asm ] [15] : Import Address Table (FirstThunk) 상에서 Argument로 전달되는 Target API 가 저장된 주소를 반환한다. 이 부분을 그대로 PatchAddress로 전달해 패치한다. [16] : lpOrgProc에 저장된 주소가 가리키는 참조값을 lpNewProc으로 패치한다. lpOrgProc에 저장된 주소가 가리키는 참조값에는 원래 API의 실제코드가 있다. [17, 18] : Targe..
[2] : array의 크기는 10으로 지정. (정수형이기 때문에 x4) [17] : input_data 서브루틴을 호출. 서브루틴 호출은 $ra에 다음 명령어 주소를 저장해야하기 때문에 jal을 사용. [31-32] : 홀수 출력을 통해 $a1에 1을 저장하고 서브루틴 output_data 호출. [37-38] : 짝수 출력을 통해 $a1에 0을 저장하고 서브루틴 output_data 호출. [49-52] : "1, 2, 3, 4, 5 ..." 형태의 문자열을 입력. [60-61] : $t1에 저장된 문자가 쉼표(,) , 엔터(\n) 이면 number_buffer에 저장된 문자열 "300"을 정수로 형변환해 배열에 저장하기위해 if_comma로 점프. [67-68] : $t1에 저장된 문자가 숫자(0-..
역시나 시작은 Register $zero $0 항상 0이 저장되어 있는 Register (수정할 수 없다) $at $1 명령어를 수행하는 동안 임시값이 저장되는 Register ( Assembler Temporary Register ) $v0, $v1 $2, $3 반환값 Register ($v0은 syscall 호출시 사용된다) $a0~$a3 $4~$7 인자 Register (Arguments) $t0~$t7 $8~$15 임시 Register (서브루틴 호출시 저장하지 않는다) $s0~$s7 $16~$23 저장되는 임시 Register (서브루틴 호출시 저장된다) 함수 호출시 함수 시작부분에서 해당 Register를 Stack에 저장한다. $t8, $t9 $24, $25 추가적인 임시 Register $..