none
C# 動態使用API RRS feed

  • 問題

  •  假設今天我想要動態使用PostMessage
    並且有個條件,必須先申請一個記憶體空間
    寫入前5個Byte,再jmp PostMessageA+5處
    然後建立委派來執行函數
    請問各位前輩
    為什麼程式都會出現,嘗試讀取或寫入受保護的記憶體的錯誤?

            public delegate void MyPMA(IntPtr hwnd, IntPtr wMsg, IntPtr wParam, IntPtr lParam);

            public void PostMessage(IntPtr hwnd, IntPtr wMsg, IntPtr wParam, IntPtr lParam)
            {
                MyPMA PM = (MyPMA)MyPostMessage(typeof(MyPMA));
                PM(hwnd, wMsg, wParam, lParam);
            }

               

            private Delegate MyPostMessage(Type t)
            {
    int hmodule = 0, hproc = 0;
    hmodule = LoadLibrary("user32.dll");
    hproc = GetProcAddress(hmodule, "PostMessageA");

    //申請記憶體空間
    IntPtr add = Marshal.AllocHGlobal(10);

    //寫入PostMessageA前5個Byte
    //並且寫入jmp PostMessageA+5
    Marshal.WriteByte(....省略)

    return Marshal.GetDelegateForFunctionPointer(add, t);
            }

                

    我是個初學者 希望大家可以互相幫忙

    2014年10月18日 下午 06:16

解答

  • 問題解決了

    原因是沒有使用VirtualProtect這個API

    執行前須把Address的權限設為PAGE_EXCUTE_READWRITE (0X40) 

    再次感謝大家回答


    我是個初學者 希望大家可以互相幫忙

    2014年10月21日 下午 01:04

所有回覆

  • 為什麼不使用 P/Invoke 宣告 PostMessage() API?

    http://www.pinvoke.net/default.aspx/user32.postmessage


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月19日 上午 01:24
    版主
  • 你好,謝謝你的回答

    我的條件就是要不宣告,動態使用,並且自己加入前5個byte再jmp過去

    不知您是否了解我的意思?


    我是個初學者 希望大家可以互相幫忙

    2014年10月19日 上午 01:58
  • 很久以前用過 LoadLibrary ,已經忘了怎樣搞了。

    函數指標是 LoadLibrary 傳回來的位置沒錯,但是引數位置我記得是 +4 不是 +5 ,不知道 +5 從哪來,還是我記錯。

    另外 .Net 的結構封裝有很多問題,參考型別只會送 4 bytes 指標過去,但 .Net 的記憶體模型並沒有公告,所以 .Net 的變數位置能不能給 API 直接用就變成大問題,建議你先測 GetWindow 這類只有 4 bytes 整數的引數。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2014年10月19日 上午 02:59
  • 如果要這樣玩,回去寫 C/C++ 比較實在。

    Managed environment 很多地方都是被管制的,如果不用官方作法,會有很高機率會遇到奇奇怪怪的問題。

    除非你對 .NET 的記憶體管理夠了解,否則這樣玩風險很高。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月19日 上午 03:32
    版主
  • 謝謝你們的回覆

    PostMessage函數的前5個Byte是這樣

    mov  edi, edi

    push ebp

    mov ebp, esp

    我的目的是自己申請一個記憶體空間

    寫入上述代碼,再jmp PostMessageA+5

    也就是說執行完前5個Byte之後才會跳到原始API


    我是個初學者 希望大家可以互相幫忙

    2014年10月19日 上午 05:10
  • http://blogs.msdn.com/b/devinj/archive/2005/07/12/438323.aspx

    PS: 初學者最好不要挑戰這種高難度的問題....


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月19日 上午 09:25
    版主
  • 您可以考慮使用LoadLibrary和GetProcessAddress函式, 請參考:Late binding on native DLLs with C#

    2014年10月19日 上午 09:47
  • mov edi, edi
    把 edi 暫存器的資料搬到 edi 暫存器 ?


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2014年10月20日 上午 01:35
  • 謝謝你們的回覆

    我有使用LoadLibrary以及GetProcAddress兩個API

    目的是要取得PostMessage的位址

    至於mov edi, edi

    由於我沒有研究組合語言

    但網路上有看到類似的說明

    http://blog.csdn.net/jcwKyl/article/details/3598982

    請參閱


    我是個初學者 希望大家可以互相幫忙

    2014年10月20日 上午 10:08
  • 問題解決了

    原因是沒有使用VirtualProtect這個API

    執行前須把Address的權限設為PAGE_EXCUTE_READWRITE (0X40) 

    再次感謝大家回答


    我是個初學者 希望大家可以互相幫忙

    2014年10月21日 下午 01:04