国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2019-10-29 21:40:39
字體:
來源:轉載
供稿:網友

此篇文章通過C#語言解決嵌入x86匯編,主要通過INline-asm方法來實現,下面我通過圖片和代碼的形式給大家分享下,需要的朋友可以參考下

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

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

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

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

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

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

我們知道軟件運行時所有代碼會放在虛擬內存中 而可執行的代碼在內存中

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

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

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

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

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

 

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

由于是在VC下內聯的匯編 最后移植到C# 一般在VC下函數的調用方式是cdcel

何況下面的是按照cdcel導出函數格式進行的 所以不可以使用__stdcall的方式

 

 
  1. [STAThread]  
  2. static void Main(string[] args)  
  3. {  
  4. byte[] buf_asm = {  
  5. // push ebp  
  6. // mov ebp,esp  
  7. // sub esp,0C0h  
  8. // push ebx  
  9. // push esi  
  10. // push edi  
  11. // lea edi,[ebp-0C0h]  
  12. // mov ecx,30h  
  13. // mov eax,0CCCCCCCCh  
  14. // rep stos dword ptr es:[edi]  
  15. 85, 139, 236, 129, 236, 192, 0, 0, 0, 83, 86, 87, 141, 189, 64,  
  16. 255, 255, 255, 185, 48, 0, 0, 0, 184, 204, 204, 204, 204, 243, 171,  
  17. // call dword ptr[ebp+8]  
  18. 255, 85, 8,  
  19. // pop edi  
  20. // pop esi  
  21. // pop ebx  
  22. // mov esp,ebp  
  23. // pop ebp  
  24. // ret  
  25. 95, 94, 91, 139, 229, 93, 195  
  26. };  
  27. IntPtr ptr_asm = SetHandleCount(buf_asm);  
  28. VirtualProtect(ptr_asm, buf_asm.Length);  
  29. CallMethod call_method = Marshal.GetDelegateForFunctionPointer(ptr_asm, typeof(CallMethod)) as CallMethod;  
  30. call_method(Marshal.GetFunctionPointerForDelegate(new Action(Hello_x86)));  
  31. }  

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

SetHandleCount函數是用于取地址指針的

 

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

上面的函數用于修改內存保護 不過是為了讓委托可以進行交互 包括匯編代碼可以被互調用

 

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

上面的函數是一個測試函數 這個函數沒有太大意義 只是表現利用了匯編調用

本函數 然后本函數輸出一個回應的信息 用于提示該函數被寫入內存匯編調用

依賴的外部函數

 

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

依賴的命名空間

 

  
  1. using System;  
  2. using System.Runtime.InteropServices;  
  3. using System.Diagnostics; 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云龙县| 巫溪县| 临澧县| 东阿县| 汉寿县| 沂水县| 泰和县| 青阳县| 曲沃县| 射阳县| 礼泉县| 乌拉特后旗| 林芝县| 灵石县| 孝感市| 通城县| 青浦区| 乐平市| 泰来县| 凌源市| 伊宁市| 北流市| 肥东县| 陇南市| 会理县| 兰溪市| 犍为县| 和龙市| 赤城县| 泸水县| 盘锦市| 介休市| 奉贤区| 乡宁县| 柯坪县| 青海省| 张掖市| 龙江县| 舞阳县| 江华| 厦门市|