Tim hieu thanh ghi in asm

4,772 views

Published on

tìm hiểu về thanh ghi trong assembly

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,772
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
94
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tim hieu thanh ghi in asm

  1. 1. Các thanh ghi 32 bit1. Nhóm các thanh ghi công dụng chung:a. 8 Thanh ghi đa năng 32 bit: EAX, EBX, ECX, EDX, ESI, EDI, DBP, ESP dùng đểlưu trữ tham số của các phép tính, tham số của các phép tính địa chỉ, và con trỏbộ nhớ (bên ngoài), thanh ghi ESP đặc biệt chỉ dùng làm con trỏ ngăn xếp.b. 6 thanh ghi đoạn 16 bit: CS, DS, SS, ES, FS, GS dùng để lưu trữ bộ chọn đoạnđể quản lý bộ nhớ trong mô hình phẳng hoặc phân đoạn.c. Thanh ghi cờ EFLAGS 32 bit dùng để giám sát 32 trạng thái của dử liệu đangtính toán trong các thanh ghi nói trênd. Thanh ghi con trỏ lệnh EIP dùng để lưu địa chỉ lệch của mã lệnh sắp tiến hành.thanh ghi này hầu như không cho phép truy cập, nếu muốn thì chỉ có thể dunglệnh call để đọc giá trị của con trỏ lệnh từ ngăn xếp.e. 4 thanh ghi quản lý bộ nhớ 48 Bit đó là: GDTR, LDTR, IDTR dùng để quản lý bộnhớ (ram)f. 1 thanh ghi nhiệm vụ 64 bit dùng để điều khiển các chức năng đặc biệt khi hệđiều hành thay đổi cách quản lý bộ nhớ (ví dụ hệ điều hành dos thì quản lý bộnhớ theo kiểu thực còn windows thì quản lý theo kiểu phân trang, bảo vệ...)g. 5 thanh ghi điều khiển 32 bit: CR0, CR1, CR2, CR3, CR4h. 8 thanh ghi 32 bit từ DR0 --DR7 debug dùng để kiểm tra quá trình debug bêntrong vi xử lý.2. Nhóm các thanh ghi tạmđây là các thanh ghi trung gian từ 32 bit cho đến 127 bit, trong quá trình vi xử lýtiếp nhận mã lệnh từ tiểu hệ bộ nhớ L1, nó sẽ chia nhỏ cái lệnh đó ra thành nhiềuvi lệnh rồi chuyển giao cho các bộ ALU tính toán, hoặc nếu có tính toán số thựcthì nó sẻ chuyển giao cho bộ đồng xử lý toán học giải quyết, sau khi tính toán nósẽ tổng kết số liệu lại rồi trả kết quả, đây là mô hình siêu đường ống cực kỳ phứctạp.--------------Chi tiếtNhắc lại kiến thức cũ về các thanh ghi 16bitKhi 1 chương trình được nạp vào bộ nhớ thì nó bao gồm các phần sau đây:code:chứa các mã lệnh,nó được nạp vào 1 phần của bộ nhớ tại 1 khoảng khônggian vật lý riêng,phần này là code segmentdata:chứa các dữ liệu của chương trình và các dữ liệu phát sinh,nó nạp vào datasegmentstack: chứa địa chỉ quay về,cất và phục hồi các thanh ghi,nằm ở stack segmentĐể quản lý bộ nhớ thì có kỹ thuật phân trang(paging) hoặc phânđoạn(segmentation).Phân đoạn thì như trên đã nêu.các segment được chia ra và đặt "lung tung" trênbộ nhớ,hệ điều hành quản lý bằng cách tạo ra danh sách quản lý các vùng còntrống trên bộ nhớTrong mỗi segment cũng chia ra những phần nhỏ,ví dụ như code segment chẳnhạn chứa 1 dãy liên tục các lệnh liên tục nhau thì vị trí từng lệnh cũng được đánhdấu,đó là địa chỉ offset--Các thanh ghi phân đoạn(segment) sẽ làm nhiệm vụ đánh dấu địa chỉ của nơi bắtđầu các segment trên bộ nhớtrong đoạn data segment:SI : trỏ đến dữ liệu nguồnDI : trỏ đến dữ liệu đích
  2. 2. BX :chỉ số nềnDX : chỉ đến dữ liệu được hiển thịDS : trỏ đến vị trí bắt đầu data segmenttrong đoạn code segment :IP : trỏ đến lệnh kế tiếp được thực hiệnCS : trỏ đến đầu code segmenttrong đoạn Stack Segment :SP : trỏ đến đỉnh stackBP : độ dời so với đỉnhSS : trỏ đến đáy stack segment----Các thanh ghi 32 bitCó thêm các thanh ghi mở rộng tên gọi mở rộng từ nhựng tên cũgồm các thanh ghi EAX EBX ECX EDX ESI EDI ESP EBP ...
  3. 3. Thanh ghi EAX EBX ECX EDX :Các thanh ghi này cũng có chức năng tương tự các thanh ghi AX BX CX DXTuy nhiên trong vì đây là các thanh ghi 32bit nên ta cũng có thể sử dụng cácthanh ghi trong đó như là các thanh ghi8bit 16bit 32bit tùy ý như EAX(32bit) AX(16bit) AH(8bit) AL(8bit)CÔng dụng :EAX : Dùng cho các phép toán,logic,chuyển dữ liệuEBX : Dùng để lưu giữ địa chỉECX : Dùng làm bộ đếm các vòng lặpEDX : Dùng phối hợp EAX trong phép nhân chia ...thanh ghi EIP : thanh ghi con trỏ lệnh.đây là thanh ghi rất quan trọng.nó sẽ trỏđến vị trí của lệnh kế tiếp khi1 lệnh đuơc thực thi.Vì thế nó là 1 thanh ghi đặc biệt mà nó sẽ không tham giavào các lệnh như là 1 toán hạng được
  4. 4. thanh ghi ESI và EDI : các thanh ghi chỉ mục(index).Hay sử dụng trong chuỗihoặc mảngThanh ghi ESP : trỏ đến đầu stack.stack là 1 vùng trong bộ nhớ chứa các biếntạm thời,các dữ liệu và địa chỉ.Stack làm việc theo nguyên tắc LIFO(last in first out).Thanh ghi EBP : là 1 thanh ghi dùng trong việc truy xuất dữ liệu trong stack.Côngdụng EBP còn trong việc lưu trữ vịtrí lệnh tiếp theo khi ứng dụng thực hiện lệnh CALL để gọi hàm(chương trìnhccon).để return lại lệnh kế tiếp.Các thanh ghi cờ :Gồm thanh ghi cờ trạng thái và thanh ghi cờ điều khiển.Các cờ hay dùng trongcác phép tính,điều kiện thực hiện cácphép nhảyCF : ON khi cộng có nhớ,trừ có mượn ở bit caoAF : ON khi có mượn hay có nhớ ở bit3SF : ON khi phép tính có bit cao nhất âmOF : ON khi phép tính có dấu sai.nêu cộng 2 số cùng dấu mà kết quả có dấungượcthì có tràn xảy ra.Khi ta cộng hai sô khác dấu thì không bao giờ có trànPF : ON khi 8bit thấp là số chẵnZF : ON khi phép toán trả về giá trị 0Ví dụ:nhảy JNE nếu ZF = 0 chẵn hạnEAX có giá trị 00000200ECX có giá trị 00000100thì nếu :Code:CMP EAX,ECXJNE SHORT 00000301Sau đây là bảng các lệnh nhảy có điều kiện :x86 memory segmentation :4 thanh ghi segment quen thuộc trong 16bit là CS DS ES và SS được gán giá trị 0và giới hạn của bộ nhớ đến 4Gb.Thanh ghi FSTrong x86 trên windowns các thanh ghi FS dùng để trỏ đến các cấu trúc dự liệunhỏ,các luồng ....Cụ thể hơn :Trên win32 ,khi một ứng dụng được chạy.thì nó sinh ra 1 process,process sẽ doProcess Environment Block(PEB) quản lý.MỘt process có thể có 1 luồng(thread) hoặc nhiều luồng nhưng ít nhất phải có 1luồng.các luồng này doThread Information Block(TIB) quản lý.Ta có thể dùng FS để truy xuất đến vùng này
  5. 5. Ta có bảng địa chỉ sau để truy xuất vào TIBContents of the TIBPosition Length Windows Versions DescriptionFS:[0x00] 4 Win9x and NT Current Structured Exception Handling (SEH) frameFS:[0x04] 4 Win9x and NT Top of stackFS:[0x08] 4 Win9x and NT Current bottom of stackFS:[0x0C] 4 Unknown - TIB Subsystem?FS:[0x10] 4 NT Fiber dataFS:[0x14] 4 Win9x and NT Arbitrary data slotFS:[0x18] 4 Win9x and NT Linear address of TIB---- End of NT subsystem independent part ----FS:[0x1C] 4 NT Environment PointerFS:[0x20] 4 NT Process IDFS:[0x24] 4 NT Current thread IDFS:[0x28] 4 NT Active RPC HandleFS:[0x2C] 4 Win9x and NT Linear address of the thread-local storage arrayFS:[0x30] 4 NT Linear address of Process Environment Block (PEB)FS:[0x34] 4 NT Last error numberFS:[0x38] 4 NT Count of owned critical sectionsFS:[0x3C] 4 NT Address of CSR Client ThreadFS:[0x40] 4 NT Win32 Thread InformationFS:[0x44] 124 NT, Wine Win32 client information (NT), user32 private data(Wine), 0x60 = LastError (Win95), 0x74 = LastError (WinME)FS:[0xC0] 4 NT Reserved for Wow32FS:[0xC4] 4 NT Current LocaleFS:[0xC8] 4 NT FP Software Status RegisterFS:[0xCC] 216 NT, Wine Reserved for OS (NT), kernel32 private data (Wine)FS:[0x124] 4 NT Pointer to KTHREAD (ETHREAD) structureFS:[0x1A4] 4 NT Exception codeFS:[0x1A8] 18 NT Activation context stackFS:[0x1BC] 24 NT, Wine Spare bytes (NT), ntdll private data (Wine)FS:[0x1D4] 40 NT, Wine Reserved for OS (NT), ntdll private data (Wine)FS:[0x1FC] 1248 NT, Wine GDI TEB Batch (OS), vm86 private data (Wine)FS:[0x6DC] 4 NT GDI RegionFS:[0x6E0] 4 NT GDI PenFS:[0x6E4] 4 NT GDI BrushFS:[0x6E8] 4 NT Real Process IDFS:[0x6EC] 4 NT Real Thread IDFS:[0x6F0] 4 NT GDI cached process handleFS:[0x6F4] 4 NT GDI client process ID (PID)FS:[0x6F8] 4 NT GDI client thread ID (TID)FS:[0x6FC] 4 NT GDI thread locale informationFS:[0x700] 20 NT Reserved for user applicationFS:[0x714] 1248 NT Reserved for GLFS:[0xBF4] 4 NT Last Status ValueFS:[0xBF8] 532 NT Static UNICODE_STRING bufferFS:[0xE0C] 4 NT Pointer to deallocation stackFS:[0xE10] 256 NT TLS slots, 4 byte per slotFS:[0xF10] 8 NT TLS links (LIST_ENTRY structure)FS:[0xF18] 4 NT VDMFS:[0xF1C] 4 NT Reserved for RPCFS:[0xF28] 4 NT Thread error mode (RtlSetThreadErrorMode)Nhìn vào bảng trên,ta hoàn toàn có thể truy xuất luôn đến cả PEB tại vị trí FS:[0x30]và FS:[0x18] sẽ là địa chỉ của TIB
  6. 6. Có 1 bài viết về PEB và TIB tại đây,có cả ví dụ rõ ràng,các bạn có thể tham khảothêm:http://rootb1ez.wordpress.com/2009/12/17...structure/Thanh ghi GS : Có cách hoạt động tương tự như với FS,GS cũng tham chiếu đến 1số vùng nhớ đặc trưng khi 1 process chạy.Ở các dòng 64bit FS được thay thếbằng GSNguồn :http://msdn.microsoft.com/en-us/magazine/cc300794.aspxOn x64 versions of Windows, the FS register has been replaced by the GSregister. Otherwise they work pretty much in the same manner.Các thanh ghi khác :Control register :Bao gồm các thanh ghi Cr0 cr1 cr2 cr3Chức năng của chúng chủ yếu để điều khiển quá trình hoạt động của vl,thực hiệnquá trình phân trang(paging),điều khiển ngắt ...Chi tiết :CR0Cr0 dài 32 bit.Chức năng của nó nằm ở các bit quy định trên thanh ghi,cụ thể nhưsau :Nhìn trên ta có thể thấy bit 0 thể hiện chế độ Protected Mode nếu mang giá trị 1và chế độ khác nếuu khác 1Và ở bit thứ 31,nếu mang giá trị 1 thì cr3 được sử dụng để thực hiện cơ chế phântrang.Ở đoạn dưới khi nói về cr3,ta sẽ được cung cấp rõ hơn kiến thức nàycr1 cr2các control register(CR) này đóng 1 số vai trò,nhưng không quan trọng.vì sao nhưthế thì đây đúng là 1 vấn đề phức tạp,nó còn mang cả tính lịch sử.Các bạn google"Why is there no CR1" của tác giả gì đó không nhớ lắmcr3dùng để lưu giá trị trong mỗi lần context switch :Trong Windows, mỗi process có Page Directory và Page Table của chính nó. Vìvậy Windows cấp 4MB của vùng space này cho mỗi process. Khi một processđược cài đặt, mỗi thành phần trong Page Directory chứa addr vật lý (physicaladdress) của Page Table. Các thành phần trong Page Table hoặc là valid (hợp lệ) ,hoặc là invalid (ko hợp lệ).Các thành phần valid chứa physical address của 4KB page cấp cho process. Mộtthành phần invalid (ko hợp lệ) chứa một vài bits đặc biệt đánh dấu nó ko hợp lệ
  7. 7. và các thành phần này được biết như Invalid PTEs.Khi memory được cấp cho process,các thành phần trong Page Table được lắp cácaddr vật lý của các pages đã cấp. Bạn nên nhớ một điều ở đây là một process kobiết bất kỳ gì về addr vật lý và nó chỉ sử dụng logical addr (địa chỉ luân lý).Chitiết về việc logical addr nào tương ứng với physical addr nào được quản lý chuyểnđổi bởi Windows Memory Manager và Processor (bộ vi xử lý).Addr tại Page Directory nào của một process được định vị trong physical memoryđược tham chiếu đến như là Page Directory Base address. Page Directory Baseaddress này được chứa trong một thanh ghi đặc biệt của CPU là CR3 (trên nềnx86). Để chuyển đổi context khác, Windows tải một giá trị mới của CR3 để trỏđến một Page Directory base mới của process. Với cách này mỗi process sẽ lấyđược các phần phân chia cả 4GB physical addr space của chính nó.Tất nhiên tổng memory cấp tại một thời điểm cho tất cả các process trong hệthống là ko thể vượt quá số lượng RAM+ kích thước pagefile nhưng theo lược đồđã thảo luận ở trên thì cho phép Windows cấp cho mỗi process vùng addr logical(hay Virtual: ảo) 4GB .CR4:Thanh ghi debugTrước tiên bạn nên tham chiếu đến link sau để biết về thanh ghi nàyhttp://pdos.csail.mit.edu/6.828/2005/rea...s12_02.htmTổng quan:Ngoài các thanh ghi đã nêu trên,hệ thống của chúng ta còn có các thanh ghidebug.Nó phục vụ cho các quá trình chạp và nạp từng bước(từng ngắt 1) để thựchiện quá trình debug sâu trong vxl.Các thanh ghi debug được sử dụng trong đặc quyền của ring0,ring3 không xàiđược.ring bị giói hạn rất nhiều trong 1 mớ khôn gian ảo của nó.Vì thế nếu có đượcđặc quyền debug thì ta đã nắm được hệ thống trong tay.Các thanh ghi dr0-dr3 : các thanh ghi debug chínhdr6 : thanh ghi trạng thái debug.Nó chứa thông tin trạng thái của 4 thanh ghitrêndr7 : thanh ghi điều khiển debug1 số thông tinCode:For each address in registers DR0-DR3, the corresponding fields R/W0through R/W3 specify the type of action that should cause abreakpoint. The processor interprets these bits as follows:00 -- Break on instruction execution only01 -- Break on data writes only10 -- undefined11 -- Break on data reads or writes but not instruction fetches
  8. 8. Fields LEN0 through LEN3 specify the length of data item to bemonitored. A length of 1, 2, or 4 bytes may be specified. The valuesof the length fields are interpreted as follows:00 -- one-byte length01 -- two-byte length10 -- undefined11 -- four-byte lengthHình ảnh về các thanh ghi debug :Sẵn với vấn đề này,ta đề cập tới việc sử dụng đặc quyền debug từ các thanh ghidebug này.Đó là ngắt debug.Như ta đã biết ngắt 3(INT 3h) hay sử dụng trong các trình debugger như olly đểtạo ra các ngắt mềm,tạo ra điểm bẫy,dừng tạm thời chương trình thực thi đểdebug.Nhưng còn 1 ngắt cứng khá quan trọng.Nó cũng có thể dùng để tạo ra ngắt tạmđể dừng ứng dụng tạm thời.Ta đang nói đến hardware interruptbreak point(HWBP)vậy nó làm cách nào để dừng chương trình khi không dùng ngắt?Như ta đã đề cập,có bốn thanh ghi debug đó là : DR0, DR1, DR2, DR3, bốn thanhghi này sẽ được sử dụng để lưu giữ những địa chỉ mà ta thiết lập HWBP. Điều kiệncủa mỗi break points để cho dừng sự thực thi của chương trình lại được lưu trongmột thanh ghi đặc biệt khác là CPU register, đó là thanh ghi DR7. Khi bất kì mộtđiều kiện nào thỏa mãn (TRUE) thì processor sẽ quăng một exception là INT1
  9. 9. (khà khà vậy là nó dùng INT1 nhé) và quyền điều khiển lúc này sẽ được trả vềcho trình Debug của chúng ta. Có bốn khả năng để dừng sự thực thi của mộtchương trình :Khi một câu lệnh được thực thi.Khi nội dung của memory có thay đổi (modified).Khi một ví trí memory được đọc ra hoặc được cậpnhật(updated).Khi một input-output port được tham chiếu tới.-----------------Phần kiến thức này cũng nhằm tham chiếu đến 1 kiến thức quan trọng của kỹthuật anti debug được giới thiệu trong bài viết sau :http://www.codeproject.com/Articles/3081...uide#INT2DVới mục đích kiểm tra các thanh ghi debug.Ta cũng xác định được process của tacó đang bị debug hay không?Code được đưa ra như sau :PHP Code:// CheckHardwareBreakpoints returns the number of hardware// breakpoints detected and on failure it returns -1.int CheckHardwareBreakpoints(){ unsigned int NumBps = 0; // This structure is key to the function and is the // medium for detection and removal CONTEXT ctx; ZeroMemory(&ctx, sizeof(CONTEXT)); // The CONTEXT structure is an in/out parameter therefore we have // to set the flags so Get/SetThreadContext knows what to set orget. ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS; // Get a handle to our thread HANDLE hThread = GetCurrentThread(); // Get the registers if(GetThreadContext(hThread, &ctx) == 0) return -1; // Now we can check for hardware breakpoints, its not // necessary to check Dr6 and Dr7, however feel free to if(ctx.Dr0 != 0) ++NumBps; if(ctx.Dr1 != 0) ++NumBps; if(ctx.Dr2 != 0) ++NumBps; if(ctx.Dr3 != 0) ++NumBps;
  10. 10. return NumBps;}Các nguồn tham khảo :http://en.wikipedia.org/wiki/X86_memory_segmentationhttp://www.cs.virginia.edu/~evans/cs216/guides/x86.htmlhttp://en.wikipedia.org/wiki/Win32_Threa...tion_Blockhttp://en.wikipedia.org/wiki/X86_archite..._registers

×