반응형

기드라에 어두운 테마를 적용해 보자.

 

기드라를 설치하고 실행하면 흰 테마가 적용된다.

 

Edit - Tool Options... 를 클릭한다.

 

Options - Tool 을 클릭한다.

 

Swing Look And Feel - Windows Classic 선택, Use Inverted Colors 체크 박스를 체크 한다.

 

 

OK 버튼을 클릭한다.

 

No 버튼을 클릭힌다.

 

프로그램을 종료하고 재실행하면 어두운 테마가 적용된다.

 

코드 브라우저도 다크 테마가 적용된다.

 

반응형
Posted by J-sean
:
반응형

게임이 다시 시작되어도 언제든 적용할 수 있는 캐릭터 HP 치팅 스크립트를 만들어 보자.

 

게임을 시작한다.

 

HP가 저장된 메모리를 찾는다.

 

HP 메모리 찾기는 위 영상을 참고한다.

 

HP 메모리에 쓰기를 시도하는 opcode를 찾고 HP 감소에 관련된 코드를 선택한다.

 

 

메모리 뷰어에서 어셈블리 코드를 확인한다.

 

오토 어셈블 스크립트를 작성한다.

aobscan() 명령에서 메모리 relocation이 일어나는 코드를 제외하고 '48 89 47 60 83 EC 0C 57 E8'를 검색하도록 한다. 원래는 89부터 시작이었으나 1바이트 전의 48부터 시작했으므로 스크립트에는 INJECT+1을 사용했다.

이렇게 하는게 싫다면 와일드카드 캐릭터를 적용해서 검색한다. (x, ?, *)

 

주소를 하나 추가한다.

 

지금까지 잘 진행되었다면 위와 같이 세팅된다.

 

 

스크립트를 활성화 하고 HP에 변화가 생기면 그때부터 HP를 추적할 수 있다.

처음에 찾은 옵코드가 HP에 변화가 생기는 순간 실행되는 명령이기 때문에 항상 HP를 감시하지는 않는다. 하지만 게임을 종료하고 다시 실행해 메모리 주소에 변화가 생겨도 언제나 올바른 HP 값을 표시하고 변경할 수 있다. 위 그림에서도 확인할 수 있듯이 처음에 찾은 HP 메모리 주소(149CDB50)는 게임이 다시 시작되어 무효한 값이 되었지만 [HP] 심볼로 추가한 메모리 주소는 스크립트 덕분에 언제나 올바른 HP 메모리(149CDC18)를 가리킨다.

 

다른 스테이지에서도 언제나 HP값을 올바르게 찾아준다.

 

반응형
Posted by J-sean
:
반응형

치트 엔진으로 게임에서 수정하고 싶은 값의 주소를 찾아도 게임을 다시 실행시키면 그 주소가 변경되어 처음부터 다시 진행해야만 하는 경우가 있다.(포인터 등으로 해결 불가) 예를 들어 도스박스로 고전 게임을 실행시키는 경우 값의 주소가 변경될 뿐만 아니라 그 값을 기록하는 명령이 다른 여러 주소에 접근하기 때문에 쉽게 에디터를 만들 수가 없다.

 

※ 참고:

2023.01.01 - [Reverse Engineering] - Cheat Engine AOB Injection with DosBox - 치트 엔진 코드 인젝션 도스박스

 

Rick Dangerous 2 게임을 실행하고 번개를 사용해 수치를 변화 시킨다.

 

번개 수치가 저장된 주소를 파악한다.

 

어떤 명령이 번개 수치를 변화 시키는지 확인한다.

 

번개 수치를 변경하는 명령이 접근하는 다른 주소들을 확인한다. 도스박스에서는 굉장히 많은 주소에 접근한다. 그래서 그 명령을 함부로 수정할 수 없다.

 

 

번개 수치 변경 명령을 메모리 뷰어에서 확인하고 AOB Injection을 준비한다.

 

어셈블리 코드를 작성하고 주소 리스트 창에 저장한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[ENABLE]
 
aobscanmodule(INJECT,DOSBox.exe,66 89 34 18 8B 5C 24 14) // should be unique
alloc(newmem,$1000)
globalalloc(editor, 4) // Thunder 주소 저장을 위한 4 바이트 메모리 할당
 
