본문 바로가기

쓰기


Aral Trans 0.2 - Interface

 


ATCTNR.DLL

 

아랄트랜스는 크게 2개의 프로세스로 구성된다.

 

-         후킹을 하는 AralTrans.exe

-         게임 프로세스에 인잭션 되는 ATCTNR.DLL

 

다른 프로세스에 DLL을 삽입시키는 방법엔 여러가지가 있으나, 아랄트랜스는 비교적 합법적인 루트인 SetWindowsHookEx 함수를 사용한다. 또한 후킹 방식도 여러가지가 있으나 아랄트랜스에서는 모듈 이미지가 로드된 메모리에 jmp/call 명령어를 overwrite한다.

 
<그림 1. ATCTNR이 띄우는 윈도우>

 

ATCTNR(이하 컨테이너)는 게임 프로세스 공간에 로드 된 직후 작은 윈도우를 하나 띄우며, 이곳에서 사용자는 플러그인을 선택할 수 있다. 컨테이너는 이 플러그인들을 위해 후킹 관련 함수들을 제공하고 있다. 현재 ATCode, DebuggingATCode, Cached, NonCached, KiriKiri 플러그인 모두 이 함수들을 기반으로 하고 있다.


 


이후 인잭션 된 컨테이너는 게임 프로세스 문맥(Context)에서 동작한다. 컨테이너가 로드하는 플러그인 역시 게임 프로세스 안에서 동작한다.

 

아래는 컨테이너에서 제공하는 함수들을 나열한 것이다. 또한 플러그인에서 어떻게 컨테이너 함수를 사용하는지 짤막한 예제를 넣었다.

 

 

// 특정DLL 함수를후킹

BOOL __stdcall HookDllFunction(LPCSTR cszDllName, LPCSTR cszFuncName, LPVOID pfnNewFunc)

 

typedef BOOL (__stdcall * PROC_HookDllFunction)(LPCSTR, LPCSTR, LPVOID);

 

HMODULE hContainer = GetModuleHandle(_T("ATCTNR.DLL"));

PROC_HookDllFunction pfnHookDllFunction =

(PROC_HookDllFunction) GetProcAddress( hContainer, "HookDllFunction" );

BOOL bHookRes = pfnHookDllFunction( "GDI32.DLL", "GetGlyphOutlineW", NewGetGlyphOutlineW );

 

 

 

// 특정DLL 함수를언훅

BOOL __stdcall UnhookDllFunction(LPCSTR cszDllName, LPCSTR cszFuncName)

 

typedef BOOL (__stdcall * PROC_UnhookDllFunction)(LPCSTR, LPCSTR);

 

HMODULE hContainer = GetModuleHandle(_T("ATCTNR.DLL"));

PROC_UnhookDllFunction pfnUnhookDllFunction =

(PROC_UnhookDllFunction) GetProcAddress( hContainer, "UnhookDllFunction" );

