Mọi ứng dụng Windows sử dụng các phần của bộ nhớ. Trong đó gồm 3 thành phần chính là:
● Code s egment: mã lệnh hướng dẫn bộ xử lý thực thi . (EIP trỏ đến mã lệnh sẽ được thực thi tiếp theo)
● Data s egment: biến – varible, dynamic buffer.
● Stack segment: được sử dụng để truyền data (dữ liệu) – tham số
(agrument) vào trong hàm, và được sử dụng như là một nơi lưu trữ biến.
Stack bắt đầu ( đáy stack) tại vị trí kết thúc ( very end) của
trang bộ nhớ ảo ( virtual memory) và giảm dần. Lệnh PUSH thêm
vào đỉnh stack, POP thì l ấy nó ra (4bytes ) và chuyển vào thanh ghi .
Nếu muốn truy cập s tack trực ti ếp, có thể s ử dụng thanh ghi ESP
(Stack Pointer). Thanh ghi này luôn trỏ vào đỉnh stack – địa chỉ thấp
nhất của stack.
Sau khi PUSH, ESP sẽ trỏ đến địa chỉ thấp hơn ( địa chỉ sẽ được giảm
bằng size của dữ liệu được push vào stack – thường l à 4 bytes với địa
chỉ thanh ghi ) Việc giảm địa chỉ thường được thực hiện trước khi đặt dữ
liệu vào stack ( tùy thuộc vào quá trình thực hiện – nếu ESP chỉ vào vị
trí tiếp theo trong
stack, việc giảm sẽ tiến hành sau khi đặt dữ liệu vào stack)
Sau khi POP, ESP trỏ đến đị a chỉ cao hơn (địa chỉ được tăng, thường
là 4bytes). Việc tăng địa chỉ xảy ra khi sau khi gỡ bỏ thành phần ra
khỏi stack.
Khi một hàm/ chương trình con bắt đầu, một frame stack được tạo ra.
Frame này sẽ lưu các thông số của thủ tục trước đó và được sử dụng để
chuyển tham số cho chương trình con. Vị trí hiện tại của con trỏ có thể
truy cập qua ESP – stack pointer. Cơ sở bắt đầu của hàm hiện tại được
chứa trong thanh ghi cơ sở – base pointer (EBP) hoặc frame pointer
Các thanh ghi phổ biến (Intel , x86) là:
● EAX – accumulator: được s ử dụng cho việc tính toán, lưu trữ dữ
liệu ( trong function call chẳng hạn). Sử dụng trong các toán tử cơ
bản như add, subtract, compare.
● EBX: base: ( không có bất kỳ điều gì cần làm với thanh ghi cơ sở)
không có mục đích chính xác và được sử dụng để lưu dữ liệu.
● ECX: counter: được sử dụng để lặp – ECX giảm dần.
● EDX: data : thanh ghi mở rộng của EAX. Cho phép các tính toán
phức tạp hơn ( multiply – divde) bằng cách cho phép mở rộng lưu
trữ dữ liệu tạo điều ki ện cho tính toán ( như lưu thương số vào
EAX, phần dư vào EDX chẳng hạn)
● ESP: stack poi nter
● EBP: base pointer
● ESI: source index: lưu giữ vị trí của input data.
● EDI: desti nation index : chỉ đến vị trí kết quả của toán tử được lưu trữ.
● EIP: ins truction pointer
Process Memory
Khi ứng dụng bắt đầu trong môi trường Win32, tiến trình được tạo và
bộ nhớ ảo (virtual memory) được gán. Với tiến trình 32 bit, địa chỉ bắt
đầu từ 0×00000000 đến 0xFFFFFFFF
Hình 1:
Phân đoạn text (text segment) trong program hình à read-only, và chỉ
bao gồm cod của ứng dụng. Điều này hạn chế sửa đổi code ứng dụng.
Data segment được sử dụng để lưu trữ biến toàn cục (global ) và biến tĩnh (static).
Data segment được sử dụng để khởi tạo global variables , strings , constants
Data segment có khả năng ghi và có size cố định. Heap segment được
sử dụng cho các phần còn lại của program variables . Nó có thể phát
triển lớn hơn hoặc nhỏ hơn thiết kế.Tất cả bộ nhớ trong heap được quản
lý bởi thuật toán cấp phát và thuật toán thu hồi . Một vùng nhớ được
dành riêng bởi thuật toán. Heap sẽ phát triển địa chỉ lên cao hơn .
Stack
Stack là một phần của tiến trình bộ nhớ, một cấu trúc dữ liệu hoạt
động theo mô hình LIFO (Last in first out). Stack được cấp phát bởi OS
cho mỗi thread khi thread được tạo. Khi thread kết thúc, stack sẽ được
xóa. Size của stack được định nghĩa khi được tạo và không thể thay đổi.
Kết hợp với LIFO không đòi hỏi cơ chế quản lý phức tạp nên stack khá
nhanh tuy nhiên bị giới hạn trong kích cỡ
LIFO có nghĩa là dữ liệu được đặt vào gần nhất sẽ là dữ liệu đầu tiên được lấy ra.
Khi stack được tạo, con trỏ stack trỏ về đỉnh của stack (bằng địa chỉ
cao nhất của stack). Ngay khi dữ liệu được push vào stack, con trỏ
stack giảm (tới địa chỉ thấp hơn).
Vì vậy, stack phát triển xuống vùng
địa chỉ thấp hơn
Stack lưu local variables, function call và những thông tin khác mà
không cần lưu trữ trong thời gian lớn. Mỗi lần gọi hàm (function call ),
các tham số của hàm được push vào stack, và các giá trị được lưu vào
các thanh ghi (EIP, EBP). Khi hàm kết thúc , giá trị đã lưu của EIP được
lấy ra từ stack và đặt trở lại EIP, từ đó ứng dụng có thể trở lại bình
thường
Nguồn : http://anninhmang.net/2014/11/thuat-ngu-trong-quan-ly-bo-nho/
No comments:
Post a Comment