C#可不可以嵌入?yún)R編 可以 在我眼中C#作為一個介于中上層語言是不可能不可以
置入?yún)R編代碼的 為什么會被我認(rèn)為中上層語言呢 從C#保留指針就可以看出我知
道有很多人一定不會相信C#可以使用匯編代碼 不過C#會比較麻煩C#不可以直接
內(nèi)聯(lián)匯編(inline-asm)準(zhǔn)確的說C#只可以使用(auto-asm)動態(tài)匯編 這種技術(shù)不是
C#獨(dú)有的 易語言、VB、C++ 三種語言都可以 不過動態(tài)匯編我見過最多的是被應(yīng)
用在外掛方面 及遠(yuǎn)程匯編注入 實(shí)際上是屬于動態(tài)匯編技術(shù)的一種擴(kuò)展不過很難
說JIT在編譯代碼后是通過在遠(yuǎn)程把匯編代碼寫入托管進(jìn)程執(zhí)行的 又或者說是一種
寄生在外殼程序中運(yùn)行的技術(shù)及“內(nèi)存運(yùn)行” 懶得討論這些一想到就頭大。

從上圖中你可以看見一份簡單的x86 / call匯編在C#中內(nèi)嵌并被調(diào)用
執(zhí)行一看你會發(fā)現(xiàn)并不是太難 我的一篇博文 寫了一大堆廢話就是說
這個東西不過是易語言的http://blog.csdn.net/u012395622/article/details/46400569
我們知道軟件運(yùn)行時所有代碼會放在虛擬內(nèi)存中 而可執(zhí)行的代碼在內(nèi)存中
內(nèi)存保護(hù)一般是PAGE_EXECUTE_READ及32不過經(jīng)過我研究.NET上的
可執(zhí)行代碼應(yīng)該是PAGE_EXECUTE_READWIRTE及64 如果是P/invoke
上執(zhí)行DLL中的保護(hù)是32 就可以我們在內(nèi)嵌匯編時不可以使用只讀保護(hù)
如果我們需要使用由.NET去委托去Call那么必須是可讀可寫 如果通過Win32
API去Call那么使用32就可以 有些區(qū)別 、我曾研究過易語言上字節(jié)集在內(nèi)存
中的內(nèi)存保護(hù)到底是多少結(jié)果與C#是一致 4 / PAGE_READWRITE不過為什
么易語言可以CALL而C#不可以CALL一直是讓我感到較為迷惑的事情 可能是
托管堆與非托管堆之間不同造成的 不過我更希望有大神出來幫忙指點(diǎn)一下下。

由于是X86匯編 首先需要把目標(biāo)平臺切換為x86 這樣才不會造成C#調(diào)用匯編
代碼時出錯 一定不要省略這個步驟
首先你需要定義一個有參數(shù)的委托 重點(diǎn)在于在匯編中有這樣一句話
call dWord ptr[ebp+8] // call 參數(shù)一
[csharp]view plaincopy由于是在VC下內(nèi)聯(lián)的匯編 最后移植到C# 一般在VC下函數(shù)的調(diào)用方式是cdcel
何況下面的是按照cdcel導(dǎo)出函數(shù)格式進(jìn)行的 所以不可以使用__stdcall的方式
[csharp]view plaincopy首先把你需要嵌入的匯編以字節(jié)數(shù)組的格式寫出來 然后通過
SetHandleCount函數(shù)是用于取地址指針的
[csharp]view plaincopy上面的函數(shù)用于修改內(nèi)存保護(hù) 不過是為了讓委托可以進(jìn)行交互 包括匯編代碼可以被互調(diào)用
[csharp]view plaincopy上面的函數(shù)是一個測試函數(shù) 這個函數(shù)沒有太大意義 只是表現(xiàn)利用了匯編調(diào)用
本函數(shù) 然后本函數(shù)輸出一個回應(yīng)的信息 用于提示該函數(shù)被寫入內(nèi)存匯編調(diào)用
依賴的外部函數(shù)
[csharp]view plaincopy依賴的命名空間
[csharp]view plaincopy新聞熱點(diǎn)
疑難解答
圖片精選