Game Dev 150

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

NDC2011 - 메이플스토리 개발스토리 Legacy Code - 유산과 함께 살아가기

김준엽 (넥슨 라이브팀) 다른 팀에서 근무하다가 도중에 메이플 스토리로 팀을 옮기게 됐다고 한다. 성공한 게임을 개발한 팀에서 개발하게 된다는 환상 뒤에는 서비스 8년(개발한지는 거의 10년)이 된 낡은 코드와 시스템이 있었다. 퀘스트 편집기라는 툴이 있는데 MFC와 변형된 Component인 PCOM, 가장 중요하게 기획자들이 사용하기 힘든 사용법 때문에 변화가 필요했다. 그래서 이번에는 C#과 .NET Framework를 가지고 새로 만들어 보기로 했다. 하지만 PCOM 인터페이스 때문에 Managed C++로 Wrapping이 필요했고, ILMerge 라는 프로그램도 사용했다. "해적"이라는 대규모 패치가 기획되었다. 제작 기간은 무려 1..

Game Dev/Article 2011.06.01