반응형

C 코드를 어셈블리 코드로, 어셈블리 코드를 기계 코드로 바꿔보자.

 

콘솔 명령어 CMD를 실행하는 C 코드를 작성하고 빌드한다.

 

실행하면 콘솔 화면이 나타난다.

 

브레이크 포인트를 걸고 디버깅한다.

 

C 코드가 디스어셈블리된 코드를 확인할 수 있다.

 

 

디버거를 이용해 kernel32.dll의 WinExec() 주소를 확인한다. (0x75E3E120)

디버거로 확인한 WinExec() 주소는 재부팅 할 때마다 변경된다.

 

확인한 어셈블리 코드와 WinExec() 주소를 적당히 편집해 어셈블리 코드를 작성한다. 빌드하고 실행하면 콘솔 화면이 실행된다.

 

WinExec() 가 실행되기 전 코드에 브레이크 포인트를 걸고 디버깅한다. 이번엔 기계 코드를 확인한다.

 

DEP(Data Execution Prevention)를 No로 세팅한다.

 

 

기계 코드를 작성하고 빌드한다. 실행하면 콘솔 화면이 실행된다.

 

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

C/C++과 어셈블리 모듈을 사용해 보자.

 

빈 프로젝트를 만들고 위와 같이 어셈블리 모듈 소스를 입력한다.

원래 0~4,294,967,295 사이의 정수만 반환하는 함수를 목적으로 작성되었으나 오류가 있는거 같다. 다시 확인해 보자.

 

C 소스를 입력한다.

 

이 상태에서 빌드하면 에러가 발생한다.

 

Solution Explorer - 어셈블리 소스 우클릭 - Properties를 클릭한다.

 

 

Property Pages에서 General - Item Type - Custom Build Tool을 선택하고 적용을 클릭한다.

 

Custom Build Tool - General에서 Command Line과 Outputs에 위와 같이 입력한다.

Command Line: ml /c /Cx /coff %(FileName).asm
Outputs: %(FileName).obj

 

빌드하고 실행한다.

 

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

어셈블리 언어로 작성된 프로그램 실행 시 인수를 확인해 보자.

 

소스를 입력하고 빌드한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
include masm32rt.inc
 
.data
    strTitle db "Command Line Arguments",0
    strMessage db 128 dup(?)
 
.code
start:
    invoke GetCL, 1, ADDR strMessage
    invoke MessageBox, 0, ADDR strMessage, ADDR strTitle, MB_OK
    invoke ExitProcess, 0
end start
 

 

GetCL 함수의 첫 번째 인수로 1을 주면 프로그램의 첫 번째 인수가 저장된다.

 

첫 번째 인수 'abcd'가 출력된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
include masm32rt.inc
 
.data
    strTitle db "Command Line Arguments",0
    strMessage db 128 dup(?)
 
.code
start:
    invoke GetCL, 0, ADDR strMessage
    invoke MessageBox, 0, ADDR strMessage, ADDR strTitle, MB_OK
    invoke ExitProcess, 0
end start
 

 

GetCL 함수의 첫 번째 인수로 0을 주면 프로그램 파일명이 저장된다.

 

파일 이름 First.exe가 출력된다.

 

반응형
Posted by J-sean
:

RadASM Debugging 디버깅

Assembly 2023. 2. 2. 15:33 |
반응형

RadASM으로 어셈블리 소스를 디버깅 해 보자.

 

소스를 입력한다.

 

Project - Project Options를 클릭한다.

 

Debug를 선택한다.

 

빌드한다. Make - Build

 

 

원하는 위치에 브레이크 포인트를 설치한다. Make - Debug - Toggle Breakpoint

 

디버깅을 시작한다. Make - Debug - Run

 

레지스터등 디버깅 정보가 표시되고 브레이크 포인트에서 실행이 정지된다.

 

Run, Break, Stop, Step Into, Step Over등을 사용하여 디버깅 한다.

 

반응형
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
:
반응형

비주얼 스튜디오로 어셈블리 디버깅 시 레지스터 창 플래그 정보가 이상하게 표시되어 그 의미를 알기 어렵다. 어떤 의미를 가지는지 확인해 보자.

 

 

Flags Set value
Overflow OV = 1
Direction UP = 1
Interrupt EI = 1
Sign PL = 1
Zero ZR = 1
Auxiliary carry AC = 1
Parity PE  = 1
Carry CY = 1

 

※ 참고 1

About the Registers Window in Visual Studio

 

※ 참고 2

디버깅시 레지스터 윈도우가 뜨지 않는다면 아래와 같이 설정을 변경한다.

 

Debug - Windows - Registers 선택

 

Registers 윈도우 우클릭 - Flags 선택

 

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

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

 

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

 

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

 

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

 

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

 

 

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

 

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

비주얼 스튜디오로 어셈블리 프로젝트를 시작해 보자.

 

Empty Project를 만든다.

 

프로젝트에 적당한 파일을 add한다. 확장자만 asm으로 지정하면 된다.

 

Solution Explorer - Project Name 우클릭 - Build Dependencies - Build Customizations...

 

masm(.targets, .props)를 선택한다.

 

 

소스파일 우클릭 - Properties

 

Item Type - Microsoft Macro Assembler를 선택한다.

 

32비트 프로그램을 개발한다면 x86을 선택한다.

 

별도의 라이브러리를 사용한다면 아래와 같이 세팅한다.

Irvine.zip
1.30MB

 

Solution Explorer - Project Name 우클릭 - Properties

 

 

사용할 라이브러리의 디렉토리 경로를 입력한다.

 

라이브러리 이름을 입력한다.

 

Microsoft Macro Assembler - General - Include Paths에 라이브러리 경로를 한 번 더 입력한다.

 

소스를 입력한다.

 

 

빌드하고 실행한다.

 

Syntax Highlighter는 AsmDude나 ChASM을 사용한다.

 

ChASM - works with Visual Studio 2022

AsmDude - works with 2015, 2017, 2019

 

ChASM.vsix
0.27MB

 

※ 참고

 

Release 모드에서 SAFESEH 관련 LNK1281, LNK2026 에러가 발생할 수 있다.

 

Microsoft Macro Assembler - Advanced - Use Safe Exception Handlers를 Yes (/safeseh)로 바꾼다.

 

 

작업중인 Sorce.obj 파일의 에러는 해결되었지만 라이브러리 파일의 에러는 해결되지 않았다.

 

Linker - Advanced - Image Has Safe Exception Handlers를 No (/SAFESEH:NO)로 바꾼다.

 

에러가 사라졌다.

 

※ 참고

리스트 파일을 생성해야 한다면 아래와 같이 세팅한다.

 

Microsoft Macro Assembler - Listing File - Assembled Code Listing File - 파일 이름을 지정한다.

 

 

프로젝트를 빌드하면 리스트 파일이 생성된다.

 

반응형
Posted by J-sean
: