Đánh giá, nhận xét, review các công ty tuyển dụng
Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Nhờ giải thích giùm mình đoạn code này

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Question Nhờ giải thích giùm mình đoạn code này

    Hi all,

    Do mình là newbie trong VC nên ko hiểu được đoạn code trích từ bài viết được tham khảo ở http://www.opensc.ws/c-c/5944-hide-registry-hook-regenumvalue.html , đây là đoạn dùng để hook hide registry. Nhờ bạn nào có lòng tốt giải thích chi tiết từng dòng dưới đây cho mình với :

    PHP Code:
    void HookAPI()
    {
        
    DWORD OldProtectNewProtect PAGE_EXECUTE_READWRITE;
        
    HMODULE hmod GetModuleHandle("Advapi32.dll");
        
    long pa = (long)GetProcAddress(hmod,"RegEnumValueW");
        
    long pa2 = (long)RegEnumValue2;
        
    long dAddr pa2 pa 5;
        
    unsigned char *= (unsigned char *)pa;
        
    unsigned char *p2 = (unsigned char *)(&dAddr);

        
    VirtualProtect((void *)pa,5,NewProtect,&OldProtect);

        for (
    int i=0;i<5;i++)
            
    Store[i] = p[i];

        
    p[0] = (unsigned char)0xE9;
        for (
    int i=0;i<4;i++)
            
    p[1] = p2[i];

        
    VirtualProtect((void *)pa,5,OldProtect,&NewProtect);



    2 dòng GetModuleHandle & GetModuleHandle thì mình hiểu, đó là để lấy address của function RegEnumValueW nằm trong file DLL Advapi32.dll mà ta đã load lên, còn đoạn sau mình hoàn toàn mù tịt

    Cám ơn rất nhiều
    Thân,
    Đã được chỉnh sửa lần cuối bởi vietwow : 21-07-2009 lúc 06:56 PM.

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Ai giúp mình với

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

    Chức năng của hàn VirtualProtect bạn xem trên MSDN sẽ rõ ngay thôi.

    C++ Code:
    1. void HookAPI()
    2. {
    3.     DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    4.     HMODULE hmod = GetModuleHandle("Advapi32.dll");
    5.     long pa = (long)GetProcAddress(hmod,"RegEnumValueW");
    6.     long pa2 = (long)RegEnumValue2;
    7.     long dAddr = pa2 - pa - 5; // tính toán địa chỉ ref
    8.     unsigned char *p = (unsigned char *)pa;
    9.     unsigned char *p2 = (unsigned char *)(&dAddr);
    10.  
    11.     VirtualProtect((void *)pa,5,NewProtect,&OldProtect); // Chuyển vùng nhớ từ đọc-thực thi sang đọc-ghi-thực thi
    12.  
    13.     for (int i=0;i<5;i++) // copy 5 byte trong đoạn code cũ của hàm lưu vào Store
    14.         Store[i] = p[i];
    15.  
    16.     p[0] = (unsigned char)0xE9; // lệnh nhảy trong hợp ngữ (jmp) có mã máy là 0xe9
    17.     for (int i=0;i<4;i++) // copy địa chỉ ref của lệnh nhảy
    18.         p[i + 1] = p2[i];
    19.  
    20.     VirtualProtect((void *)pa,5,OldProtect,&NewProtect); // set thuộc tính về đọc-thực thi
    21. }
    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.

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Hi meoconlongvang, rất cám ơn bạn đã giúp đỡ, nhưng mình vẫn còn 1 số thắc mắc sau :

    1/ Địa chỉ ref là địa chỉ gì vậy bạn ? Tại sao lại cần nó ?

    2/ Tại sao địa chỉ ref = pa2 - pa - 5 ?

    3/ Tại sao cần phải nhảy tới địa chỉ 0xE9 (trong câu lệnh p[0] = (unsigned char)0xE9

    1 lần nữa thanx bạn nhìu

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

    Đây là những kiến thức cơ bản của hợp ngữ, mình chỉ giải thích sơ sơ thôi, muốn hiểu rõ thì bạn phải học hợp ngữ mới được.

    1,2> Lệnh nhảy (jmp) có cú pháp là "jmp refaddr", có độ dài 5 byte trong cpu 32 bit, dùng để nhảy từ vị trí đang xét đến một vị trí khác. Địa chỉ ref là một con số kiểu long. Nó là hiệu của vị trí cần nhảy đến và vị trí đang xét. Trừ thêm 5 byte độ dài của lệnh nhảy.

    3> Lệnh nhảy đặt ở đầu hàm sẽ chuyển điều khiển tới vị trí khác mà ta mong muốn, hàm gốc sẽ không được chạy.
    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.

  6. #6
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Mặc định Nhờ giải thích giùm mình đoạn code này

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Đây là những kiến thức cơ bản của hợp ngữ, mình chỉ giải thích sơ sơ thôi, muốn hiểu rõ thì bạn phải học hợp ngữ mới được.

    1,2> Lệnh nhảy (jmp) có cú pháp là "jmp refaddr", có độ dài 5 byte trong cpu 32 bit, dùng để nhảy từ vị trí đang xét đến một vị trí khác. Địa chỉ ref là một con số kiểu long. Nó là hiệu của vị trí cần nhảy đến và vị trí đang xét. Trừ thêm 5 byte độ dài của lệnh nhảy.

    3> Lệnh nhảy đặt ở đầu hàm sẽ chuyển điều khiển tới vị trí khác mà ta mong muốn, hàm gốc sẽ không được chạy.
    Bạn có thể cho mình link hoặc từ khóa để search về nó ko ? Vì mình thử google từ "ref address" hay "ASM ref address" nhưng ko thấy thông tin gì nhiều về nó

    Thanx bạn

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

    Đây là kiến thức rất cơ bản của hợp ngữ, bạn học hợp ngữ là sẽ rõ thôi. Bạn không có cơ bản thì biết giải thích thế nào đây. Lệnh nhảy sẽ cộng vị trí đang xét với địa chỉ ref.
    target = base + <5 bytes jump code> + ref
    từ đó suy ra :
    ref = target - base - 5
    Ví dụ bạn đang đứng ở vị trí 1000 mà muốn nhảy tới 3000 thì hiệu quãng đường là 3000 - 1000 = 2000, trừ thêm 5 byte độ dài lệnh nhảy nữa là 1995.
    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.

  8. #8
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Thanx bạn meoconlongvang nhiều, thực ra hùi hãy mình chỉ có ý xin bạn từ khóa để google thui (nếu bạn đọc kỹ bài trước của mình lai sẽ thấy ) chứ ko phải có ý định kêu bạn giải thích cho mình lun. Tuy nhiên bạn cũng đã rất nhiệt tình giải thích, mình rất biết ơn

    Thân
    Đã được chỉnh sửa lần cuối bởi vietwow : 22-07-2009 lúc 12:54 PM.

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

  1. nhờ mọi người ngó qua giải đáp đoạn code giùm em
    Gửi bởi phamtienngoc trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 28-03-2012, 11:06 PM
  2. code hệ điều hành. Giải thích giùm e này với
    Gửi bởi chuyentinh_t2thezoo trong diễn đàn Thắc mắc chung
    Trả lời: 3
    Bài viết cuối: 16-12-2010, 10:35 PM
  3. Code cây nhị phân, hàm insert. Mọi người giải thích giùm?
    Gửi bởi quicksilver89 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 10-04-2009, 05:17 PM
  4. Giải thích giùm mình đoạn code
    Gửi bởi NoName123 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 04-01-2008, 10:04 PM
  5. xin hãy giải thích đoạn code này giùm em
    Gửi bởi tuvonc trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 23-03-2007, 04:36 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