본문 바로가기

쓰기

일단 FrigateBird(잘 알려진 피시로 호칭)님의 ATCode 20111003 (줄여서 1003버전) 을 한번 훑어보았는데요,

 

1003 버전의 주된 변경점은 Siglus 엔진에 대한 지원이 주를 이루고 있습니다.

물론 기존 ATCode 의 버그를 잡은 것도 있지만 마이너하니 넘어갑니다.

 

제가 보기에는 이 기능은 OVERWRITE 나 PTRCHEAT 에 부가적으로 붙이는 기능이 아니라 아예 새로운

후킹 방식으로 넣어야 할 듯 합니다. 완전히 내용이 다르거든요.

 

OVERWRITE, PTRCHEAT, SOW 등은 문자열을 직접 가리키는 포인터를 가져오는 형태인 데 반해,

이 방식은 Siglus 의 문자열 정보를 가지는 것 (아마도 클래스) 을 가리킵니다. 그리고 그 정보를

찾아 실제 문자열을 읽고 난 후 다시 정보를 돌려넣는 방식입니다. 뭐랄까 OVERWRITE와 PTRCHEAT의

중간 방식이랄까요;

 

그래서.. 제 생각에는 이 방식을 OVERWRITE, PTRCHEAT, SOW 에 이은 4번째의 후킹 방식으로

빼거나, 혹은 SCP 처럼 새로운 플러그인으로 분리하는 것이 좋을 것 같습니다.

 

제가 이해한 Siglus 문자열 클래스의 형식은 다음과 같습니다.

 

struct _SIGLUS_STRING {

        union {

                LPSTR pszString;        // MBCS, 글자수 16자 (16바이트) 이상

                LPWSTR pwszString;        // UNICODE, 글자수 8자 (16바이트) 이상

                BYTE szString[16];        // MBCS, 글자수 15자+/0 까지

                WCHAR wszString[8];        // UNICODE, 글자수 7자+/0 까지

        } str;

        DWORD dwLen;        // 글자수

        DWORD i;                // 이건 뭔지 잘 모르겠습니다. 계산식은 i=(dwLen/0x10+1)*0x10-1

};

 

그래서..

1) 글자수 15자 미만 (MBCS 기준)

DWORD   _______0_______1_______2_______3_______4_______5

WORD    ___0___1___2___3___4___5___6___7___8___9___A___B

BYTE    _0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F_0_1_2_3_4_5_6_7

0x1000: _a_a_r_i_g_a_t_o_u_u_!_!00      0C00    0F00   

dwLen=0x0C(12), i=(0xC/0x10+1)*0x10-1=(0+1)*0x10-1=0x10-1=0xF

-> 앞의 16바이트 부분에 글자를 직접 넣음

 

2) 글자수 15자 이상 (MBCS 기준)

DWORD   _______0_______1_______2_______3_______4_______5

WORD    ___0___1___2___3___4___5___6___7___8___9___A___B

BYTE    _0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F_0_1_2_3_4_5_6_7

0x1000: 34120000                        1600    1F00   

0x1234: _a_a_r_i_g_a_t_o_u_u_g_o_z_a_i_i_m_a_s_u_!_!00

dwLen=0x16(22), i=(0x16/0x10+1)*0x10-1=(1+1)*0x10-1=0x20-1=0x1F

-> 첫번째 DWORD가 포인터로 실제 문자열의 위치를 가리킴

 

문자열을 직접 일본어를 넣으니 줄이 비틀려서 영어로 넣었습니다; _a_a = あ, _r_i = り... 등등.

 

대충 이런 식으로 작동하는 듯.

 

 

 

그나저나 피시 님이 제게 넘겨주신 코드는 중간단계 (완성품이 아닌) 인지 이상한 계산식에

버그같은 부분도 많이 보이더군요.

 

