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

Đề tài: gọi và sử dụng hàm riêng từ 1 thiết bị khác bằng asm

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

    Mặc định gọi và sử dụng hàm riêng từ 1 thiết bị khác bằng asm

    ; int __cdecl sub_4411F0(char *, char)
    sub_4411F0 proc near

    var_804= byte ptr -804h
    var_404= byte ptr -404h
    var_4= dword ptr -4
    arg_0= dword ptr 4
    arg_4= byte ptr 8

    sub esp, 804h
    mov eax, dword_10E406C
    xor eax, esp
    mov [esp+804h+var_4], eax
    mov ecx, [esp+804h+arg_0]
    lea eax, [esp+804h+arg_4]
    push eax ; va_list
    push ecx ; char *
    lea edx, [esp+80Ch+var_804]
    push edx ; char *
    call _vsprintf
    lea eax, [esp+810h+var_804]
    push eax
    lea ecx, [esp+814h+var_404]
    push offset off_8ABE44 ; LPCSTR
    push ecx ; LPSTR
    call ds:wsprintfA
    lea edx, [esp+81Ch+var_404]
    push edx
    call sub_43FB40
    mov ecx, [esp+820h+var_4]
    add esp, 1Ch
    xor ecx, esp
    call sub_853807
    add esp, 804h
    retn
    sub_4411F0 endp


    trên là đoạn asm copy từ IDA của 1 game ra. Tên hàm mà nó call là sub_4411F0, theo ý tưởng là em lấy pointer offset từ cái hàm này rồi sử dụng asm để send param, nhưng không biết sai chỗ nào mà khi sử dụng lại bị diss, các anh chỉnh dùm em với

    typedef unsigned long (*SUB)(va_list a1,char *var_1, char *var_2);
    static SUB SUB_Game;
    void POINTERASM()
    {
    SUB_Game = (SUB)(0x4411F0);
    }
    int Main()
    {
    char a[] = "abc";
    char b[] = "abcd";
    _asm
    {
    push 100
    push a
    push b
    call SUB_Game
    add esp,8
    }
    }


    cách em lấy pointer hàm như thế đã đúng chưa ạ ? cách send param như vậy sai chỗ nào, stack sai như nào ạ ?

  2. #2
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Thấy cái sub 0x4411F0 có 2 tham số thôi mà bạn lại push 3 tham số lúc gọi hàm. rồi lại chỉ cộng esp lên 8. như vậy thì stack sẽ còn thừa 4 byte lưu số 100.
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

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

    bạn sửa lại hộ mình được không ? mình không hình dung ra được.

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

    Hàm int __cdecl sub_4411F0(char *, char) có 2 param thôi.
    Trong khi con trỏ hàm của bạn lại trỏ đến 1 hàm mà prototype có 3 tham số
    typedef unsigned long (*SUB)(va_list a1,char *var_1, char *var_2); nên không chạy được lúc vào hàm.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

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

  1. Bán nhà riêng ở Tây Sơn Đống Đa 40m*3 tầng giá rẻ 3.5 tỷ
    Gửi bởi liemnv244 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 16-12-2013, 05:28 PM
  2. Mai anh đào, chỉ của riêng Đà Lạt
    Gửi bởi vietnamduhi trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 05-11-2013, 09:23 PM
  3. Thiết kế kiến trúc, thiết kế biệt thự, thiết kế nhà dân, thiết kế nội thất, showroom, triển lãm
    Gửi bởi hoangthanh1981hn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 7
    Bài viết cuối: 16-04-2013, 10:29 AM
  4. Mủ bảo hiểm thiết kế dành riêng cho trẻ
    Gửi bởi Tritin849 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 12-03-2012, 11:36 PM
  5. Bộ Thư Viện C++ của riêng Mình ?
    Gửi bởi pisno trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 25-04-2010, 10:01 AM

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