본문 바로가기

쓰기

 

 

아하하 ㅡㅗㅡ;;; 역시 테스트 안하고 버그 없기를 바라는 것은 무리였습니다;

 

변경점

1. LEN 루틴을 만들어놓고 실제 프로그램과 연결 안 했던 문제 수정.....;;;;

- LEN 루틴 자체는 로그를 보니 제대로 작동하는 듯 합니다.

 

2. 옵션에서 LEN 옵션을 꺼도 삭제되지 않던 문제 수정.

 

3. SMSTR 에서 LEN 옵션이 m_pArgText 기준으로 돌아가도록 수정.

 

문제점

1. SMSTR(IGNORE) 와 SMSTR(MATCH) 아직 테스트해보지 못했음.

- 이 기능을 써야 하는 게임이 뭐가 있는지 모르기 때문에 테스트할 환경이 안돼서...

 

2. 생각해보니 LEN(-4) 같은 경우 SOW 같은 방식인 경우 앞을 다 잡아먹기 때문에

문제가 생길 가능성이 높군요. SOW 시의 LEN 처리를 개선해야 할 듯.

 

FrigateBird

2012.03.02
10:22:07

문제점 1 은 제가 테스트 해보도록 하겠습니다.

 

겸사겸사 LEN도 확인해보겠습니다.

FrigateBird

2012.03.02
12:29:17

SMSTR(IGNORE) 동작할때도

ZeroMemory(pMain, sizeof(DWORD) * 4);

이녀석이 동작해서 기존 포인터를 날려먹어버리네요.

 

SMSTR(IGNORE) 와 SMSTR(MATCH) 가 동작할때는..

즉,

 

if(sLen >= 0x10){                     혹은                       if(sLen >= 0x8){
   // 긴 문자열

....

...

..

// 기존 내용 삭제
   ZeroMemory(pMain, sizeof(DWORD) * 4); <--제거

 

버그 하나 잡.

FrigateBird

2012.03.02
12:50:31

 if(sLen >= 0x8){
   // 긴 문자열

   NOTIFY_DEBUG_MESSAGE(_T("SMSTR: ApplySmartString: Unicode long\n"));

   // 기존 내용 삭제
   //ZeroMemory(pMain, sizeof(DWORD) * 4);                                  <--여기랑

 

 

 if(sLen >= 0x10){
   // 긴 문자열

   NOTIFY_DEBUG_MESSAGE(_T("SMSTR: ApplySmartString: ANSI long\n"));

   // 기존 내용 삭제
   //ZeroMemory(pMain, sizeof(DWORD) * 4);                                  <--여기랑

 

 

2군데 수정하고 SMSTR(IGNORE) 와 SMSTR(MATCH) 테스트 결과.

이상없음.

 

^-^

FrigateBird

2012.03.02
13:23:11

LEN 쪽도 이상하네요.

 

포인터 변경이 되면 이상한 값으로 변경되서 나오네요.

 

정확히 사용법이

+0x4, 0x4, 4

어떤값을 집어넣어야 되나요?

 

FrigateBird

2012.03.02
13:35:28

+0x4 로 잘 동작하는군요.

 

그런데..

해당 지점의 밖에 위치에서 LEN이 있을 경우에 까지는 동작하지 않네요?

 

완전히 대사의 위치로부터 이격한 위치값만 참조하는데;;

FrigateBird

2012.03.02
13:41:14

ex)

0x0042064D 위치 후킹

[[eax+ebx*0x4]] 장소에 대사가 있으며, 포인터로 후킹한 인자는 [eax+ebx*0x4] 이며 이 장소의 포인터를 교체할 예정.

+0x4 위치에 길이가 있다. (포인터로 부터 떨어진 LEN 값.)

정확한 위치는 [eax+ebx*0x4]+0x4이며 이 부분이 바꿔지거나 비교할 참조값.

 

이상 증상1. LEN 값은 정상이나.. 더하는 대상이 대사 장소로부터 이격함...

[[eax+ebx*0x4]]+0x4 장소에 값(원문의 +0x4 위치의 글자)을 가져와서 원문 길이측정한것과 비교하고 있음.

글자이므로 당연히 에러. [eax+ebx*0x4]+0x4 위치를 참조가 제대로 되지않음.

whoami

2012.03.02
17:42:49

1. 아 그렇군요. 일반적인 경우 포인터를 바꿔넣으므로 상관이 없는데

IGNORE 나 MATCH에서는 지우면 안되는군요; 빼버리거나 옵션에 따라 결정하도록 해야겠군요.

 

2. LEN(숫자) 의 경우 무조건 16진수로 계산됩니다. 맨 앞의 + 나 0, 0x 등은 무시하도록 만들어져 있습니다.

따라서 4 = +4 = +04 = +0x4 가 되어야 정상입니다.

 

3. LEN(수식) 이 버그는 제가 직접 테스트하면서 잡아야 할 것 같은데요.

게임 이름하고 ATCode 옵션, 기타 필터세팅 등을 좀 알려주세요.

공개 곤란하시다면 비밀글로라도..

FrigateBird

2012.03.02
22:49:02

"비밀글입니다."

:

whoami

2012.03.03
01:26:32

자기 전에 잠시 테스트해봤습니다.

 

아. 그 전에 잠시 알려드릴 사항이 있는데, OVERWRITE 에서 왜 LEN(4) 가 잘 동작하지 않는가.. 를 적습니다.

일단 OVERWRITE 에서 상대위치로 할 경우 저는 다음과 같은 경우를 상정해서 만들었습니다.

 

(예) 4ABCD

 

앞의 4 는 ABCD 의 길이이고, pArgText 는 A 를 가리키고 있을 겁니다. 이 때 LEN(-4) 를 넣어주면 보정이 되겠죠.

거꾸로 말해서 OVERWRITE 시에는 LEN 옵션이 + 가 되는 경우는 거의 없을 겁니다. 문자를 가리키게 되니까요.

 

또 OVERWRITE 에서 번역인자에서 번역인자를 가리키는 포인터를 뽑아내기가 힘들다는 문제도 있습니다.

C로 말씀드리자면 char str[]="ABCD", *pstr=str; 에서 str 의 주소를 안다고 해도 pstr 의 주소를

찾기는 힘들다는 것이죠.. (더 헷갈리려나)

 

따라서 이럴 때에는 LEN(수식) 을 써 주시기 바랍니다. LEN([EAX+EBX*0x4]+0x4) 처럼 말이죠.

 

그럼 이제 넘어와서... 말씀하신 게임을 테스트해봤는데요. 일단 제 컴퓨터 (Win7 x64 SP1) 에서는

PTRCHEAT 방식으로 하면 에러가 나면서 종료됩니다. LEN 세팅이 없더라도 말이죠.

그래서 그냥 OVERWRITE 방식으로 했는데도 제대로 작동이 되지 않더군요.. 그래서 로그를 좀 늘려봤는데

다음과 같이 나왔습니다.

 

옵션 - TRANS([[EAX+EBX*0x4]],OVERWRITE,LEN([EAX+EBX*0x4]+0x4))

GetTextPoint: called
GetTextPoint: pArgText=077C3478
IsValidTextPoint: called
IsValidTextPoint: return TRUE
IsDuplicateText: called
IsDuplicateText: return FALSE

ChangeLength: called
ChangeLength: pnLen=06B5CB0C, *pnLen=19(0x00000013), pnLen-4=06B5CB08, *(pnLen-4)=077C3478
ChangeLength: nOrigLen = 18

*(pnLen-4) 와 pArgText 가 동일하므로 확실히 pnLen 은 문자길이를 가리키고 있습니다.

그런데 *pnLen = 19 이고 nOrigLen = 18 입니다.. 1이 달라서 덮어쓰기가 되지 않고 있습니다;;

 

아마 이 위치에는 문자열 + \0 을 포함한 문자길이+1 의 값이 들어가게 되어 있는 듯 합니다..

 

이걸 어쩔까요? 문자열 길이 비교할 때 (*pnLen==nTempLen || *pnLen==nTempLen+1 ) 로 해야 할까요?

FrigateBird

2012.03.03
02:14:41

1. 아 이렇게도 LEN([EAX+EBX*0x4]+0x4) 되는거였군요?


2. 또한 OVERWRITE 에서 LEN(-4)  동작도 제대로 되는걸 확인했습니다.

ex)七つのふしぎの終わるとき  QLIE 엔진에서 동작 확인

 

3. 지금 생각해보니 특정 엔진에서는 널 문자 포함한 길이를 사용할때도 있던데..

거기까지 생각을 깜빡했네요;;

안전하지는 않지만, 길이 값과 널 값과의 차이로 자동 인식하게 하는것도 나쁘지 않을 것 같네요.

FrigateBird

2012.03.03
02:38:44

OVERWRITE 에서 LEN 이 잘 작동하는걸 확인했는데

TRANS([ebp-0x4],LEN(-4),OVERWRITE(IGNORE))

 

좀 튕기길래 PTRCHEAT 방식으로 하려고 하니.. 제대로 되지 않네요?

TRANS([ebp-0x4],LEN([EBP-0X4]-0X4),PTRCHEAT)

수식으로 했는데 말이지요;

FrigateBird

2012.03.03
03:07:28

확인 보고.

PTRCHEAT 로 할시 해당 포인터는 제대로 변경되나...

변경된 지점의 LEN 위치에 길이가 없음.

 

변경되기 전 포인터의 원문 길이 지점 LEN(-4) 라고 할때 이곳에는 변경된 길이가 제대로 들어갔지만

(사실상 저기가 바뀌면 안됩니다. 가리키는 메모리 내에 원문길이가 변동되지 않았으니 길이만 수정해버리면

나중에 재 로드시 문제가 생기게 됩니다.)

 

포인터로 갈아치운(즉 아랄 버퍼로 번역된 포인터 내에 번역문의 이격 지점 LEN(-4) 에는 아무것도 안들어감. 오로지 번역문만 존재...) 게 뭔가 의미 없어졌네요;;

 

고로 아랄 버퍼 포인터로 변경 후 그 지점내 LEN 이격 지점에도 길이 복사 하나 더 집어넣으시면 될것같네요.

 

 

 

FrigateBird

2012.03.03
03:28:41

간단히 버그를 토끼(?)가 이해하게 말하자면

 

메모리가 아닌

포인터일 경우

 

// 이제 번역문의 길이로 바꿔넣는다.
 nTempLen = (m_bUnicode ? lstrlenW((LPCWSTR)m_pTransTextBuf) : lstrlenA((LPCSTR)m_pTransTextBuf));
 if (nBytes == 1)
  *(BYTE *)pnLen = nTempLen & 0x0FF;
 else if (nBytes == 2)
  *(WORD *)pnLen = nTempLen & 0x0FFFF;
 else

{

  *pnLen = nTempLen;

   pnLen = (int *)((DWORD)m_pTransTextBuf + m_nLenPos);

  *pnLen = nTempLen;

 }

 

이렇게 마지막 추가하면 되려나요.

FrigateBird

2012.03.03
03:34:04

OK 저 2줄 추가로 포인터에서 되는걸 확인.

허나. 그 위에 부분인 *pnLen = nTempLen; 가 움직여서

포인터가 바뀐 원 장소에 길이가 바뀌어 버렸음.

(고정 위치 원문일 경우 리로드 시 길이 오류가 생길 가능성이 있음)

 

 

 

아무래도 구분해서

 

메모리일때는

*pnLen = nTempLen;

 

포인터일때는

pnLen = (int *)((DWORD)m_pTransTextBuf + m_nLenPos);

*pnLen = nTempLen;

 

로 따로 분리해서 놓는게 가장 이상적이네요. (차후 버그를 생각했을때)

 

 

당장 분리해야되네요 ㅡㅡ 백로그에서 벌써 버그 튀어나옴.

걍 포인터 바꾸고 왔는지 메모리 덮어썻는지 확인 처리해버림.

FrigateBird

2012.03.03
04:12:03

대~충

else
 {
  if ( bPos == TRUE)
   *pnLen = nTempLen;
  else
  {
  pnLen = (int *)((DWORD)m_pTransTextBuf + m_nLenPos);
  *pnLen = nTempLen;
  }
 }

 

갈기고 끝

 

스마트 쪽은 모르겠다 아우...

저긴 변수가 너무 많아서 생각하기 골치아프네요.

 

 

 

일단 SOW, PTRCHEAT, OVERWRITE 쪽만 구분해놓았습니다.

OTL SOW 는 테스트 안해봐서 모르겠지만 맞을거고..

 

PTRCHEAT, OVERWRITE 는 LEN이 이상없이 돌아가는걸 확인.

FrigateBird

2012.03.03
05:03:04

七つのふしぎの終わるとき

BALDR SKY DiveX“DREAM WORLD”

 

해당 것으로 내놓은 코드 2개.

 

첫번째는 LEN 을 사용한 형태(포인터)

(메모리 형식도 되는걸 확인, 하지만 버퍼가 정해진 것보다 넘어가버릴 때 운없으면 튕김. 그래서 포인터 방식으로 취함)

 

두번째는 SMSTR(IGNORE), SMSTR(기본) 의 적절한 코드 위치에 병행사용 으로 인한 오류 제거

문제없는 코드가 이렇게 2개가 나오니 기쁘군요.

 

고생하셨습니다.

첨부 :
atcode.zip [File Size:35.17MB/Download45]

FrigateBird

2012.03.03
15:30:05

真剣で私に恋しなさい!S

 

하는 중....

SMSTR(기본) 적용시 튕기는 현상..

확인결과 대사 이외의 위치에서 값이 없어서 그러는 모양.

(이건 뭐 어쩔 수가 없네요. +,- 어느 정도 버퍼 범위를 복사해올 수 도 없는 노릇이고..)

 

다른 위치에서 후킹하면 되지만 위치 찾기도 귀찮네요.

List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155436   2008-08-03 2008-12-16 00:03
349 Talk 2등 ~ [3] 앙마vv 15977   2008-07-08 2008-09-17 00:31
2등 입니다 ㅋㅋㅋㅋ ........... 뭐... 뭐 어쩌라는거지 .......... 그나저나 이곳 뭐하는곳 ??????? ㄷㄷㄷ;;  
348 Talk FixLine 23일자 파일은 무시설정에 문제가 있는듯하네요 [7] 류제로 15841   2008-12-26 2008-12-30 08:30
이번에 올라온 종말능의를 코드를 입력시켜면서 알게된 것인데 23일자 FixLine 옵션의 무시설정의 서클체크을 사용안함 이외 부분을 체크하고 확인을 누르면 적용은 되는듯하나 다시 옵션창을 열어보면 체크가 사용 안함으로 표시 되어있습니다 20일자로 실행...  
347 Talk XML 파싱 부분에 문제가 하나 있네요. Hide_D 15772   2009-12-30 2009-12-30 21:42
xml 태그에서 그 태그에 대한 내용이 없을경우 <tag></tag> 로도 표현할 수 있지만 <tag/> 로도 표현 가능합니다. 현재 파서 부분을 보니 <tag/>형식의 태그에는 대응이 되어 있지 않은것 같습니다.  
346 Talk 문자열 길이에 대한 건의 file G2m 15608   2010-01-21 2010-01-21 18:44
 
345 OtherFiles 히데님, 픽스라인 관련 메모장 파일입니다. [1] file astral 15603   2008-12-16 2008-12-16 01:19
 
344 Talk [버그 보고?]브라반 드디어 원인을 찾았습니다. orz [6] Hide_D 15593   2008-07-08 2008-07-09 16:23
엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉 0x3010 0x3011이용해서 대사 처리하는 녀석들을 찾아보았더니 http://aralgood.com/zbxe/26860 루이는 토모를 부른다. 가 있더군요. 요건 그 일부분! ------------------------------------------------------...  
343 Archive [플러그인,소스] KoFilter 테스트 버전 20081118 file whoami 15552   2008-11-18 2008-11-18 23:37
 
342 OtherFiles 0.3 설정 xml 파일 예제 [4] file 아랄 15532   2009-09-20 2009-09-21 00:12
 
341 Talk ats파일에 아이콘을... [2] Hide_D 15493   2009-12-23 2009-12-23 14:27
역시 ats에 아이콘을 넣는 게 좋을 것 같습니다. 그래서 생각해본 방법 1. xml에 <icon></icon>항목을 추가해서 추가할 ico 파일을 변환해서 넣기 0xff -> 'FF' 식으로 하면 실제 ico 파일에 대해서 대략 용량이 2배가 되겠지만 '별 수 없죠' 2. ats에 대한 Ic...  
340 Archive [플러그인,소스] FixLine 테스트버전 081221 [5] file Hide_D 15475   2008-12-21 2008-12-22 02:30
 
339 OtherFiles fixline 테스트 [1] file 처음처럼만 15297   2008-12-16 2008-12-16 15:52
 
338 Archive [플러그인,소스] FixLine 테스트버전 081215 [5] file Hide_D 15213   2008-12-15 2008-12-16 01:18
 
337 Talk 0.3에서 전국란스의 경우 [1] Hide_D 15178   2009-12-13 2009-12-14 02:10
ats파일을 만들어서 동작할경우 문제가 산넘어 산입니다. 1. 주소 문제 2. Rance7으로 바꾸었을때 AppLocale의 미묘한 작동 ㄹㅋ  
336 Talk 번역함수가 불렸을 때 자신이 불린 컨텍스트 이름을 아는 문제.. [8] whoami 15151   2009-12-24 2009-12-26 15:34
4. procTranslate 로 지정된 번역함수가 불렸을 때 자신이 어떤 컨텍스트로 불렸는지 아는 방법 현재 컨텍스트의 이름을 얻는 것 외에는 대부분 원하는게 가능할 것 같습니다. pObjectExtention 에 어떤 객체의 포인터를 넣어 놓고, procTranslate 가 호출되었...  
335 Talk 줄 바꿈을 n으로 하는 게임에서 벽뚫기 방지 해결책 [1] Hide_D 15082   2008-07-12 2008-07-12 18:09
http://aralgood.com/zbxe/33245 여기 스샷보고 생각난건데, 자릿수를 지정해 주고, n을 새로 먹여주면 벽뚫기가 줄어들지 않을까요.  
334 Talk 0.3 SVN 경로 수정했습니다! [2] Hide_D 15071   2009-12-23 2009-12-23 14:03
현재 아랄트랜스가 있는 서버에 SVN이 추가되어서 속도 향상을 목표로 SVN경로를 다음과 같이 변경했습니다. svn://aralgood.com/araltrans03/trunk revision은 몇가지 실수 빼곤 22개 리비젼 그대로 옮겨두었습니다. 다만 커밋 날짜가 달라지게 되므로 경로를...  
333 Talk 문자열의 길이를 반영하는 '필터' [4] Hide_D 15027   2010-01-19 2010-01-22 01:28
문자열 길이가 고정되어서 포인터 바꿔치기를 통해서도 길이가 바뀌지 않는 것들이 있는데, 이놈들을 위해 길이를 반영하는 필터가 있으면 좋을것 같습니다. 인자로 반영할 메모리 주소 1. 모듈(메모리 주소) 기반 2. 레지스터 기반 으로 ATCode의 그것과 비슷...  
332 Talk [질문] HKCU/Software/AralGood/M2WAddr ? [3] whoami 14960   2008-07-08 2008-07-08 19:14
// CATCodeMgr::Init(ATCodeMgr.cpp) 중에서... // 어플로케일 관련 함수 m_sTextFunc.pfnOrigMultiByteToWideChar = (PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\Software\AralGood"), _T("M2WAddr")); m_sTextFunc.pfnOri...  
331 Archive [플러그인, 소스] CmdFilter 테스트 버전 20080712 [1] file whoami 14942   2008-07-12 2009-01-06 01:00
 
330 Talk 번역 플러그인 난해한 문제???? [3] 호기 14864   2009-03-15 2009-10-20 18:06
지금 ML_Trans라는 번역 플러그인을 만들고 있는데 좀 이해가 안가는 문제가 생기네요.. 아랄에 적용시킨후 다른 번역 플러그인으로 바꿀때는 아무 문제가 안생깁니다 그러니까 번역 플러그인을 EzTransXp<->ML_Trans로 마구 여러번 바꾸어도 문제는 안일어 납...