예를 들면

    if ((pCmd->GetBufLen() &&  pCmd->GetTransMethod() == 2)

            ||(pCmd->GetSmbuf() &&  pCmd->GetTransMethod() == 2 )){
     if(*(&(*(DWORD*)pArgText)+4) >= 0x10){

         szText = (LPSTR)*(&(*(DWORD*)pArgText)); 

     }
     else {

      if(*(&(*(DWORD*)pArgText)+4) > 0xFF) continue; // 1번

 

      if(*(&(*(BYTE*)pArgText)+*(&(*(DWORD*)pArgText)+4))!=0x00){ // 2번
       szText = (LPSTR)*(&(*(DWORD*)pArgText));
      }
      else szText = (LPSTR)pArgText;
     }
    }

 

이 코드에서

1번

- 여기서는 *(&(*(DWORD*)pArgText)+4) < 0x10 밖에 안 넘어올텐데 0xFF 보다 큰 값이 안나오므로

  이 if 문은 무조건 거짓이 뜰겁니다..

2번

- *(&(*(BYTE*)pArgText)+*(&(*(DWORD*)pArgText)+4)) 라는 식이 무엇을 의미하는지 모르겠군요;

  (*(&(*(BYTE*)pArgText) != 0x00) && (*(&(*(DWORD*)pArgText)+4)) != 0x00)

  을 의미하는 것일까요?

 

이외에도 그냥 ECX 같은 것만 인자로 들어왔을때의 문제라던가.. PTRCHEAT 시의 문제도 보이는 것 같고요.

제가 잘못 이해했을 수도 있겠습니다만..; 실제 업데이트시에는 전체적으로 고쳐야 할 지도 모르겠습니다.

분류 :
Talk
조회 수 :
4957
등록일 :
2011.11.02
19:21:50
엮인글 :
https://arallab.hided.net/48293/e6e/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/48293

FrigateBird

2011.11.12
14:20:06

몇가지 던지고 가자면

Siglus 엔진 만이 아닌, QLIE엔진이나, GIGA사에 사용중인 엔진 몇개와, 아야카시 를 낸 회사의 현재 나오는 게임들 및 그와 같은 방법으로 REP을 사용하거나 특정 함수에 거칠때는 그러한 형식이 되는게 간간히 보이는 경우가 있더군요.

 

그래서 예전부터 건의했던 특정 길이 지점 지정하여 번역 길이 덮어쓰기 를 대충 저 형식에 맞는것만 바꿔놓도록 했습니다.

 

그리고 코드상 1번 같은 경우는 제가 귀찮아서 안지웠습니다. ㅡㅡa

원래는 디버거로 스크립들이 어떻게 넘어오는지 감시용으로 썻다가...

우홋. 하고 보고나서 괜찮네 하면서

해당 메모리 감시 끝나고 나서 포인터 체크로 위에

제대로 갈겨놓고는 1번 보고 "어? 별 상관 없겠지 ㅋ.ㅋ 지우기도 귀찮긔"

하면서 넘어갔다는 후문이...(도주)

 

2번 같은경우는

(*(&(*(BYTE*)pArgText) != 0x00) && (*(&(*(DWORD*)pArgText)+4)) != 0x00)  는 절대 아니라고 답변 드릴 수 있습니다.

^-^

 

if(*(&(*(DWORD*)pArgText)+4) >= 0x10) 로 인해서

메모리 상에 한 라인보다 클 경우 포인터로 넘어가는데

후킹 장소가 포인터라고 될경우 1,2번이 있는 else  문으로 갑니다.

그러면 후킹 장소 + 0x10 에 있는 값은 길이가 되는데

 

*(&(*(BYTE*)pArgText)+             //후킹장소 및 포인터라고 판정된곳

*(&(*(DWORD*)pArgText)+4))   //후킹장소+0x10 에 길이값이 있을때

두 값을 더한 주소에 들어 있는 내용 값은 널문자인 0x00이 들어있을 경우

길이와 포인터는 문제가 없는 대사이다.

라고 체크 포인트라고 생각하시면 됩니다.

 

실제로 명령 포인터 값만 가고

밑에 0x10 장소에 길이를 더해도 그 곳에는 대사가 없는 경우가 있더군요. 

FrigateBird

2011.11.12
14:22:20

+ 덧으로 PTRCHEAT  의 집어처넣은건 그냥 없애도 될것 같네요.

 

메모리 덮어쓰기에서 값이 작을경우 자동으로 PTRCHEAT 형태로 비슷하게 넘기는 방법으로 했으니...

결국엔 저건 에러만 나오고 필요도 없었습니다.

 

(실제로 코드게에 올린것중 PTRCHEAT 에서  저 기능을 사용한 건 없습니다. 가다가 버퍼 에러도 나구요.)

 

ATCode에 넣은 이유는 2가지 입니다.

1. 귀찮아서

2. 실제로 저런 형태로 된 게임이 1만개중 20~30%정도는 되더군요.

 

그리고 코딩한 것들이 괴상 망측한 이유는

^-^ 실제 수정하여 디버거로 비교해보면 자연히 알게 됩니다.

컴파일러 강간하기

whoami

2011.11.12
14:41:08

아. 그러면 1번 부분은 그냥 불필요한 코드가 맞군요.

그리고 2번 부분은 문장 끝 부분의 \0 이 실제 있는지 없는지 확인하는 코드인건가요?

 

또.. PTRCHEAT 부분의 코드.. 제대로 작동하던가요? 현재 공개된 코드는 찾아보니 전부 OVERWRITE

를 쓰는 것 같고.. 특별히 PTRCHEAT 를 쓰지 않아도 무방해 보이는 것 같던데요.

 

아참, BUFCHANGE 와 LENCHANGE 의 정확한 차이점도 알고 싶은데요..

원본이 0x10 이하였더라도 번역이 0x10 이상이라면 알아서 포인터로 빼고, 그 반대라면

알아서 글자를 채워넣어버리 (고 원본의 문자열 버퍼를 해제시키)면 될텐데 특별히 저 옵션

두개로 나눠놓으신 이유가 궁금하네요. 저렇게 하지 않으면 에러가 발생하나요?

 

마지막으로.. 이 기능을 기존 OVERWRITE/PTRCHEAT/SOW 말고 새로운 방식으로 하거나 다른 알고리즘

플러그인으로 뺀다면 이름을 뭘로 짓고 싶으신지.. ㅎㅎ .. 궁금하네요.

FrigateBird

2011.11.13
17:38:29

2번은 \0 인지 확인하는게 맞습니다.

실제로 아닐 경우가 있었기 때문에;

 

PTRCHEAT 쪽은 위쪽에서 말한대로 없어도 됩니다.

실험중 나온 부산물에 불과 합니다.

 

BUFCHANGE 와 LENCHANGE 의 정확한 차이점을 얘기하자면 좀 길어지는군요;

원래는 PTRCHEAT 부분에서 시도를 먼저 했습니다.

 

그러면서 BUFCHANGE 를 넣고는 시도하고 값이 작은 글은 그냥 OVERWRITE 로 대충 끼워맞추자

하면서 엄~청 하기 싫어하면서 되게만 해보자 하고 덤볐다가

하고보니 되긴 됬지만 이상하게 아무데서나 2~3글   PTRCHEAT 로 넘기니 랜덤적으로 튕기는 현상이 발생하더군요.

(이유는 아직 못찾았습니다. 디버거로 봐도 제가 건드린 부분에서는 튕기는게 아니에요)

 

사실, 욕심도 생겼습니다.

기왕 여기까지 와버린거  제대로 OVERWRITE에 들이대자 하고 PTRCHEAT는 손을 놔버리고는

 

OVERWRITE에 BUFCHANGE 처넣고 하다보니..

작은 글을 번역에서 커질 경우를 깜빡하고 말았습니다. 참 어처구니 없는 결말

(진짜 이때 미쳤나 봅니다.)

한창 디버거로 구경하면서 애지중지 봤는데;;늅늅

 

그래서 다시 보기도 귀찮으니까 살짝 추가만 하자

싶은 생각으로 LENCHANGE 대충 만들고 약간 껴맞춰서 실행하니

결과는 나왔지요..

 

헌데...불미스러운 사태로 이상하게 또 튕기는 녀석

 

열받아서 BUFCHANGE 에다 싸그리 담았네요.

 

결과...  LENCHANGE는 BUFCHANGE를 사용할때 자동 사용으로 바뀌고.

PTRCHEAT 에서 사용할려고 놔둔 LENCHANGE 는 쓰레기로 변해서

 

결론적으로는 OVERWRITE 에 BUFCHANG 말고는 다 폐기 처분 대상  

 

 

 

결론, 귀찮니즘에서 시작된 참혹한 결과

 

지금 생각해보면 그거 정리하기 싫어서 여기다 올린거 같............(퍽퍽)

 

그리고 명칭따위는 아무래도 좋으니 얼른 기능이 필요했네요.

약 3년전인가.  히데한테 대사 밑에 길이 처 들어간게 있는데 좀 해줘요.

하니까. ㅇㅇ 나중에 라는 말이 돌아왔다지..

 

그런데 요즘들어 저런 식으로 된 게임만 대량 만나다 보니...

아 저런 형태로 가지고 노는 특정 함수가 있나보다 싶었지요.

FrigateBird

2011.11.13
18:24:30

추가 적으로 유니코드에서는 테스트를 했지만

아스키에서는 제대로 못했네요.

 

아마 버그가 있을지도 몰라요?

 

.............

FrigateBird

2011.11.13
19:53:59

그 뭐냐 추가적으로 손봐야되는게 있습니다.

 

그 형식을 따르되 0x10 이상이 될때 포인터로 갈아버리지 말고 해당 메모리 안을 덮어버리는 것과

길이 제한을 활성화 하여 그 해당 메모리 안에 원문 만큼 혹은 버퍼 무시도 지원 되면 좋겠네요.

 

그건 깜빡했습니다.

Siglus 엔진에서는 필요 없었어도, NeXAS(이하 GIGA사에서 사용중인) 엔진에서는 중복 포인터를 사용하기 때문에 저 기능이 있어야 코드화 시킵니다.

 

다른, 아야카시 게임에 적용한 엔진에는 대충 사용하긴 합니다.

FrigateBird

2011.11.13
20:01:07

"비밀글입니다."

:

whoami

2011.11.13
22:09:48

ㅎㅎ... 본체 작업 하는 것 때문에 이번에 할당된 자원(응?) 을 다 써버려서 아직 ATCode 쪽은

손을 못 댔네요. 본체도 일단 일단락시켜 놨으니 (숏컷 제작 부분에 약간의 버그가 있긴 합니다만

큰 문제는 아니니 일단 패스) 다음 시간나면 작업을 시작할 예정입니다.


추가적으로 손봐야 한다는 곳에 대해 좀 더 자세히 설명해 주시면 감사하겠습니다.

위의 형식을 따르되 0x10 이상이 될 때 포인터로 넘기지 말고 일반 OVERWRITE 처럼 뒷자리를

짤라서 15자 제한을 주자는 뜻이신가요? 버퍼 무시라면 포인터를 따로 주지 않고 15자 이상

집어넣는다? 그러면 dwLen 이나 i 부분을 침범해서 에러가 날 것 같은데요?


그리고.. 중복 포인터라는 것의 개념도 잘 안잡히는데 설명좀..;;

FrigateBird

2011.12.10
16:16:00

"비밀글입니다."

