欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 通過 inline-asm 解決嵌入x86匯編

 更新時間:2015年07月20日 11:55:43   作者:GC2013  
此篇文章通過C#語言解決嵌入x86匯編,主要通過INline-asm方法來實現(xiàn),下面我通過圖片和代碼的形式給大家分享下,需要的朋友可以參考下

"嵌入"是指什么?資源?注入進程?如果是嵌入資源,那跟嵌入任何其他內(nèi)容是一樣的,vs中只要拖拽就能完成嵌入資源。如果是注入進程,則必須得先將匯編碼轉(zhuǎn)為機器碼。雖然托管的C#也是能辦到,但這似乎是所有人都不推薦的方式。

C#可不可以嵌入?yún)R編 可以 在我眼中C#作為一個介于中上層語言是不可能不可以置入?yún)R編代碼的 為什么會被我認為中上層語言呢 從C#保留指針就可以看出 我知道有很多人一定不會相信C#可以使用匯編代碼

不過C#會比較麻煩C#不可以直接內(nèi)聯(lián)匯編(inline-asm)準確的說C#只可以使用(auto-asm)動態(tài)匯編 這種技術(shù)不是

C#獨有的 易語言、VB、C++ 三種語言都可以 不過動態(tài)匯編我見過最多的是被應(yīng)用在外掛方面 及遠程匯編注入 實際上是屬于動態(tài)匯編技術(shù)的一種擴展 不過很難說JIT在編譯代碼后是通過在遠程把匯編代碼寫入托管進程執(zhí)行的 又或者說是一種寄生在外殼程序中運行的技術(shù)及“內(nèi)存運行” 懶得討論這些一想到就頭大。

從上圖中你可以看見一份簡單的x86 / call匯編在C#中內(nèi)嵌并被調(diào)用執(zhí)行一看你會發(fā)現(xiàn)并不是太難 我的一篇博文 寫了一大堆廢話就是說這個東西不過是易語言的

我們知道軟件運行時所有代碼會放在虛擬內(nèi)存中 而可執(zhí)行的代碼在內(nèi)存中

內(nèi)存保護一般是PAGE_EXECUTE_READ及32不過經(jīng)過我研究.NET上的可執(zhí)行代碼應(yīng)該是PAGE_EXECUTE_READWIRTE及64 如果是P/invoke上執(zhí)行DLL中的保護是32 就可以我們在內(nèi)嵌匯編時不可以使用只讀保護

如果我們需要使用由.NET去委托去Call那么必須是可讀可寫 如果通過Win32API去Call那么使用32就可以 有些區(qū)別 、我曾研究過易語言上字節(jié)集在內(nèi)存中的內(nèi)存保護到底是多少結(jié)果與C#是一致 4 / PAGE_READWRITE 不過為什么易語言可以CALL而C#不可以CALL一直是讓我感到較為迷惑的事情 可能是托管堆與非托管堆之間不同造成的 不過我更希望有大神出來幫忙指點一下下。

由于是X86匯編 首先需要把目標平臺切換為x86 這樣才不會造成C#調(diào)用匯編代碼時出錯 一定不要省略這個步驟

首先你需要定義一個有參數(shù)的委托 重點在于在匯編中有這樣一句話

call    dword ptr[ebp+8] // call 參數(shù)一
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
public delegate IntPtr CallMethod(IntPtr ptr); 

由于是在VC下內(nèi)聯(lián)的匯編 最后移植到C# 一般在VC下函數(shù)的調(diào)用方式是cdcel
何況下面的是按照cdcel導(dǎo)出函數(shù)格式進行的 所以不可以使用__stdcall的方式

[STAThread] 
static void Main(string[] args) 
{ 
  byte[] buf_asm = { 
    // push    ebp 
    // mov     ebp,esp 
    // sub     esp,0C0h 
    // push    ebx 
    // push    esi 
    // push    edi 
    // lea     edi,[ebp-0C0h] 
    // mov     ecx,30h 
    // mov     eax,0CCCCCCCCh 
    // rep stos  dword ptr es:[edi] 
    85, 139, 236, 129, 236, 192, 0, 0, 0, 83, 86, 87, 141, 189, 64, 
    255, 255, 255, 185, 48, 0, 0, 0, 184, 204, 204, 204, 204, 243, 171, 
    // call    dword ptr[ebp+8] 
    255, 85, 8, 
    // pop     edi 
    // pop     esi 
    // pop     ebx 
    // mov     esp,ebp 
    // pop     ebp 
    // ret 
    95, 94, 91, 139, 229, 93, 195 
  }; 
  IntPtr ptr_asm = SetHandleCount(buf_asm); 
  VirtualProtect(ptr_asm, buf_asm.Length); 
  CallMethod call_method = Marshal.GetDelegateForFunctionPointer(ptr_asm, typeof(CallMethod)) as CallMethod; 
  call_method(Marshal.GetFunctionPointerForDelegate(new Action(Hello_x86))); 
} 

首先把你需要嵌入的匯編以字節(jié)數(shù)組的格式寫出來 然后通過

SetHandleCount函數(shù)是用于取地址指針的

 

static void VirtualProtect(IntPtr ptr, int size) 
{ 
  int outMemProtect; 
  if (!VirtualProtect(ptr, size, 64, out outMemProtect)) 
    throw new Exception("Unable to modify memory protection."); 
} 

上面的函數(shù)用于修改內(nèi)存保護 不過是為了讓委托可以進行交互 包括匯編代碼可以被互調(diào)用

static void Hello_x86() 
{ 
  Console.Title = ((new StackFrame()).GetMethod()).Name; 
  Console.WriteLine("I was x86 assembly call a test function."); 
  Console.ReadKey(false); 
} 

上面的函數(shù)是一個測試函數(shù) 這個函數(shù)沒有太大意義 只是表現(xiàn)利用了匯編調(diào)用

本函數(shù) 然后本函數(shù)輸出一個回應(yīng)的信息 用于提示該函數(shù)被寫入內(nèi)存匯編調(diào)用

依賴的外部函數(shù)

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr SetHandleCount(byte[] value); 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool VirtualProtect(IntPtr lpAddress, int dwSize, int flNewProtect, out int lpflOldProtect); 

依賴的命名空間

using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

通過inline-asm技術(shù)解決C#語言解決嵌入x86匯編,希望大家能夠喜歡。

相關(guān)文章

  • c#異步讀取數(shù)據(jù)庫與異步更新ui的代碼實現(xiàn)

    c#異步讀取數(shù)據(jù)庫與異步更新ui的代碼實現(xiàn)

    這篇文章主要介紹了c#從數(shù)據(jù)庫里取得數(shù)據(jù)并異步更新ui的方法,大家參考使用吧
    2013-12-12
  • 簡單談?wù)凜#中深拷貝、淺拷貝

    簡單談?wù)凜#中深拷貝、淺拷貝

    深拷貝和淺拷貝都是對對象進行的拷貝復(fù)制。而他們的不同就在于:一個對象中可能會有值類型的字段,也可能會有引用類型的字段。淺拷貝直接拷貝值、引用類型的指針。而深拷貝則是重新構(gòu)造字段指針所指向的對象,并沒有拷貝該字段的指針,或是與該字段指針指向同一塊內(nèi)存
    2015-06-06
  • Quartz.Net實現(xiàn)原理及使用方法詳解

    Quartz.Net實現(xiàn)原理及使用方法詳解

    這篇文章主要介紹了Quartz.Net實現(xiàn)原理及使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • C# 多線程更新界面的錯誤的解決方法

    C# 多線程更新界面的錯誤的解決方法

    這篇文章主要介紹了C# 多線程更新界面的錯誤方法,由于一個線程的程序,如果調(diào)用一個功能是阻塞的,那么就會影響到界面的更新,導(dǎo)致使用人員操作不便。所以往往會引入雙線程的工作的方式,主線程負責更新界面和調(diào)度,而次線程負責做一些阻塞的工作,便有了下面春雨里方法
    2021-10-10
  • C#使用semaphore來管理異步下載請求的方法

    C#使用semaphore來管理異步下載請求的方法

    這篇文章主要介紹了C#使用semaphore來管理異步下載請求的方法,涉及C#使用semaphore實現(xiàn)多線程管理的技巧,需要的朋友可以參考下
    2015-06-06
  • C#調(diào)用FFplay實現(xiàn)播放視頻功能

    C#調(diào)用FFplay實現(xiàn)播放視頻功能

    這篇文章主要為大家詳細介紹了C#如何調(diào)用FFplay實現(xiàn)播放視頻功能,文中的示例代碼講解詳細,具有一定的參考價值,有需要的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • Unity實現(xiàn)UI漸變效果

    Unity實現(xiàn)UI漸變效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)UI漸變效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Unity實現(xiàn)人物旋轉(zhuǎn)和移動效果

    Unity實現(xiàn)人物旋轉(zhuǎn)和移動效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)人物旋轉(zhuǎn)和移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 大家應(yīng)該掌握的多線程編程

    大家應(yīng)該掌握的多線程編程

    這篇文章主要介紹了大家應(yīng)該掌握的多線程編程,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • C#獲取web.config配置文件內(nèi)容的方法

    C#獲取web.config配置文件內(nèi)容的方法

    這篇文章主要介紹了C#獲取web.config配置文件內(nèi)容的方法,涉及C#配置文件屬性獲取的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05

最新評論