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 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Khi bạn loadlibrary dll lên bộ nhớ thì nó cũng load các hàm trong dll tại các địa chỉ nhất định trong bộ nhớ.Dù dll có sẵn hay bạn tự build ra thì cách gọi hàm cũng thế thôi.Bạn truyền sai đối số,gọi sai tên hàm ... thì nó mới không thực thi theo ý bạn.

    Tham khảo cách sử dụng các hàm trong dll ở đây :
    http://diendan.congdongcviet.com/showthread.php?t=47180
    http://diendan.congdongcviet.com/showthread.php?t=118600

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Làm thế nào để liên kết các hàm đã export trong 1 dll. (proxy function )

    Trong 1 game âm nhạc, fmod.dll làm nhiệm vụ chơi các âm thanh, nhạc .v.v., bản thân fmod.dll này export tổng cộng 230 function để quản lí nhạc, âm thanh này.

    Tớ thay tên fmod.dll thành _fmod.dll rồi sau đó viết code vào source fmod mới, fmod mới này cũng export đầy đủ 230 function ( gọi tắt là fake cái fmod gốc ).

    Nhưng khi build xong, để vào game ( bỏ luôn cái _fmod.dll, vì tớ loadlibrary cái fmod này để GetProcAddress tất cả 230 hàm trong đó ) thì Game không có bất cứ nhạc, âm thanh gì cả.

    Vậy các anh chị em giúp dùm tớ, hiện tại tớ GetProcAddress tất cả 230 hàm rồi còn phải làm gì nữa để có thể fake fmod kia hoàn hảo. Có 1 người gợi ý cho tớ là sử dụng proxy để liên kết hàm đã get ở _fmod.dll. Vậy làm thế nào các anh chị em giúp tớ với.

    Tớ xem 1 cái fmod cũng làm như tớ nhưng đến đoạn này tớ không hiểu nó làm gì, các anh chị giải thích dùm em. ( đây cũng là công việc sẽ làm sau khi GetProc cái hàm, mà vẫn k hiểu nó làm gì )

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Giải thích rõ hơn được không bạn ?
    Mình đọc đi đọc lại mà vẫn chưa hiểu mục đích và cách làm của bạn.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cái tên file dll không ảnh hưởng gì khi bạn load lên bộ nhớ cả.Vấn đề ở đây tôi nghĩ là do namemanling khi biên dịch làm các hàm export ra khác với tên hàm khi code khiến gọi hàm trong chương trình bạn không được.Bạn thử check lại tên các hàm được export trong đó xem.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hoàn toàn đúng, vì tớ đã thử viết sai hàm 1 lần, và game nó báo thiếu hàm đấy, tớ export đúng hoàn toàn không sai gì cả, cũng không thiếu 1 hàm nào, nhưng có 1 người nói " export rồi mà để đó thì chẳng khác nào gọi hàm MessageBox của use32 rồi để đó ", tuy nhiên công việc tiếp theo khi đã export là phải làm thế nào ? để khi game load dll của tớ nó sẽ có đầy đủ nội dung hàm và hoạt động bình thường.

    Porxy function là gì ?

  6. #6
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0
    Trích dẫn Gửi bởi hsagduag
    Hoàn toàn đúng, vì tớ đã thử viết sai hàm 1 lần, và game nó báo thiếu hàm đấy, tớ export đúng hoàn toàn không sai gì cả, cũng không thiếu 1 hàm nào, nhưng có 1 người nói " export rồi mà để đó thì chẳng khác nào gọi hàm MessageBox của use32 rồi để đó ", tuy nhiên công việc tiếp theo khi đã export là phải làm thế nào ? để khi game load dll của tớ nó sẽ có đầy đủ nội dung hàm và hoạt động bình thường.

    Porxy function là gì ?
    Mình thấy ý tưởng của bạn hình như là định fake Dll . Trong dll fake này bạn làm abc ... gì đó với game nầy.
    Proxy funtion trong bài toán của bạn là 1 cái cầu nối từ 1 function trong dll fake này tới 1 function trong dll ( xịn ) ko fake.
    Ví dụ: _fmod.dll( original function ) có function A # fmod.dll có function A
    Bởi vì function A trong _fmod bạn ko thể biết được thân hàm nó làm gì .
    Và cái function A trong fmod bạn mới tạo.

    Khi bạn dùng cách fake dll thì app gọi fmod -> call cái funtion A bạn tạo ra .
    Và nếu bạn muốn có tí thực thi giống ban đầu thì
    Từ cái function A này bạn gọi tiếp function A của _fmod.

    Còn về vấn đề vụ fake dll của bạn .
    - Bạn phải biết chắc là cái app gameamnhac.exe của bạn nó dùng kiểu nạp dll tĩnh hay động
    - Nắm rõ tham số ( input ) truyền vào hàm cũng như return value ( output )
    Nếu nạp dll động thì còn đơn giản .
    Nếu nạp dll tĩnh thì bạn phải sửa lại import address table. Cái này thì bạn cố đọc chút tài liệu để làm nhé [IMG]images/smilies/biggrin.png[/IMG]

 

 

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
  •