// CATCodeMgr::Init(ATCodeMgr.cpp) 중에서...
// 어플로케일 관련 함수
m_sTextFunc.pfnOrigMultiByteToWideChar =
(PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\Software\AralGood"), _T("M2WAddr"));
m_sTextFunc.pfnOrigWideCharToMultiByte =
(PROC_WideCharToMultiByte) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\Software\AralGood"), _T("W2MAddr"));
// MyWideCharToMultiByte (ATCode.cpp) 중에서..
int MyWideCharToMultiByte( /* 생략 */ )
{
int nRetVal = 0;
if( g_objATCodeMgr.m_sTextFunc.pfnOrigWideCharToMultiByte )
{
nRetVal = g_objATCodeMgr.m_sTextFunc.pfnOrigWideCharToMultiByte( /* 생략 */ );
}
else
{
nRetVal = ::WideCharToMultiByte( // 생략// );
}
return nRetVal;
}
---------------------------------
왜 이런 일을 하는지 모르겠습니다.. 그냥 WideCharToMultiByte 를 쓰지 않고 이렇게 주소를 가져와야 하는 이유가 있는 건가요?
관리자
- 2008.07.08
- 19:14:20
어플로케일을 지원하게 하기 위한 코드입니다.
이녀석도 게임을 후킹하는데, 후킹하는 함수들 중
WideCharToMultiByte
MultiByteToWideChar
두 함수도 포함되어 있죠.
따라서 아랄트랜스가 위의 함수들을 그냥 호출하면
어플로케일 후킹 코드로 빠져버리고, 그 문자열에 대해 열심히 로케일 변환 작업을 합니다.
이러면 의도하지 않은 외계어가 나오겠죠...
따라서 순수한 함수가 필요한데
다행히 위 두 함수는 kernel32.dll (맞나..?) 에 있는 함수라
모든 프로그램들이 주소가 동일합니다.
또한 어플로케일의 후킹 방법도 함수주소 테이블을 바꿔놓는 방식이기 때문에
실제 다른프로그램에서의 위의 두 함수 주소를 얻어온다면
두 순수한 함수를 쓸 수 있습니다.
AralTrans.exe 가 두 함수 주소를 레지스트리에 기록하고
ATCTNR.DLL 이 레지스트리로 부터 읽어옵니다.
사용자 계정에서 임의의 프로그램이 Program Files에 직접 접근하는것을 막고 있는걸로 알고 있습니다.