Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Một kỹ thuật trap code nho nhỏ trên VC++

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Mặc định Một kỹ thuật trap code nho nhỏ trên VC++

    Cái này không rõ có ứng dụng được không nữa.Do thấy nó cũng thú vị nên post lên.Anh zcoder hình như cũng có 1 bài trap code khá hay trên forum mình.Các bạn tìm đọc,\!

    Trước hết ta nói sơ qua nguyên tắc gọi hàm trong C.Khi gọi 1 hàm,thì việc đầu tiên là phải bảo lưu lại thanh ghi con trỏ lệnh(eip).Vì sao?Đơn giản là khi nhảy vào hàm thì lúc return lại nó còn biết sẽ thực thi cái gì tiếp theo

    Chương trình được hệ điều hành cấp cho 1 vùng nhớ để thực thi chương trình.Từ khi xác nhận được breakpoint để vào chương trình thì eip cũng trỏ vào lần lượt các địa chỉ lệnh để thực hiện cho đến gặp 1 ngắt để hết chương trình thì nó dừng.Vì thế ta có thể lạm dụng điều này để print ra lần lượt các địa chỉ lệnh liên tiếp trong bộ nhớ mà hệ điều hành cấp phát giành riêng cho chương trình ta
    C Code:
    1.  
    2. #include "stdio.h"
    3. #include "conio.h"
    4.  
    5. #define temp 200
    6.  
    7. using namespace std;
    8.  
    9. int main(int argc, char* argv[])
    10. {
    11.     unsigned int foo=0;        
    12.     _asm {
    13.         call f              //khi gọi hàm f thì eip sẽ push vào stack
    14.         jmp L1
    15.         f:
    16.         pop eax
    17.         mov foo,eax         //lấy địa chỉ eip ra,gán vào foo
    18.         push eax        // lấy ra thì phải trả lại cho người ta ^^
    19.         ret                
    20.         L1:
    21.     }
    22.  
    23.     unsigned char *bar=(unsigned char*)foo;
    24.  
    25.     for(int i=0; i<temp; i++) {
    26.         printf("%x : %x \n",foo+i,bar[i]);
    27.         // show các địa chỉ và giá trị của eip
    28.     }
    29.    
    30.     getch();
    31.     return 0;
    32. }

    Ta để ý sẽ thấy có 1 số giá trị là cc.Đó chính là các opcode 0xcc,chính là ngắt INT 3 của hệ thống.INT 3 là 1 instruction rất quan trọng trong việc debug.Nó tạo ra 1 breakpoint để bẫy chương trình khi đang chạy.Lưu ý là INT 3 nằm trong bảng vecto ngắt mà chỉ có trên các hệ thống x86 của windows.Và 1 lưu ý là windows tổ chức bộ nhớ theo kiểu little endian nên đọc các giá trị của eip thì cũng đọc cho đúng.
    Đã được chỉnh sửa lần cuối bởi lttq : 21-10-2011 lúc 07:10 PM.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Cái này gọi là callstack, debugger của visual studio có hỗ trợ sẵn mà bạn.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Mảng trên C code thuật toán tìm số nguyên tố trên ma trận
    Gửi bởi nmebe trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 25-04-2012, 11:39 AM
  2. code mô phỏng thuật toán sắp sếp trên C#
    Gửi bởi gacon09cntt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 16-12-2010, 12:59 PM
  3. Code thuật toán quicksort trên C++. Làm sao in số chẵn trước, số lẻ sau?
    Gửi bởi trungthuan trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 8
    Bài viết cuối: 17-08-2010, 11:43 PM
  4. Bài toán tính tiền thuế theo kiểu bậc thang trên C, xem giúp code sai ở đâu???
    Gửi bởi ducvuong6690 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 13-09-2009, 11:14 AM
  5. Tìm kiếm trên file! Tìm kiếm xâu mẫu dùng giải thuật Naive | Giúp mình code sai ở đâu
    Gửi bởi totoise trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 19-04-2009, 08:22 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn