Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 18 kết quả

Đề tài: thay đổi địa chỉ con trỏ hàm của 1 tiến trình khác thành địa chỉ con trỏ hàm của mình

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    93

    Mặc định thay đổi địa chỉ con trỏ hàm của 1 tiến trình khác thành địa chỉ con trỏ hàm của mình

    Visual C++ Code:
    1. DWORD dwAddressFunction = 0x85696; // địa chỉ của function trong 1 pointer được tìm thấy
    2. int _stdcall function_h ( int x, int y ) // new function
    3. {
    4.  char result[30];
    5.  int z = x + y;
    6.  sprintf ( result, "Ket qua : %d", z);
    7.  MessageBox ( 0, result, 0, 0);
    8.  return z;
    9. }
    10.  
    11. int main ( )
    12. {
    13.  WriteProcessMemory ( GetCurrentProcess(), (LPVOID)(dwAddressFunction), &function_h, 4, 0 ); //Thay địa chỉ của function cũ ( địa chỉ : 85696 ) thành địa chỉ function mới (function_h )
    14. }

    Việc thay không tành công không hiểu tại sao, các anh em giúp dùm.
    Mục đích công việc là thay địa chỉ con trỏ hàm cũ của 1 tiến trình thành địa chỉ con trỏ hàm của mình .
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi hsagduag : 23-11-2012 lúc 10:23 AM.

  2. #2
    Ngày gia nhập
    05 2011
    Bài viết
    20

    Thế thì trong process muốn inject bạn phải tìm địa chỉ của con trỏ hàm để override value cũ = address function của bạn chứ.
    Override xong thì phải tính xem nếu injected proccess gọi cái function pointer này lấy code đâu nó chạy

  3. #3
    Ngày gia nhập
    03 2009
    Bài viết
    93

    hình như bạn hiểu sai vấn đề.

    mình đang nói là địa chỉ con trỏ hàm ^^

  4. #4
    Ngày gia nhập
    05 2011
    Bài viết
    20

    Cho mình hỏi bạn cái này:

    - Theo bạn :
    +Thế nào là con trỏ hàm.
    +Thế nào là địa chỉ con trỏ hàm.
    +Thế nào là địa chỉ hàm.

  5. #5
    Ngày gia nhập
    03 2009
    Bài viết
    93

    mình không học như 1 cậu bé phổ thông ^^. mình hiểu thông qua code như thế này

    Visual C++ Code:
    1. int *AddressSubPatch = 0x676598; // Địa chỉ hàm muốn patch của 1 tiến trình.
    2. int *AddressSub = (int *)( MyFunction ); // Địa chỉ hàm tương đối của mình.
    3. int *Address = (int *)( AddressSub - AddressSubPatch + 0x4 ); // Địa chỉ hàm tuyệt đối của mình khi dll được tim vào tiến trình. Địa chỉ thực bằng địa chỉ tương đối trừ cho địa chỉ tuyệt đối của tiến trình + 4.

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định thay đổi địa chỉ con trỏ hàm của 1 tiến trình khác thành địa chỉ con trỏ hàm của mình

    Trích dẫn Nguyên bản được gửi bởi hsagduag Xem bài viết
    mình không học như 1 cậu bé phổ thông ^^. mình hiểu thông qua code như thế này

    Visual C++ Code:
    1. int *AddressSubPatch = 0x676598; // Địa chỉ hàm muốn patch của 1 tiến trình.
    2. int *AddressSub = (int *)( MyFunction ); // Địa chỉ hàm tương đối của mình.
    3. int *Address = (int *)( AddressSub - AddressSubPatch + 0x4 ); // Địa chỉ hàm tuyệt đối của mình khi dll được tim vào tiến trình. Địa chỉ thực bằng địa chỉ tương đối trừ cho địa chỉ tuyệt đối của tiến trình + 4.
    Đọc kĩ chưa bạn? "// Địa chỉ hàm tuyệt đối của mình khi dll được tim vào tiến trình." Hiểu câu đó nói gì không? DLL - Dynamic Link Library
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  7. #7
    Ngày gia nhập
    03 2009
    Bài viết
    93

    câu đó do mình viết mà sao lại không hiểu ).
    đấy là code trong dll mình. Vấn đề xong rồi nhưng do quên không ghi. Giờ ghi luôn.

    Địa chỉ trong tiến trình exe mà mình muốn patch là địa chỉ tuyệt đối.
    Khi dll mình ịnected thì khoản cách giữa địa chỉ tuyệt đối và địa chỉ tương đối là hiệu của nhau ( + 4 là bắt đầu sau chữ call, nếu là + 5 là thì lấy call, thường thì lấy call là crash )

    Vì khi inject offset dll luôn được đặt cao hơn tiến trình gốc. Vì thế mới phải trừ mới lòi ra địa chỉ thực trên vùng nhớ.

    P/S : Vấn đề đã được giải quyết.

  8. #8
    Ngày gia nhập
    01 2011
    Bài viết
    14

    Mình nghĩ có 2 cách:
    + thủ công : tìm các lệnh Call Địa_chỉ_hàm_cũ và thay hết bằng Call Địa_chỉ_hàm_mới
    +chèn lệnh jump vào bên trong hàm mới để nó nhảy tới hàm của mình,điều chỉnh tham số truyền vào,return và stack cho hợp lý để hàm trả về đúng ko bị crash.
    Con người sinh ra không phải để tan biến đi như một hạt cát vô danh. Họ sinh ra để in dấu lại trên mặt đất, in dấu lại trong trái tim người khác.

  9. #9
    Ngày gia nhập
    10 2010
    Nơi ở
    Unallocated Memory
    Bài viết
    47

    Trích dẫn Nguyên bản được gửi bởi hsagduag Xem bài viết
    câu đó do mình viết mà sao lại không hiểu ).
    đấy là code trong dll mình. Vấn đề xong rồi nhưng do quên không ghi. Giờ ghi luôn.

    Địa chỉ trong tiến trình exe mà mình muốn patch là địa chỉ tuyệt đối.
    Khi dll mình ịnected thì khoản cách giữa địa chỉ tuyệt đối và địa chỉ tương đối là hiệu của nhau ( + 4 là bắt đầu sau chữ call, nếu là + 5 là thì lấy call, thường thì lấy call là crash )

    Vì khi inject offset dll luôn được đặt cao hơn tiến trình gốc. Vì thế mới phải trừ mới lòi ra địa chỉ thực trên vùng nhớ.

    P/S : Vấn đề đã được giải quyết.
    Mình không có ý định phản bác gì ý kiến của bạn, nhưng mình không muốn sau này có ai đó đọc bài viết của bạn sẽ hiểu sai vấn đề nên mình xin phép được viết một vài thông tin mà mình đã tìm hiểu được.
    1. "Địa chỉ trong tiến trình exe mà mình muốn patch là địa chỉ tuyệt đối"
    Bạn hiểu thế nào về chữ tuyệt đối? Nếu bạn đã từng làm việc trên win 16 bit thì có lẽ bạn sẽ rõ địa chỉ tuyệt đối là địa chỉ không bao giờ bị thay đổi (na ná như hằng số). Nhưng thực tế trên win32 bit thì nó không phải là tuyệt đối như bạn nghĩ. Phần lớn thì nó sẽ là không thay đổi, bởi vì các trình biên dịch thường để image base bắt đầu từ 0x400000 và 99,99% thì process sẽ được load ở base này. Tuy nhiên có nhiều process không bắt đầu từ số này, và nó có 1 cơ chế để xác định "lại" địa chỉ thông qua section .reloc. Mỗi lần load process thì window sẽ xác định lại toàn bộ địa chỉ trong file exe dựa trên thông tin trong section .reloc này. Thứ tuyệt đối duy nhất trong file exe là RVA (relative virtual address)



    2. "Khi dll mình ịnected thì khoản cách giữa địa chỉ tuyệt đối và địa chỉ tương đối là hiệu của nhau ( + 4 là bắt đầu sau chữ call, nếu là + 5 là thì lấy call, thường thì lấy call là crash )"

    Có lẽ bạn đã hiểu nhầm 2 vấn đề sau:
    +Địa chỉ hàm: đúng như tên gọi của nó, là địa chỉ xác định hàm ở đâu trong process
    +Lệnh gọi hàm: khi trình biên dịch dịch mã nguồn của bạn ra mã máy, lệnh gọi 1 hàm sẽ có dạng như sau:
    call xxxxxxxx
    trong đó xxxxxxxx là khoảng cách từ địa chỉ lệnh call tới địa chỉ hàm cần gọi. Do lệnh call xxxxxxxx có độ dài 5 byte nên bạn sẽ phải trừ đi 5 byte để ra được giá trị số xxxxxxxx.


    3. "Vì khi inject offset dll luôn được đặt cao hơn tiến trình gốc. Vì thế mới phải trừ mới lòi ra địa chỉ thực trên vùng nhớ."
    Đọc 2 phần trên mình nghĩ bạn đã có câu trả lời cho vấn đề này rồi.
    Attached Thumbnails Attached Thumbnails section.png   calc.png   call.png  
    Nghìn dặm phong ba cách tiếng lòng
    Vạn sầu thương nhớ nỗi hư không
    Nhìn phương xa ấy, mình ta ngóng
    Cố với tay theo một bóng hồng

  10. #10
    Ngày gia nhập
    03 2009
    Bài viết
    93

    ví dụ hàm mình muốn patch :
    tại vị trí gọi

    Visual C++ Code:
    1. Call sub_676597

    Vậy 0x676597 tại đây có 5 BYTE.
    Nếu tính khoảng cách đúng để call hàm của mình thì phải - đi cho 676597 và - thêm cho 5 ? đúng không :-? ?

    hoặc theo 1 cách hiểu khác là mình - giá trị của tiến trình đi 5 và sau đó địa chỉ hàm của mình chỉ trừ đi 676597 ?
    Bởi vì mục đích của mình là thay đổi địa chỉ call đó trỏ sang địa chỉ của mình, nên mình tính lại khoảng cách giữa địa chỉ hàm của mình và cái call đó.

    Chung quy ra, để patch hàm của mình vào lệnh call của tiến trình thì mình phải tính khoảng cách từ lệnh call đến hàm của mình. đúng không ?

    Thắc mắc là vì mình đã thử thay thế địa chỉ của 1 biến như sau : ( mình thử khi tiến trình dùng lệnh push )

    Sử dụng IDA khi xem biến và trỏ sang xem hex của nó mình có như thế này


    Rõ ràng ở đây tớ thấy 58 36 91 00 là địa chỉ của biến aGameFpsFrames, sau đó tớ lấy địa chỉ biến của mình rồi trực tiếp thay vào ngay vị trí chứa địa chỉ ấy là 0x676593 ( tức byte thứ 2 ).
    Rõ ràng là rất ổn và thành công.

    Áp dụng cách này cho Call thì lại không được. Ban đầu tớ tính như sau :

    [ Địa chỉ my function ] - [ địa chỉ mà tiến trình call ] + thêm 4 byte

    Cuối cùng tiến trình bị crash. Vậ rõ tớ sai chỗ nào :-? ?

    Đây là cách tớ làm

    Hàm cần patch :
    Visual C++ Code:
    1. .text:00688F70                 call    sub_676480
    Còn đây là cách tính để lấy pointer từ hàm của mình đến cái mà tiến trình Call :

    Visual C++ Code:
    1. int *pointer = (int *)(myFunction) - 0x676480 - 0x5;
    2. WriteProcessMemory ( Handle, (LPCVOID)(0x688F70), &pointer, sizeof(int), 0);
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi hsagduag : 26-11-2012 lúc 02:00 PM.

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

  1. Thay đổi value khi biết địa chỉ vùng nhớ của 1 tiến trình khác?
    Gửi bởi nguoirung1.6 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: 23-03-2011, 11:08 AM
  2. Thay đổi font của chuơng trình từ tiếng Trung sang tiếng Việt
    Gửi bởi shadyshane trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 12-01-2011, 01:36 PM
  3. Thay đổi màu của cell bị thay đổi trong Data Grid Views
    Gửi bởi tetuonggu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 16-10-2009, 10:33 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