BOOL bUnhookRes = pfnUnhookDllFunction( "GDI32.DLL", "GetGlyphOutlineW );

 

 

 

// 함수포인터에대한원래DLL 함수포인터반환

void* __stdcall GetOrigDllFunction(LPCSTR cszDllName, LPCSTR cszFuncName)

 

typedef void* (__stdcall * PROC_GetOrigDllFunction)(LPCSTR, LPCSTR);

 

HMODULE hContainer = GetModuleHandle(_T("ATCTNR.DLL"));

PROC_GetOrigDllFunction pfnGetOrigDllFunction =

(PROC_GetOrigDllFunction) GetProcAddress( hContainer, "GetOrigDllFunction" );

PROC pfnOrigGetGlyphOutlineW = pfnGetOrigDllFunction( "GDI32.DLL", "GetGlyphOutlineW" );

 

 

 

// 특정지점후킹

BOOL __stdcall HookCodePoint(LPVOID pCodePoint, PROC_HookCallback pfnCallback)

 

typedef void (* PROC_HookCallback)(LPVOID, PREGISTER_ENTRY);

typedef BOOL (__stdcall * PROC_HookCodePoint)(LPVOID, PROC_HookCallback);

 

void PointCallback( LPVOID pHookedPoint, PREGISTER_ENTRY pRegisters )

{

         TRACE(_T("Code Point : %p n"), pHookedPoint);

}

 

……

 

HMODULE hContainer = GetModuleHandle(_T("ATCTNR.DLL"));

PROC_HookCodePoint pfnHookCodePoint =

(PROC_HookCodePoint) GetProcAddress( hContainer, "HookCodePoint" );

BOOL bHookRes = pfnHookCodePoint( (LPVOID)0x00456789, PointCallback );

 

 

 

// 특정지점언훅

BOOL __stdcall UnhookCodePoint(LPVOID pCodePoint)

 

typedef BOOL (__stdcall * PROC_UnhookCodePoint)(LPVOID);

 

HMODULE hContainer = GetModuleHandle(_T("ATCTNR.DLL"));

PROC_UnhookCodePoint pfnUnhookCodePoint =

(PROC_UnhookCodePoint) GetProcAddress( hContainer, "UnhookCodePoint" );

BOOL bUnhookRes = pfnUnhookCodePoint( (LPVOID)0x00456789 );

 

 

 

// 일본어 번역

BOOL __stdcall TranslateText(LPCSTR cszJapanese, LPSTR szKorean, int nBufSize)

 

typedef BOOL (__stdcall * PROC_TranslateText)(LPCSTR, LPSTR, int);

 

HMODULE hContainer = GetModuleHandle(_T("ATCTNR.DLL"));

PROC_TranslateText pfnTranslateText =

(PROC_TranslateText) GetProcAddress( hContainer, "TranslateText" );

 

char szKorBuf[1024];

BOOL bTrans = pfnTranslateText( "これによって", szKorBuf, 1024 );

 

 

 

// 현재로드된알고리즘모듈

HMODULE __stdcall GetCurAlgorithm()

 

// 현재로드된번역기모듈

HMODULE __stdcall GetCurTranslator()

 

// 어플로케일로드여부검사

BOOL __stdcall IsAppLocaleLoaded()

 

// 어플로케일On/Off (현재 안쓰임, 정상 작동 보장못함)

BOOL __stdcall EnableAppLocale(BOOL bEnable)

 

 



플러그인 규격

 

아랄트랜스의 플러그인으로 동작하기 위해서는 DLL이 아래의 함수들을 Export 하고 있어야한다.

 

후킹 플러그인 (Algorithm 폴더에 존재)

 

BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszOptionStringBuffer)

BOOL __stdcall OnPluginStart()

BOOL __stdcall OnPluginOption()

BOOL __stdcall OnPluginStop()

BOOL __stdcall OnPluginClose()

 

후킹 플러그인이 최초 선택되었을 때, 컨테이너는 그 플러그인 DLL을 로드하고 위의 5개 규격 함수가 존재하는지 검사한다. 검사를 통과하면 컨테이너는 플러그인의 OnPluginInit 함수를 호출하며, 이 때 인자로 아랄트랜스 설정창의 윈도우 핸들과 세부설정용 문자열 버퍼가 전달한다. 플러그인은 이 때 동작에 필요한 초기화 작업을 수행하고, 성공시 TRUE를 반환한다. FALSE를 반환하면 컨테이너는 플러그인 초기화 실패로 간주, DLL Unload 시킨다.

이 후 바로 OnPluginStart 를 호출한다. OnPluginStart / OnPluginStop 함수가 존재하는 이유는 0.2버전 설계 시 사용자가 후킹을 on/off 할 수 있는 기능을 제공하기 위한 취지였는데, 만들고 보니 사용자 입장에서는 꽤나 번거롭고 잘 사용되지도 않아서 없애버렸다. 하지만 이 함수들은 자동으로 호출된다는 점만 바뀌었을 뿐, 이름에 걸맞게 작동되어야 한다. 이 때의 반환 값은 성공시 TRUE, 실패시 FALSE를 반환한다.

후킹 콤보박스 옆의 옵션을 누르면 컨테이너는 플러그인의 OnPluginOption 함수를 호출한다. 이 때 반환 값은 별 의미는 없다.

사용자가 후킹 플러그인을 바꾸거나 Unload 시킬 때 OnPluginStop 함수가 호출되고, 뒤 이어 OnPluginClose 함수가 호출된다. OnPluginClose에서는 플러그인이 사용하던 모든 자원을 반환하고, 후킹된 지점들을 복구시켜 놓아야 한다.

 

 

번역 플러그인 (Translator 폴더에 존재)

 

BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszSettingStringBuffer)

BOOL __stdcall OnPluginOption()

BOOL __stdcall OnPluginClose()

BOOL __stdcall Translate(LPCSTR cszJapanese, LPSTR szKorean, int nBufSize)

 

번역 플러그인이 최초 선택되었을 때, 컨테이너는 그 플러그인 DLL을 로드하고 위의 4개 규격 함수가 존재하는지 검사한다. 검사를 통과하면 컨테이너는 플러그인의 OnPluginInit 함수를 호출하며, 이 때 인자로 아랄트랜스 설정창의 윈도우 핸들과 세부설정용 문자열 버퍼가 전달한다. 플러그인은 이 때 동작에 필요한 초기화 작업을 수행하고, 성공시 TRUE를 반환한다. FALSE를 반환하면 컨테이너는 플러그인 초기화 실패로 간주, DLL Unload 시킨다.

후킹 플러그인에서 컨테이너 함수인 TranslateText 함수를 호출하여 번역을 요청하면, 컨테이너는 내부적으로 번역 플러그인의 Translate 함수를 호출한다. 번역 플러그인은 텍스트 번역 성공시 TRUE, 실패시 FALSE를 반환한다.

번역 콤보박스 옆의 옵션을 누르면 컨테이너는 플러그인의 OnPluginOption 함수를 호출한다. 이 때 반환 값은 별 의미는 없다.

사용자가 번역 플러그인을 바꾸거나 Unload 시킬 때 OnPluginClose 함수가 호출된다. OnPluginClose에서는 플러그인이 사용하던 모든 자원을 반환한다.

 

조회 수 :
9934
등록일 :
2008.06.22
00:31:34
엮인글 :
https://arallab.hided.net/4350/b74/trackback
게시글 주소 :
https://arallab.hided.net/board_documents/4350

Hide_D

2008.06.22
01:30:17
드디어 규격 양식이 떴네요.
관리자님 +_+b

나는누구인감?

2008.06.22
03:11:48

봐도 모르겠습니다...........

공부 열심히 해야할듯........

my Vagina

2008.06.22
06:52:48
감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?감사합니다?

kiss

2008.06.23
22:34:49
플러그인을 만들어볼것인가.. 아랄트랜스를 흉내내 볼것인가... 그것이 문제로다.......

아그나스

2008.06.26
12:36:27
사실 이건 마이님을 위한??
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 [SVN] AralTrans 0.3 - All Plugins [6] 아랄 2009-10-23 10352
공지 [SVN] AralTrans 0.2 - Full Source [2] 아랄 2008-07-22 16062
12 AralTrans v0.3 Renewal Project [1] file 아랄 2011-04-17 5910
11 [0.2] OnPluginInit에서 MessageBox 출력시 주의! Hide_D 2009-12-11 6814
10 STL iterator 사용시 주의사항 [1] 아랄 2009-10-04 7564
9 한 함수에 후킹 포인트를 2개 이상 잡을 수 없습니다. [3] Hide_D 2009-07-20 7702
8 [부정확] 플러그인에 쓰레드를 사용할때 [2] Hide_D 2009-01-07 7456
7 아랄 컨테이너 창이 hidden상태일 수 있으므로 MessageBox 주의! [2] 아랄 2008-11-07 7263
6 파일 다이얼로그를 띄운 후 작업폴더가 바뀌는 현상 [3] 아랄 2008-10-28 7773
5 [소스] 플러그인 개발을 위한 기본 프레임워크 20080810 file whoami 2008-08-10 8614
4 [문서] MultiPlugin 2 - 필터 플러그인 규격 file whoami 2008-07-26 9380
3 [개발환경구축] AralTrans 프로젝트 소스 다운받기 [3] file 아랄 2008-07-24 8171
2 [개발환경구축] TortoiseSVN 설치하기 file 아랄 2008-07-24 7708
» [문서] 아랄트랜스 0.2 - 플러그인 규격 [5] file 아랄 2008-06-22 9934