label(code)
label(return)
 
newmem:
  cmp [eax+ebx+61], 'JOHN' // [Thunder 주소+61]에 'JOHN' 문자열이 있다
  jne code          // Thunder 값이 저장된 장소가 아니면 원래 코드 실행
  push edx          // eax+ebx 값을 저장하기 위해 edx 사용
  xor edx, edx      // edx 초기화
  mov edx, eax
  add edx, ebx
  mov [editor], edx // editor 심볼에 Thunder 주소 저장
  mov [eax+ebx], si // 원래 코드 실행
  mov ebx, [esp+14]
  pop edx           // 원래 edx 값 복구
  jmp return
 
code: // 원래 코드
  mov [eax+ebx],si
  mov ebx,[esp+14]
  jmp return
 
INJECT:
  jmp newmem
  nop 3
return:
registersymbol(INJECT)
 
[DISABLE]
 
INJECT:
  db 66 89 34 18 8B 5C 24 14
 
unregistersymbol(INJECT)
dealloc(newmem)
dealloc(editor)         // 6바이트 메모리 해제
 

 

 

번개 수치 주소를 생성한다.

주소 리스트 창에서 위와 같이 번개 수치가 저장된 주소를 스크립트의 [심볼(editor)+offset] 방식으로 생성한다. 아래 폭탄과 생명도 동일한 방법으로 진행한다.

 

 

폭탄 수치 주소를 생성한다.

 

생명 수치 주소를 생성한다.

 

위에서 작업한 내용이 주소 리스트 창에 저장되었다. 스크립트를 실행하고 번개를 한 번 사용하면 각각의 수치들이 정확히 반영된다.

 

도스박스와 게임을 다시 실행하면 모든 주소가 변경되어 엉뚱한 값이 대입 된다.

 

 

다시 스크립트를 실행하고 번개를 한 번 사용하면 모든 값들이 제대로 반영된다.

 

치트 테이블을 저장하면 언제든 다시 스크립트와 모든 수치를 간단히 수정할 수 있다.

 

반응형
Posted by J-sean
:
반응형

작성 중....................

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <Windows.h>
 
static int v1 = 0;
static int v2 = 0;
 
VOID WINAPI Tls_callback1(PVOID DllHandle, DWORD Reason, PVOID Reserved)
{
    if (Reason == DLL_PROCESS_ATTACH)
        v1 = 1;
}
VOID WINAPI Tls_callback2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
{
    if (Reason == DLL_PROCESS_ATTACH)
        v2 = 2;
}
 
#pragma comment (linker, "/INCLUDE:__tls_used")
 
/**** Section 1. Start
TLS callback 함수 등록은 Section 1 이나 Section 2 스타일 모두 가능.
 
#pragma comment (linker, "/INCLUDE:_p_tls_callback1")
 
#pragma data_seg(push)
#pragma data_seg(".CRT$XLC")
EXTERN_C PIMAGE_TLS_CALLBACK p_tls_callback1 = Tls_callback1;
#pragma data_seg(".CRT$XLD")
EXTERN_C PIMAGE_TLS_CALLBACK p_tls_callback2 = Tls_callback2;
#pragma data_seg(pop)
 
Section 1. End ****/
 
/**** Section 2 Start ****/
 
#pragma data_seg(push)
#pragma data_seg(".CRT$XLC")
EXTERN_C PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] = { Tls_callback1, Tls_callback2, 0 };
#pragma data_seg()
#pragma data_seg(pop)
 
/**** Section 2 End ****/
 
int main() {
 
    printf("Test values from tls callbacks are: tls1 = %d, tls2 = %d\n", v1, v2);
 
    return 0;
}
 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <Windows.h>
 
VOID WINAPI Tls_callback(PVOID DllHandle, DWORD Reason, PVOID Reserved)
{
    if (Reason == DLL_PROCESS_ATTACH)
        if (IsDebuggerPresent())
        {
            MessageBoxA(NULL"Debugger present.""Detector", MB_OK);
            exit(-1);
        }
}
 
#pragma comment (linker, "/INCLUDE:__tls_used")
#pragma comment (linker, "/INCLUDE:_p_tls_callback")
 
#pragma data_seg(push)
#pragma data_seg(".CRT$XLC")
EXTERN_C PIMAGE_TLS_CALLBACK p_tls_callback = Tls_callback;
#pragma data_seg(pop)
 
int main() {
 
    printf("No debugger present.");
 
    return 0;
}
 

 

 

 

 

 

 

참고

https://lallouslab.net/2017/05/30/using-cc-tls-callbacks-in-visual-studio-with-your-32-or-64bits-programs/

https://blog.naver.com/stop2y/221201916660

 

 

반응형
Posted by J-sean
:
반응형

x32dbg/x64dbg에서 어셈블리 니모닉 도움말을 사용할 수 있다.

 

수많은 어셈블리 명령에 대한 설명이 없다.

 

설명이 필요한 명령에서 우클릭 - Help on mnemonic을 클릭한다.

 

Log 창에 자세한 설명이 표시된다.

 

전체적으로 간단한 설명을 보고 싶다면 우클릭 - Show mnemonic brief를 클릭한다.

 

 

모든 어셈블리 명령에 대해 간단한 도움말을 표시해 준다.

 

반응형
Posted by J-sean
:
반응형

특정 코드를 레퍼런스하는 명령을 찾아보자.

 

한 화면에 들어오는 가까운 거리에서는 CPU창 왼쪽 화살표로 레퍼런스를 확인할 수 있다.

 

레퍼런스가 멀리 있거나 여러 개 라면 해당 명령(주소)에서 우클릭 - Find references to - Selected Address(es)를 클릭한다.

 

References 창에 레퍼런스가 표시된다.

 

레퍼런스를 좀 더 편하게 확인하고 싶다면 CPU 창에서 우클릭 - Analysis - Analyze module을 클릭한다.

 

 

레퍼런스를 확인하고 싶은 명령에서 우클릭 - xrefs... 를 클릭한다.

 

레퍼런스 창 안의 레퍼런스를 선택하면 그 레퍼런스로 바로 이동할 수 있다. Cancel 버튼을 클릭하면 명령으로 돌아간다.

 

반응형
Posted by J-sean
:
반응형

치트엔진에 주소가 표시될 때 모듈 이름과 상대 주소의 연산으로 표시되지 않고 절대 주소로 표시되도록 해 보자.

 

스캔 결과 중 static 주소는 '모듈이름+상대주소' 방식으로 표시된다. 절대 주소로 표시해 보자.

 

스캔 결과 창에서 우클릭 - Preferences 를 클릭한다.

 

'Show static addresses using their static notat' 의 체크 표시를 해제한다.

 

절대 주소로 표시된다.

 

 

Memory Viewer의 주소 표시 방법도 바꿔보자.

 

View - Show module addresses가 체크되어 있다. 체크해제 한다.

 

절대 주소로 표시된다.

 

반응형
Posted by J-sean
:
반응형

x32dbg/x64dbg가 재배치된 PE 파일을 어떻게 표시하는지 알아보자.

 

프로그램을 x86dbg에서 로드하고 CPU창에서 기계어 코드를 보면 빨간 밑줄로 표시된 코드를 볼 수 있다.  이건 어떤 의미일까? 제일 먼저 만나게 되는 00D93691 주소의 A037D900 을 확인해 보자.

 

우선 Symbols 창을 확인해 보자. notepad.exe는 00D90000 주소에 로딩 되었다.

 

Address of Entry Point는 00003689 이다.

 

Base Relocation Table을 확인해 보면 RVA 3691에 PE 재배치 작업이 필요한 하드코딩 주소가 있는걸 확인할 수 있다. 그래서 x86dbg/x96dbg는 00D93691에 빨간 밑줄을 표시한다.

 

 

다른 위치도 확인해 보자. Base Relocation Table에서 RVA 14AF 주소를 발견했다. 이 위치의 기계어 코드에도 밑줄이 표시되어 있을까?

34AF - 최상위 4비트(Type) = 4AF(Offset)

RVA = 1000(RVA of Block) + 4AF = 14AF

Virtual Address = 00D90000(파일 실제 로딩 주소) + 14AF = 00D914AF

 

00D914AF 주소에 빨간 밑줄이 표시되어 있다.

 

반응형
Posted by J-sean
: