46
ASSEMBLY http://learn-tech-tips.blogspot.com [email protected]

Assembly v1.0

  • Upload
    huu-vi

  • View
    26

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Assembly v1.0

ASSEMBLYhttp://learn-tech-tips.blogspot.com

[email protected]

Page 2: Assembly v1.0

MỤC TIÊU

Giúp các bạn có một cái nhìn tổng quan về ngôn ngữ Assembly

Áp dụng một số phương pháp để phân tích chương trình bằng tool Olly

Hiểu được phương pháp lấy BaseAddress bằng tool Cheat Engine

Page 2

Page 3: Assembly v1.0

NỘI DUNG• Giới thiệu màn hình• Cấu hình chương trinh và cài đặt plugin cần thiết• 5 cửa sổ chính• Các cửa sổ khác

Giới thiệu tool Ollydbg v1.1

• Thanh ghi dữ liệu• Thanh ghi con trỏ• Cờ trạng thái• Cú pháp hợp ngữ• Các lệnh liên quan đến stack• Các lệnh lưu trữ dữ liệu• Các lệnh dùng cho tính toán• Các lệnh logic• Các lệnh so sánh• Các lệnh nhảy có điều kiện, không điều kiện

Hợp ngữ - Assembly

• Bài 1 Debug search thông tin cần thiết• Bài 2

• Reverse engine tìm CD.Key• Code C++ demo

Chương trinh demo

• Giới thiệu màn hình• Chương trình demo• Code C++ demo

Hướng dẫn sử dụng tool Cheat Engine 6.2

Page 3

Page 4: Assembly v1.0

OLLYDBG V1.1

Page 5: Assembly v1.0

OLLYDBG V1.1 – Giới thiệu

Ollydbg gọi tắt là Olly, là một chương trình dùng để debug bộ nhớ dễ sử dụng, trực quan.

Hiện nay đã có phiên bản 2.0, phiên bản này đang bị lỗi font và định dạng

Page 5

Page 6: Assembly v1.0

OLLYDBG V1.1 – Cài đặt và cấu hình Olly

Download trên link: http://www.ollydbg.de/ Appearance Directories

UDD PathPlugin Path

Page 6

Page 7: Assembly v1.0

OLLYDBG V1.1 – 5 cửa sổ Chính

Màn hình chính của Olly chia thành 5 cửa sổ chính (nhấn Tab/shift-Tab để chuyển đổi các cửa sổ với nhau).

Page 7

Page 8: Assembly v1.0

OLLYDBG V1.1 – 5 cửa sổ chính

The Disassembler window: xem code của chương trình ở dạng ngôn ngữ ASM

The Registers window: cửa sổ chứa thông tin chi tiết các thanh ghi: EAX, EBX, ECX, EDX,… các cờ trạng thái

The Dump window: xem dữ liệu bộ nhớ ở hai dạng hex và ascii

The Stack window: cho phép xem dữ liệu trước khi được thực hiện phải được nạp vào stack.

The Tip window: cho xem thông tin chi tiết về các dòng code.

Page 8

Page 9: Assembly v1.0

OLLYDBG V1.1 – Registers Window

The Registers window

Page 9

Page 10: Assembly v1.0

OLLYDBG V1.1 – Stack Window

The Stack window Nơi lưu trữ tạm thời các dữ liệu và địa chỉ Là cấu trúc dữ liệu một chiều (các phần tử được cất vào và lấy ra từ

một đầu của cấu trúc này) Cơ chế xử lý: LIFO (Last In First Out)

Page 10

Page 11: Assembly v1.0

OLLYDBG V1.1 – Dump Window The Dump window

Cửa sổ hiện thị nội dung bộ nhớ hay file. Cho phép tìm kiếm cũng như thực hiện các chức năng chỉnh sửa, thiết

lập Break points

Page 11

Page 12: Assembly v1.0

OLLYDBG V1.1 – cửa sổ khác (1)

Các cửa sổ khác L: mở cửa sổ log của Olly E: mở cửa sổ Executables, cửa sổ đưa ra danh sách những file có khả

năng thực thi được chương trình sử dụng như file exe, dlls, ocsx,… M: mở cửa sổ Memory, cho biết thông tin về bộ nhớ đang sử dụng bởi

chương trình. T: mở cửa sổ Thread, liệt kê các Threads của chương trình W: mở cửa sổ windows H: mở cửa sổ Handles

Page 12

Page 13: Assembly v1.0

OLLYDBG V1.1–cửa sổ khác (2) C: mở cửa sổ CPU.

/: mở cửa sổ Patches, cửa sổ này sẽ cho chúng ta các thông tin về những gì mà chúng ta đã edit trong chương trình

K: mở cửa sổ call stack, hiển thị một danh sách các lệnh call mà chương trình chúng ta thực hiện

B: mở cửa sổ Break Points R: mở cửa sổ References, cửa sổ này là kết quả cho những gì chúng ta

thực hiện chức năng search trong Olly

Page 13

Page 14: Assembly v1.0

ASSEMBLY LANGUAGE

Page 15: Assembly v1.0

ASSEMBLY – Thanh ghi dữ liệu (1)

Thanh ghi dữ liệu (32 bit) EAX: thường sử dụng trong các lệnh số học và chuyển dữ liệu. EBX: thanh ghi địa chỉ, chỉ đến vị trí ô nhớ. ECX: xác định số lần lặp của một lệnh. EDX: lưu kết quả của phép “*” hoặt “/’.

Thanh ghi dữ liệu (16 bit) AX = AH + AL (H: High; L: Low) BX = BH + BL CX = CH + CL DX = DH + DL

Page 15

Page 16: Assembly v1.0

ASSEMBLY – Thanh ghi dữ liệu (2)

Ví dụ: EAX = 0x12345678H (32 bits)

AH = 0x56H (8 bits) AX = 0x5678H

AL = 0x78H (8 bits)

Các thanh ghi khác cũng được phân tách tương tự như thanh ghi EAX

Page 16

Page 17: Assembly v1.0

ASSEMBLY – Thanh ghi con trỏ

Thanh ghi ESP Trỏ tới đỉnh hiện thời của ngăn xếp

Thanh ghi EBP Truy xuất dữ liệu trong ngăn xếp

Thanh ghi EIP Không bị tác động trực tiếp bởi các lệnh Cho biết địa chỉ của câu lệnh tiếp theo sẽ được thực hiện

Page 17

Page 18: Assembly v1.0

ASSEMBLY – Cờ trạng thái

CF (Carry Flag): Cờ nhớ – Bật khi phép tính vừa thực hiện có sử dụng bit nhớ

AF (Auxiliary Carry Flag): cờ nhớ phụ– Bật khi phép tính vừa thực hiện có sử dụng bit nhớ phụ

PF (Parity Flag): Cờ chẵn lẻ– Bật khi kết quả của phép tính vừa thực hiện có chẵn bit 1

ZF (Zero Flag): Cờ Zero– Bật khi kết quả của phép tính vừa thực hiện = 0

SF (Sign Flag): Cờ dấu– Bật khi kết quả của phép tính có bit cao nhất được bật

OF (Overflow Flag): Cờ tràn– Bật khi phép tính vừa thực hiện gây ra tràn số

Page 18

Page 19: Assembly v1.0

ASSEMBLY – Cú pháp

Câu lệnh hợp ngữ có cú pháp sau:Tên Toán hạng đích Toán hạng nguồn

Ví dụ:MOV EAX, 0x12; MOV EAX, DWORD PTR [401000];

Page 19

Page 20: Assembly v1.0

ASSEMBLY–lệnh liên quan Stack (1)

PUSH– Dùng để cất / thêm dữ liệu vào trong ngăn xếp

– Ví dụ:

Page 20

Page 21: Assembly v1.0

ASSEMBLY–lệnh liên quan Stack (2)

POP– Lấy giá trị từ đỉnh stack vào một nơi mà chúng ta chỉ định để nhận giá trị

được lấy ra

– Ví dụ:

POP Eax; // lấy giá trị từ đỉnh stack và lưu nó vào thanh ghi EAX

Page 21

Page 22: Assembly v1.0

ASSEMBLY–lệnh lưu trữ dữ liệu (1)

MOV– Gán dữ liệu hay số vào thanh ghi bộ nhớ

– Ví dụ:

Page 22

Page 23: Assembly v1.0

ASSEMBLY–lệnh lưu trữ dữ liệu (2)

MOVSX– Thực hiện sao chép nội dung của toán hạng nguồn, có thể là thanh ghi

hay ô nhớ (với điều kiện toán hạng nguồn phải có độ dài nhỏ hơn toán hạng đích) vào toán hạng đích đồng thời sẽ điền đầy các bit bên trái bằng bít có trọng số cao nhất (số 1 hay F)

– Ví dụ:

Page 23

Page 24: Assembly v1.0

ASSEMBLY–lệnh lưu trữ dữ liệu (3)

XCHG– Trao đổi nội dung của hai toán hạng. – Ví dụ:

Page 24

Page 25: Assembly v1.0

ASSEMBLY–lệnh lưu trữ dữ liệu (4)

NOP– Lệnh này không thực hiện một công việc gì cả ngoại trừ việc tăng nội

dung của thanh ghi EIP (không gây ra bất kỳ thay đổi nào trong thanh ghi, stack hay memory).

– Dùng vào việc hủy bỏ bất kỳ câu lệnh nào

Page 25

Page 26: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (1)

INC– Cộng thêm 1 vào nội dung của thanh ghi hay một ô nhớ

DEC – Trừ thêm 1 vào nội dung của thanh ghi hay một ô nhớ– Ví dụ:

Page 26

Page 27: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (2)

ADD– Lệnh này được sử dụng để cộng nội dung

Giữa hai thanh ghi, Một thanh ghi và một ô nhớ Cộng một số với một thanh ghi Cộng một số với một ô nhớ

Lệnh sau tương đương ADD EAX, 1 <==> INC EAX

Page 27

Page 28: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (3)

SUB– Lệnh này được sử dụng để trừ hai nội dung

Giữa hai thanh ghi, Một thanh ghi và một ô nhớ Trừ một số với một thanh ghi Trừ một số với một ô nhớ

Lệnh sau tương đương SUB EAX, 1 <==> DEC EAX

Page 28

Page 29: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (4)

MUL Cú pháp: MUL Toán hạng gốc

– Nhân số không dấu, trong trường hợp này toán hạng gốc là số nhân. Tùy theo độ dài của toán hạng gốc mà ta có ba trường hợp để tổ chức phép nhân,

– Nếu gốc là số 8 bit: AL * Gốc• Số bị nhân phải là số 8 bit để trong AL• Kết quả sau khi nhân lưu trong : AX

– Nếu gốc là số 16 bit: AX * Gốc• Số bị nhân phải là số 16 bit để trong AX• Kết quả sau khi nhân lưu trong DX, AX

– Nếu gốc là số 32 bit: EAX * Gốc• Số bị nhân phải là số 32 bit để trong EAX• Kết quả sau khi nhân lưu trong EDX, EAX

Page 29

Page 30: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (5)

– Ví dụ (MUL):MUL ECX thực hiện nhân ECX với EAX, kết quả sẽ được lưu vào EDX:EAX

EAX: lưu trữ kết quả phép nhân EDX: lưu trữ phần dư

Page 30

Page 31: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (6)

IMUL Cú pháp: MUL Toán hạng gốc

– Nhân số có dấu, trong trường hợp này toán hạng gốc là số nhân. Tùy theo độ dài của toán hạng gốc mà ta có ba trường hợp để tổ chức phép nhân,

– Nếu gốc là số 8 bit: AL * Gốc• Số bị nhân phải là số 8 bit để trong AL• Kết quả sau khi nhân lưu trong : AX

