본문 바로가기

쓰기


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/d10/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] 아랄 10352   2009-10-23 2011-10-19 00:01
공지 [SVN] AralTrans 0.2 - Full Source [2] 아랄 16062   2008-07-22 2010-10-31 01:18
12 AralTrans v0.3 Renewal Project [1] file 아랄 5910   2011-04-17 2011-04-17 18:42
 
11 [0.2] OnPluginInit에서 MessageBox 출력시 주의! Hide_D 6814   2009-12-11 2010-06-30 16:54
이전 이슈에서도 다룬적이 있습니다만. 플러그인이 로드된 시점에서 이 플러그인의 부모 객체(즉 게임)가 제대로 로드 되지 않았을 수 있으므로, Init단에서 에러 등의 이유로 MessageBox를 사용할 경우 부모 객체를 NULL로 주더라도 Sleep(2000); 과 같이 지...  
10 STL iterator 사용시 주의사항 [1] 아랄 7564   2009-10-04 2010-06-30 16:54
<발생한 문제> map 에서 erase 호출 시 잘못된 메모리 참조가 발생. <원인> stl container의 iterator들은 링크드 리스트로 관리되고 있는데, 이들은 함수나 블럭의 시작/종료 시점에서 constructor/destructor 가 자동으로 호출된다. 하지만 goto문이나 inlin...  
9 한 함수에 후킹 포인트를 2개 이상 잡을 수 없습니다. [3] Hide_D 7702   2009-07-20 2010-06-30 16:54
적는 것을 깜빡 하고 있었는데, ATCode나 기타 방법들을 사용할 때, 한 함수 내에서 후킹 포인트는 단 하나만 잡아야 합니다. 아랄트랜스 0.2에서는 후킹과 동시에 실행파일 원본과 그 원본의 복사본을 준비해 놓고 원본의 후킹포인트를 jmp를 사용해서 번역 ...  
8 [부정확] 플러그인에 쓰레드를 사용할때 [2] Hide_D 7456   2009-01-07 2010-06-30 16:54
제 추측이지만, 아랄트랜스의 플러그인 로드 시간은 (게임의) 프로세스 동작 -> 플러그인 로드 -> (게임의) 윈도우 생성 으로 매우 빠른것으로 보이며, 플러그인의 종료 시간은 (게임의) 윈도우 파괴 -> 플러그인 종료(?) -> (게임의) 프로세스 파괴 로, 윈도...  
7 아랄 컨테이너 창이 hidden상태일 수 있으므로 MessageBox 주의! [2] 아랄 7263   2008-11-07 2010-06-30 16:54
플러그인 인자로 넘겨주는 아랄 컨테이너 창의 핸들. 기본 설정이 트레이로 실행되게끔 되어 있을 시 아랄 컨테이너 창은 화면에 보이지 않는다. 그런데도 아랄 컨테이너 창의 핸들을 부모로 삼아 메세지 창 같은 것을 띄우게 되면 절대 보이지 않으며 게임은...  
6 파일 다이얼로그를 띄운 후 작업폴더가 바뀌는 현상 [3] 아랄 7773   2008-10-28 2010-06-30 16:54
바로가기 생성을 위해 파일 다이얼로그 박스를 띄웠더니 그 후 작업 디렉토리가 바뀌는 현상 발생. 파일 다이얼로그를 띄우기 전/후 안전을 위해 다음의 코드를 추가. // 현재 프로세스의 작업 디렉토리 저장 CString strWorkDir; ::GetCurrentDirectory(MAX_...  
5 [소스] 플러그인 개발을 위한 기본 프레임워크 20080810 file whoami 8614   2008-08-10 2010-06-30 16:54
 
4 [문서] MultiPlugin 2 - 필터 플러그인 규격 file whoami 9380   2008-07-26 2010-06-30 16:54
 
3 [개발환경구축] AralTrans 프로젝트 소스 다운받기 [3] file 아랄 8171   2008-07-24 2010-06-30 16:54
 
2 [개발환경구축] TortoiseSVN 설치하기 file 아랄 7708   2008-07-24 2010-06-30 16:54
 
» [문서] 아랄트랜스 0.2 - 플러그인 규격 [5] file 아랄 9934   2008-06-22 2010-06-30 16:54
Aral Trans 0.2 - Interface ATCTNR.DLL 아랄트랜스는 크게 2개의 프로세스로 구성된다. - 후킹을 하는 AralTrans.exe - 게임 프로세스에 인잭션 되는 ATCTNR.DLL 다른 프로세스에 DLL을 삽입시키는 방법엔 여러가지가 있으나, 아랄트랜스는 비교적 합법적인 ...