security 183

SetWindowsHookEx()를 이용한 DLL Injection

사실 Windows 메시지 후킹 방법이랑 동일하다. 1) 마우스 이벤트에 훅을 걸고 2) calc.exe에서 우클릭 발생 시 "https://web2.0calc.com/" 가 크롬으로 열리는 식으로 구현 // ClickHook.dll #include "stdio.h" #include "windows.h" #define DEF_PROC_NAME "calc.exe" #define CHROME_PATH "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" #define CALC_SITE "https://web2.0calc.com/" HINSTANCE g_hInstance = NULL; HHOOK g_hHook = NULL; BOOL WINAPI DllMa..

CreateRemoteThread()를 이용한 DLL Injection

// InjectDll.exe #include "windows.h" #include "tchar.h" // MSDN에서 제공 BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; HANDLE hToken; LUID luid; // 현재 프로세스의 핸들을 가져와 관련된 액세스토큰을 가져옴 if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) { _tprintf(L"OpenProcessToken error: %u\n", GetLastError()); return FALSE; } // 로컬 시스템에..

HookMain.exe / KeyHook.dll 디버깅

[HookMain.exe] 1) Main 함수 찾기 - Visual C++ stub 코드 존재 (CALL HookMain.01161779 Step over / 들어가서 Ctrl+F9으로 탈출) - HookMain.011610B0 으로 가서 Ctrl+F8 (tracing) 시작 - Main 함수에 bp 걸고 분석 시작 - 또 다른 쉬운 방법은 Search for All referenced text strings (메인함수에서 사용되는 문자열 알기 때문) 2) Main 함수 분석 - CALL EBX 명령어를 따라 들어가면 (Ctrl+F7, Step in) - 73DD1020으로 Jump(Ctrl+G)하면 KeyboardProc() 코드 존재 [KeyHook.dll] 1. 실행중인 notepad.exe att..

SetWindowsHookEx()을 이용한 Windows 메시지 후킹 - (2)

챕터 마지막의 질문글을 보고 SetWindowsHookEx()를 KeyHook.dll이 아니라 HookMain.exe에서 호출해보면 어떨까 싶어서 짜보았다. [계획] SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0); 를 dll이 아닌 HookMain.exe에서 호출하여 훅 체인에 새로운 훅 프로시져를 등록하기 1) SetWindowsHookEx() 함수와 WH_KEYBOARD 상수는 "windows.h" 헤더에 정의되어있음. => OK 2) dll에 정의된 KeyboardProc 함수 포인터(HOOKPROC 타입)를 받아와야 함 => export 함수 GetHookProc() 정의 __declspec(dllexport) HOOKPROC GetHo..

SetWindowsHookEx()을 이용한 Windows 메시지 후킹

// KeyHook.dll #include "stdio.h" #include "windows.h" #define DEF_PROCESS_NAME "notepad.exe" HINSTANCE g_hInstance = NULL; // hook procedure가 속한 DLL 핸들 HHOOK g_hHook = NULL; // Hook 핸들 HWND g_hWnd = NULL; BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpvReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: g_hInstance = hinstDll; break; case DLL_PROCESS_DETACH: break; } retur..

인라인 패치 - unpackme#1

[코드 흐름 분석] 0x401000 (EP) // not encoded ↓ 0x4010E9 // not encoded ↓ 0x401098 // not encoded 디코딩 루프 존재 : 0x4010F5 - 0x401248 xor with 0x44 ↓ 0x4010BD // not encoded 디코딩 루프 존재: 0x401007 - 0x401085 xor with 0x7 디코딩 루프 존재: 0x4010F5 - 0x401248 xor with 0x11 ↓ 0x401039 // xor 7에 의해 decoded 된 상태 checksum 계산 (0x4010F5 - 0x401248 변조 여부 확인) ↓ 0x40108A // not encoded 디코딩 루프 존재: 0x40124A - 0x40127F xor with..

UPack 파일 분석 - HXD, Ollydbg

* PEView는 여전히 Upack 패킹된 파일 분석 못한다... IMAGE_DOS_HEADER [ 0x0 ~ 0x3F ] - "MZ" 시그니쳐 - e_lfanew = 0x10 - 0x2 ~ 0x3B까지는 다른 용도로 쓰인다 DOS Stub 생략 PE Signature [ 0x10 ~ 0x13 ] IMAGE_FILE_HEADER [ 0x14 ~ 0x27 ] - Machine 0x14C, 섹션 수 3개 - Optional Header Size 0x148 => 0xE0보다 크다, 남은 공간은 다른 용도로 쓴다 IMAGE_OPTIONAL_HEADER [ 0x28 ~ 0x16F ] - magic number 0x10B, RVA of EP = 0x1018 - Image Base=0x1000000, Section ..

PE 재배치

[Base Relocation Table] Base Relocation Table 주소 = IMAGE_OPTIONAL_HEADER32.DataDirectory[6] 통해 구함 .reloc 섹션에 존재한다 // Relocation Table (구조체 + WORD 타입 배열) // RVA=1000 단위로 블록 하나씩 추가됨 typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; // RVA DWORD SizeOfBlock; // Size of Relocation Table } IMAGE_BASE_RELOCATION; WORD TypeOffset[N]; // N = (SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION))/2 Ty..