:
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155441   2008-08-03 2008-12-16 00:03
204 Talk 웹 계정 아이디/비밀번호 secret Hide_D 1   2011-01-02 2011-01-02 16:21
비밀글입니다.  
203 Talk CustomDic의 동작 방식에 대해서 secret Hide_D 4   2012-02-14 2012-02-14 13:36
비밀글입니다.  
202 Talk 코드정리 목록 + 코드 secret sizukana 6   2009-01-17 2009-01-17 11:41
비밀글입니다.  
201 Talk ATCTNR에다가 Python만 갖다 붙여도...? [1] Hide_D 280   2016-01-11 2016-01-12 01:30
ATCTNR에 몇가지 버그는 좀 있지만 이거 좀 보완하고, 인젝터 세팅가능하게 한다음에 ATCTNR + ProtocolBuffer(+gRPC) + Python 3 정도로 해서 묶으면, 꽤 재미있는 물건이 나오지 않을까 생각해봅니다 ㅇㅇ 이쪽은 Standalone으로 해볼만할 것 같기도 하고...  
200 Talk VB.NET에서 ezTransXP.dll사용하는 방법은 없나요? [1] R2D2 360   2016-06-14 2018-06-20 14:44
vb.net에서 MFC dll을 써서 이지트랜스로 번역해서 결과물을 가져오고 싶습니다. 그런데 아무리찾아봐도 방법을 모르겠습니다. Imports System.Runtime.InteropServices  Private Declare Fu*nction Translate Lib "ezTransXP.dll" (ByRef cszJapanese As Stri...  
199 Talk atcode.dll이 출력 못하는 글자를 수집해 봅니다. [2] file Wales 490   2014-02-05 2014-02-07 20:13
 
198 Talk 엔드 아랄호환 문제를 모두 수정했습니다 [2] kiereh 494   2014-04-28 2014-04-30 01:25
http://www.eroha.net/%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8/%ec%97%94%eb%93%9c/ 오늘자 버전 (140428)으로 엔드와 아랄트랜스간의 호환 문제가 수정되었습니다. 멀티쓰레드로 번역문을 막 쏘면 문자열 포인터가 튀면서 잘못된 참조를 하던 문제, %가 들어갈...  
197 Talk aralgood.com 도메인 부활... [7] whoami 567   2014-03-02 2014-03-17 22:48
혹시나 하고 매일 한번씩 체크하곤 하는데.. 오늘 보니 도메인이 부활했군요! 아랄님이 체크하시고 부활시키셨나? 어쨌든 그에 따라 자동업데이트도 부활하고 좋군요. 혹시 아랄님이나 Hide_D군님 보시면.. 제로보드 업데이트 하실 생각 없으신가요? 꽤 오래된...  
196 Talk UTF-8이나 유니코드 원활한 필터처리를 위해 생각해봤는데 [5] Wales 622   2014-06-16 2014-07-29 16:39
Translate함수에 포함된 필터 전후처리를 따로 빼서 원문 전환전과 번역후에 필터 처리를 하도록 하는건데 문제는 필터들 전부 멀티바이트 중점으로 만들어지다 보니 필터 전부를 손봐야 하는 상황이 오는군요. 그래서 일단 보류중...  
195 Talk 스마트 방식과 윈7의 호환에 관한 잘못된 견해 [4] TwoComet 666   2013-07-06 2013-07-07 03:37
코드 게시글에 '스마트 방식이라 윈7에서 튕길지도 모른다'는 잘못된 인식을 불어넣는 것을 발견했기에 미리 사전에 이야기합니다. 해당사항의 정확한 원인은 아직까지 발견된 사례의 하나인 기가사나 타 브랜드에서 사용하는 넥서스 엔진에서만 해당하는 사항...  
194 Talk 정말 오래간만입니다. [5] Hide_D 694   2013-05-08 2013-07-04 04:45
중간에 폴라리스 폭파되었다는 소식 듣고 한번 들렀던 걸 제외하면 거의 1년 넘게 접속을 안하고 있었던 셈이네요 -0-;; 랩에 진행중인 과제도 있고해서 아직도 좀 바쁘긴 한데, 시간 나는데로 플러그인 관련으로 쌓인 일 좀 처리해 볼까 합니다. PS. 아직 관...  
193 Talk 변경된 소스 좀 올려주세요. [1] whoami 715   2013-03-06 2013-03-06 19:09
안녕하세요. 오랫만입니다. 간만에 들러보니 폴라리스쪽에 큰 일이 있었더군요. 뭐 자세한 사항은 잘 모르겠지만.. 어쨌든.. 오랫만에 다시 한번 볼까 하고 SVN 업데이트를 했더니 1/31 이 마지막인데 이후로도 업데이트가 많이 되었더군요. SVN 업데이트를 가...  
192 Talk 아랄 트랜스 github/svn [6] ka7713 736   2018-12-26 2018-12-30 17:26
안녕하세요. 아랄트랜스 0.2/0.3 업데이트가 되지 않는 것이 안타까운데, github나 다른 곳으로 올려주실 생각은 없으신지요. 큰 도움은 안되더라도 조금이나마 기여하고 싶네요.  
191 Talk 어플로케일이 후킹하는 함수리스트... [2] TwoComet 868   2013-03-22 2013-03-27 10:26
NTDLL.DLL RtlMultiByteToUnicodeN RtlAnsiStringToUnicodeString RtlUnicodeToMultiByteN RtlUnicodeStringToAnsiString RtlOemToUnicodeN RtlOemStringToUnicodeString RtlUnicodeToOemN RtlUnicodeStringToOemString RtlUpcaseUnicodeToMultiByteN RtlUpcas...  
190 Talk 요 며칠간 아랄트랜스 사이트가 인기군요. [2] file whoami 926   2014-04-18 2014-04-28 16:06
 
189 Talk ATCTNR.dll 120809 업데이트..완료 EroGame 1174   2012-08-09 2012-08-09 14:31
원본 방식으로 후킹시 뒤에 밀린 명령어가 0x90 (nop) 로 밀어버려서 언훅시에 그 복사한 값에서 5길이 밖에 복구하지 않더군요. 버그 잡고.. 언훅 잘되는거 확인완료. 주의? 할점은 원본 후킹방식일때는 되도록이면 후킹 장소 지점에 명령어로부터 5 이상의 ...  
188 Talk ATCode 120817 [1] EroGame 1283   2012-08-17 2012-08-26 23:12
좀 큰 버그가 있어서 잡고나서 업데이트.  
187 Talk 아랄트랜스 번역플러그인에 이 프로그램들을 추가해주시면 안될까요? [5] 암흑마제 1536   2013-03-14 2013-03-14 22:16
1.TransCAT KJ/JK - 한일,일한 양방향 실시간 번역 프로그램 창신소프트의 이지트랜스와 마찬가지로 한일,일한 번역 프로그램입니다. 이지트랜스와 마찬가지로 사용자사전 기능을 제공하여 사용자사전을 잘만 이용하면 번역은 더 좋아집니다. 공통적인 성격을...  
186 Talk LEN 기능에서 체크기능 제거 및 투가기능. EroGame 1766   2012-05-10 2012-05-10 10:37
현재 LEN 기능으로 길이 연산 체크를 할때 -1이나 0의 범위까지 0x00인 NULL 문자로 길이 체크를 하잖아요? 그렇지 않은 경우도 있네요. 길이는 있으나 해당 번역문+길이 위치에 NULL문자가 없는 형태의 길이 교체형태도 추가주세요. (그때는 길이값만 변하도...  
185 Talk ATCode에 추가했던 ASLR 있잖아요. [2] EroGame 1767   2012-06-18 2012-08-03 08:38
http://lab.aralgood.com/index.php?document_srl=49989 이때 추가한건데 이거 따로 분리해서 사용 유무 지정하는게 좋을것 같네요. (xp에서는 무반응으로 처리하고) 특정 게임에서 연산중 뻗는 경우 발견되었습니다. 더미다 같은경우는 굳이 연산안들어가고 ...