– Nếu gốc là số 16 bit: AX * Gốc• Số bị nhân phải là số 16 bit để trong AX• Kết quả sau khi nhân lưu trong DX, AX

– Nếu gốc là số 32 bit: EAX * Gốc• Số bị nhân phải là số 32 bit để trong EAX• Kết quả sau khi nhân lưu trong EDX, EAX

Page 31

Page 32: Assembly v1.0

ASSEMBLY–lệnh dùng tính toán (7)

DIV Cú pháp: DIV Toán hạng gốc

– Chia số không dấu, trong trường hợp này toán hạng gốc là số chia. Tùy theo độ dài của toán hạng gốc mà ta có hai trường hợp để tổ chức phép chia,

– Nếu số 16 bits chia cho gốc là số 8 bit: AX / Gốc• Số dư lưu trong AH• Thương lưu trong AL

– Nếu số 32 bits chia cho gốc là số 16 bit: EAX / Gốc• Số dư lưu trong DX• Thương lưu trong AX

Page 32

Page 33: Assembly v1.0

ASSEMBLY–lệnh dùng tính toán (8)

IDIV Cú pháp: IDIV Toán hạng gốc

– Chia số có dấu, trong trường hợp này toán hạng gốc là số chia. Tùy theo độ dài của toán hạng gốc mà ta có hai trường hợp để tổ chức phép chia,

– Nếu số 16 bits chia cho gốc là số 8 bit: AX / Gốc• Số dư lưu trong AH• Thương lưu trong AL

– Nếu số 32 bits chia cho gốc là số 16 bit: EAX / Gốc• Số dư lưu trong DX• Thương lưu trong AX

Page 33

Page 34: Assembly v1.0

ASSEMBLY–lệnh cho tính toán (9)

XADD– Thực hiện hai lệnh XCHG, ADD

NEG– Thực hiện bù hai của một toán hạng hay còn gọi là đảo dấu của một

toán hạng ( bù hai đảo bit của toán hạng và cộng thêm 1)– Ví dụ

Page 34

Page 35: Assembly v1.0

ASSEMBLY – Các lệnh logic

Page 35

Page 36: Assembly v1.0

ASSEMBLY – lệnh so sánh (1)

CMP– Cú pháp: CMP Toán hạng đich, Toán hạng nguồn– Mục đích dùng để so sanh hai toán hạng với nhau– Tác dụng chủ yếu lên cờ – Bảng công thức

Page 36

Page 37: Assembly v1.0

ASSEMBLY – lệnh so sánh (2)

TEST– Cú pháp: TEST Toán hạng đich, Toán hạng nguồn– Công thức

Toán hạng nguồn = Toán hạng đích ZF = 1 Toán hạng nguồn khác toán hạng đích ZF = 0

Page 37

Page 38: Assembly v1.0

ASSEMBLY – Các lệnh nhảy (1)

Lệnh nhảy không điều kiện– Cú pháp: JMP <Vị trí nhảy đến>– Chương trình gặp lệnh này sẽ nhảy ngay lập tức – Ví dụ:

• JMP [401000];

Page 38

Page 39: Assembly v1.0

ASSEMBLY – Các lệnh nhảy (2)

Lệnh nhảy có điều kiện

Page 39

Page 40: Assembly v1.0

ASSEMBLY – Các lệnh nhảy (3)

Page 40

Page 41: Assembly v1.0

DEMO

Page 42: Assembly v1.0

OLLYDBG, DEMO – Bài 1Phân tích chương trình

Page 42

Page 43: Assembly v1.0

OLLYDBG, DEMO – Bài 2Phân tích chương trìnhCode C++ demo

Page 43

Page 44: Assembly v1.0

CHEAT ENGINE 6.2

Page 45: Assembly v1.0

CHEAT ENGINE 6.2 – Giới thiệuPhân tích chương trình

Code C++ demo

Page 45

Page 46: Assembly v1.0

Thank you

Page 46

• http://learn-tech-tips.blogspot.com