본문 바로가기

쓰기

 

 

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

 

변경점

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/Download46]

FrigateBird

2012.03.03
15:30:05

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

 

하는 중....

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

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

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

 

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

List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155437   2008-08-03 2008-12-16 00:03
89 Talk SMSTR 의 부가옵션에 대한 토론.. [4] whoami 3800   2012-02-14 2012-07-12 19:27
ATCode 테스트버전 120207 의 댓글이 너무 복잡하게 꼬여서 이쪽으로 뺍니다. 현재 120207 에서 SMSTR 은 기본적으로 피시님 버전의 OVERWRITE(IGNORE,BUFCHANGE) 모드로만 돌아가도록 만들어져 있습니다. 그런데 피시님께서 부가기능이 필요하시다고 하셨는데...  
88 Archive [소스, 플러그인] ATCode 테스트 버전 120225 file whoami 3212   2012-02-25 2012-06-17 14:31
 
» Archive [소스, 플러그인] ATCode 테스트 버전 120301 [17] file whoami 3360   2012-03-01 2012-06-17 14:29
아하하 ㅡㅗㅡ;;; 역시 테스트 안하고 버그 없기를 바라는 것은 무리였습니다; 변경점 1. LEN 루틴을 만들어놓고 실제 프로그램과 연결 안 했던 문제 수정.....;;;; - LEN 루틴 자체는 로그를 보니 제대로 작동하는 듯 합니다. 2. 옵션에서 LEN 옵션을 꺼도 ...  
86 Archive [소스, 플러그인] ATCode 테스트 버전 120304 [1] file whoami 2675   2012-03-04 2012-03-05 05:43
 
85 Archive [소스, 플러그인] ATCode 120310 [14] file whoami 3592   2012-03-10 2012-04-01 01:56
 
84 Archive [소스, 플러그인] ATCode 120401 [1] file whoami 5061   2012-04-01 2012-04-01 08:44
 
83 Talk ATCode 새로운 기능 추가. [5] EroGame 2518   2012-04-01 2012-04-03 19:19
제가 시간만 된다면 약간의 데모스럽게 소스라도 올려드리는데.. 좀 여의치 않군요. 일단 생각한 방안입니다. 예전부터 필요한 기능이라 생각했는데 이래저래 고민 끝에 해결방안이 나왔습니다. 현재 ATCode의 후킹 방식은 한 함수 내에 후킹 지점부터 리턴 포...  
82 Archive ATCTNR (AralTrans) 120407 [1] file whoami 2085   2012-04-07 2012-04-07 23:10
 
81 Archive [소스, 플러그인] ATCode 120407 [9] file whoami 2856   2012-04-07 2012-05-08 15:56
 
80 Talk 어김없이 기능추가 건의입니다. [3] EroGame 1865   2012-04-22 2012-05-05 09:15
그 뭐냐. 스마트 기능이 어째 제대로 빛을 발휘하지 못하고 있습니다. 왜그런가 되돌아서 생각해보니 발더스카이 개조할때 구현한 기능중 하나가 스마트에서 빠졌다는겁니다;; 그래서 요번 기가 사에서 나온 게임들 전부가 에러 팅팅 거리면서 꺼지더군요. OTL...  
79 Talk 픽스라인 추가기능 건의. EroGame 1799   2012-04-29 2012-04-29 15:18
현재 픽스라인에 버그도 버그가 많지만.. 일단 부가적으로 추가할 기능 몇개 끄적여 놓고 갑니다. (까먹을까봐) 1.패턴 중 인자값에서 번역 인자로 지정할때(임의의 길이 설정시) 공백 제거 기능 추가 말 그대로 임의 길이로 지정하여 번역함으로 해놓고 그 부...  
78 Talk LEN 기능에서 체크기능 제거 및 투가기능. EroGame 1766   2012-05-10 2012-05-10 10:37
현재 LEN 기능으로 길이 연산 체크를 할때 -1이나 0의 범위까지 0x00인 NULL 문자로 길이 체크를 하잖아요? 그렇지 않은 경우도 있네요. 길이는 있으나 해당 번역문+길이 위치에 NULL문자가 없는 형태의 길이 교체형태도 추가주세요. (그때는 길이값만 변하도...  
77 Archive [소스, 플러그인] ATCode 120521 [9] file EroGame 2065   2012-05-21 2012-06-10 13:17
 
76 Talk XP에서 번역시 단순에 의한 띄어쓰기 처리... [3] EroGame 1798   2012-05-28 2012-05-30 09:05
xp 에서 간혹 이지트랜스의 단순 딕을 사용시 나오는 하나의 버그가 있습니다. 예를 들면 @np20003이것은 대사입니다.%K 라는 대사가 있다고 가정할때 윈7에서는 필터 없이 그냥 번역을 거처도 앞뒤에 있는 1바이트 명령어에 아무런 변질도 되지 않고 나오게 ...  
75 Talk 스마트와 조금 다른 엔진의 처리...(알고보니 유리스엔진) [3] EroGame 1904   2012-05-30 2012-06-09 23:37
예전에 그 아랄과 최악의 상성으로 불리던 처리 방식이 KLEIN 사의 青空と雲と彼女の恋 여기서도 사용되네요. 그냥 포기할까 하다가... 스마트 방식과는 별개로 처리 방식을 하나 만들어야 될것 같습니다. (아래와 같은 처리를 한걸 여럿 보아왔기 때문에.. 스...  
74 Archive [소스, 플러그인] ATCode 120610 테스트 버전 [5] file EroGame 2067   2012-06-10 2012-06-11 00:17
 
73 Archive [소스, 플러그인] ATCode 120613 [1] file EroGame 1740   2012-06-13 2012-07-12 19:27
 
72 Archive [소스, 플러그인] ATCode 120618 [2] file EroGame 1634   2012-06-14 2012-06-18 00:48
 
71 Talk ATCode에 추가했던 ASLR 있잖아요. [2] EroGame 1767   2012-06-18 2012-08-03 08:38
http://lab.aralgood.com/index.php?document_srl=49989 이때 추가한건데 이거 따로 분리해서 사용 유무 지정하는게 좋을것 같네요. (xp에서는 무반응으로 처리하고) 특정 게임에서 연산중 뻗는 경우 발견되었습니다. 더미다 같은경우는 굳이 연산안들어가고 ...  
70 Archive [소스, 플러그인] ATCode 120725 [22] file EroGame 1702   2012-07-25 2012-07-30 08:14