전체 글 275

OpenProcess using Native API

빌어먹을 VC6은 OpenProcess API를 지원하지 않는다. 따라서 Thread ID를 HANDLE로 변환시킬 방법이 없는데 검색 결과 Native API(=공개되지 않은 Kernel API)를 사용하여 HANDLE을 얻어와야 한다. 원문 : http://www.codeguru.com/forum/showthread.php?t=329867 typedef DWORD (WINAPI*OTFUNC)(HANDLE*,DWORD,void*,void*); HANDLE OpenThread_VC6(DWORD dwThreadID, BOOL bInherit) { HANDLE hThread = NULL; DWORD struct1[] = {0x18, 0, 0, 0, 0, 0}; DWORD struct2[] = {0,dwThr..

Game Dev/Work Log 2011.07.06

DLL Injector

[ DetourLib.h/cpp ] - MS에서 제공하는 Detour Library를 사용한 Hook [ IAT.h/cpp ] - 프로그램 바이너리의 PE Header에서 IAT(=Import Address Table) 주소를 읽어 그 주소에 기록된 함수의 주소를 변경하는 방법 - 실행 파일마다 PE Header에 IAT가 다르고 IAT에 모든 함수 주소가 존재하는 것은 아니기 때문에 Hooking이 실패할 수도 있음 - MessageBox 함수의 경우 메모장(Notepad)의 IAT에는 존재하지만 그림판(MSPaint)의 IAT에는 존재하지 않았음 [ Jmp.h/cpp ] - Inline Hooking, Detour Hooking으로도 불림 - Hooking을 원하는 함수의 시작 주소에 JMP(= “E..

Game Dev/Binary 2011.07.06

정규표현식을 이용하여 대입문 찾기

상황 어디선가 글로벌 변수에 이상한 값을 대입한다. (글로벌 변수의 효용성/허용성은 논외) 어디서, 누가 값을 대입하는지 찾고 싶다. 시도 1 멤버변수는 그나마 쓰는 곳이 한정되어 있지만 (public이 아닐 경우 자기 클래스 내부) 글로벌 변수는 많은 파일과 범위에서 사용된다. 이 때 VS에서 "g_pValue"를 그대로 찾으면 다음과 같은 쓰레기 정보들도 같이 검색된다. 약 5만 7000여 검색 결과가 나올듯... g_pValueFake = 어쩌고; // 찾기 싫어! if (g_pValue) // 찾기 싫어! g_pValue->Func(); // 싫다고! 시도 2 그래서 이번에는 "g_pValue =" 으로 검색을 해본다. 수는 줄었지만 제대로 될리가 없다. (이 때 찾았으면 행복한 사람!) if (..

Game Dev/Work Log 2011.07.01