Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 8 của 8
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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 :

    Mã nguồn PHP:
    void HookAPI(){ DWORD OldProtect, NewProtect = 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 *p = (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[i + 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,

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ai giúp mình với

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Chức năng của hàn VirtualProtect bạn xem trên MSDN sẽ rõ ngay thôi.


    Mã:
    void HookAPI(){    DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;    HMODULE hmod = GetModuleHandle("Advapi32.dll");    long pa = (long)GetProcAddress(hmod,"RegEnumValueW");    long pa2 = (long)RegEnumValue2;    long dAddr = pa2 - pa - 5; // tính toán địa chỉ ref    unsigned char *p = (unsigned char *)pa;    unsigned char *p2 = (unsigned char *)(&dAddr);     VirtualProtect((void *)pa,5,NewProtect,&OldProtect); // Chuyển vùng nhớ từ đọc-thực thi sang đọc-ghi-thực thi     for (int i=0;i<5;i++) // copy 5 byte trong đoạn code cũ của hàm lưu vào Store        Store[i] = p[i];     p[0] = (unsigned char)0xE9; // lệnh nhảy trong hợp ngữ (jmp) có mã máy là 0xe9    for (int i=0;i<4;i++) // copy địa chỉ ref của lệnh nhảy        p[i + 1] = p2[i];     VirtualProtect((void *)pa,5,OldProtect,&NewProtect); // set thuộc tính về đọc-thực thi}

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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[IMG]images/smilies/wink.png[/IMG]

    1 lần nữa thanx bạn nhìu [IMG]images/smilies/biggrin.png[/IMG]

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đâ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.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi meoconlongvang
    Đâ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 tham gia
    Sep 2015
    Bài viết
    0
    Đâ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.

  8. #8
    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 [IMG]images/smilies/biggrin.png[/IMG]) 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 [IMG]images/smilies/smile.png[/IMG]

    Thân

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •