본문 바로가기

쓰기

 

 

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

 

변경점

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

FrigateBird

2012.03.03
15:30:05

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

 

하는 중....

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

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

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

 

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

List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
109 Talk ATCode에 @가 붙은 글꼴을 빼버려야겠군요 Hide_D 16792   2010-12-11 2010-12-11 16:28
질문 게시판에 백년 만년 올라오는 왜 글자가 옆으로 누워있죠? 를 막으려면 역시 @붙은 글꼴은 빼는게 제격입니다 ㅠ 대신 아래에 체크로 @ 허용 같은거 하나 만들어두고요  
108 Talk DenyWord + 정규표현식? Hide_D 17305   2010-12-18 2010-12-18 00:05
어차피 문자열을 찾는 구조였으니 그냥 Boost꺼나 C++0x의 STL에 달려있는 정규표현식 모듈 들고와서 Deny, Allow, Exact에다 정규 표현식도 합쳐볼까요?  
107 Talk 웹 계정 아이디/비밀번호 secret Hide_D 1   2011-01-02 2011-01-02 16:21
비밀글입니다.  
106 Archive [소스] CustomDic v4 20110102 테스트버전 [1] file Hide_D 17513   2011-01-02 2011-01-03 06:08
 
105 Archive [소스] CustomDic v4 20110104 테스트버전 [3] file Hide_D 16410   2011-01-04 2011-01-05 06:00
 
104 Archive [플러그인] CustomDic 4.0.4.131 RC [5] file Hide_D 24298   2011-01-05 2011-04-24 21:07
 
103 Talk 폰트함수인덧 아무개 18005   2011-01-11 2011-01-11 23:38
CreateFontIndirect_Correct 누가 후킹 하나열[...........]  
102 Talk AppLoc.exe를 거치지 않고 AppLocale 가동시키는 법! Hide_D 18684   2011-01-28 2011-01-28 01:54
환경 변수 두개를 다음과 같이 세팅합니다. set __COMPAT_LAYER=#APPLICATIONLOCALE set AppLocaleID=411 그리고 나서 원하는 프로그램을 돌리면 자동으로 AlLayer.dll이 인젝션 됩니다.  
101 Talk 작전명. '누덕누덕' 작전 시작 Hide_D 10674   2011-02-18 2011-02-18 00:02
AralTrans 0.2에서 시작해서 눈꼽만큼씩 고쳐나갈 생각입니다. 주 타겟 OS : Windows 7 32bit 목표 일자 : 2012년 오기 전 PS : JSCustom 프로젝트는 연기되었습니다.  
100 Talk AT 0.3 재설계 프로젝트 [1] 아랄 10551   2011-04-16 2011-04-17 09:52
1. 인젝터-서버 방식 2. IDE = vs2010 3. AT 0.3에서 시도하려 했던 중복 기능의 모듈화는 유효, 모듈 명명은 언제든 변할 수 있음 FontMapper, UITrans 4. 스크립트 엔진 = v8 5. 각 플러그인은 운용중인 파일을 반환하는 인터페이스를 가져야 함 6. Launcher...  
99 Talk 컨텍스트 구조 제안(핸들러 구조) [4] Hide_D 8336   2011-04-21 2011-04-23 20:17
가령 모듈 3가지가 DumpText, FixLine, EzTransXP 요렇게 있다고 가정할때 var c0_EzTransXP = new EzTransXP("NoSpace"); var c0_DumpText = new DumpText("KOut,KHex,KHex16"); var c0_FixLine = new FixLine("/ATData/c0.dat"); c0_DumpText.setNext(c0_EzT...  
98 Talk Windows 7, UAC, 64bit Hide_D 9107   2011-04-24 2011-06-28 01:25
사실상 요새 구입하는 '최신형' 컴퓨터들이 갖는 세팅이 Windows 7 64bit에다가 UAC를 기본값으로 두고 사용하는 방식인데, 기존 아랄트랜스가 여기에 대응하지 못하는 부분이 많습니다. Windows 7 - 사실 이게 제일 속편합니다. 이거 자체로는 문제되는 부분...  
97 Archive ATCode 손보기 20111003 [3] FrigateBird 5924   2011-10-03 2011-12-12 18:46
http://polaris.aralgood.com/index.php?document_srl=1779329 예시 코드 *기능 HEX-16 (VIEW) 원문 XX XX XX XX XX XX XX XX XX XX XX XX <-원문도 박힘 (포인터 4 BYTE, 또는 메모리 효율상 한 라인으로 해결될때는 14~15BYTE 로 사용하여 원문이 메모리에 ...  
96 Archive [실행파일] AralTrans 테스트 버전 20111027 [4] file whoami 5178   2011-10-27 2011-11-01 21:40
 
95 Talk FrigateBird님의 ATCode 20111003버전에 대하여.. [9] whoami 4957   2011-11-02 2011-12-10 16:16
일단 FrigateBird(잘 알려진 피시로 호칭)님의 ATCode 20111003 (줄여서 1003버전) 을 한번 훑어보았는데요, 1003 버전의 주된 변경점은 Siglus 엔진에 대한 지원이 주를 이루고 있습니다. 물론 기존 ATCode 의 버그를 잡은 것도 있지만 마이너하니 넘어갑니다...  
94 Talk AralTrans, ATCTNR 111112 버전 SVN에 추가. [1] whoami 5260   2011-11-12 2012-06-17 14:29
ATCTNR 의 SVN 소스가 후킹모드 2로 되어있었는데.. 아마 예전에 지나가다정착한이A 님이 발안해서 테스트하던 후킹모드 2 판의 소스가 올라가있었던 듯 합니다. 뭐.. 실제 머리싸매고 고민하다 보니 의외로 돌려놓기가 어렵지 않아서 후킹모드 1로 돌려놓고 ...  
93 Talk XP3Dumper! [1] Hide_D 5000   2011-12-12 2011-12-24 02:57
기리기리랑 합치면 좀 재밌는게 나올 것 같아서 뜯어보고 있습니다. 결과물은 아마 내년(ㅋㅋㅋ)에 나올것 같네요  
92 Archive [소스,플러그인] ATCode 테스트 버전 20120207 [16] file whoami 3274   2012-02-07 2012-03-01 04:26
 
91 Talk AralTrans 20120214 버전 변경점 [6] whoami 4193   2012-02-14 2012-06-17 14:29
아랄트랜스 20120214 버전에서의 변경점 1. ATCTNR.dll 버그 수정 - 모듈 정보에서 이미지 파일 크기가 부정확할 경우 Access Violation 에러가 나는 문제 해결. Rewrite (Key) 에서 작동 확인. 다른 게임은 미확인이나 피시님의 ATCTNR 패치가 거의 동일하기 ...  
90 Talk CustomDic의 동작 방식에 대해서 secret Hide_D 4   2012-02-14 2012-02-14 13:36
비밀글입니다.