时间:2021-05-20
"嵌入"是指什么?资源?注入进程?如果是嵌入资源,那跟嵌入任何其他内容是一样的,vs中只要拖拽就能完成嵌入资源。如果是注入进程,则必须得先将汇编码转为机器码。虽然托管的C#也是能办到,但这似乎是所有人都不推荐的方式。
C#可不可以嵌入汇编 可以 在我眼中C#作为一个介于中上层语言是不可能不可以置入汇编代码的 为什么会被我认为中上层语言呢 从C#保留指针就可以看出 我知道有很多人一定不会相信C#可以使用汇编代码
不过C#会比较麻烦C#不可以直接内联汇编(inline-asm)准确的说C#只可以使用(auto-asm)动态汇编 这种技术不是
C#独有的 易语言、VB、C++ 三种语言都可以 不过动态汇编我见过最多的是被应用在外挂方面 及远程汇编注入 实际上是属于动态汇编技术的一种扩展 不过很难说JIT在编译代码后是通过在远程把汇编代码写入托管进程执行的 又或者说是一种寄生在外壳程序中运行的技术及“内存运行” 懒得讨论这些一想到就头大。
从上图中你可以看见一份简单的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一直是让我感到较为迷惑的事情 可能是托管堆与非托管堆之间不同造成的 不过我更希望有大神出来帮忙指点一下下。
由于是X86汇编 首先需要把目标平台切换为x86 这样才不会造成C#调用汇编代码时出错 一定不要省略这个步骤
首先你需要定义一个有参数的委托 重点在于在汇编中有这样一句话
call dword ptr[ebp+8] // call 参数一[UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate IntPtr CallMethod(IntPtr ptr);由于是在VC下内联的汇编 最后移植到C# 一般在VC下函数的调用方式是cdcel
何况下面的是按照cdcel导出函数格式进行的 所以不可以使用__stdcall的方式
首先把你需要嵌入的汇编以字节数组的格式写出来 然后通过
SetHandleCount函数是用于取地址指针的
static void VirtualProtect(IntPtr ptr, int size) { int outMemProtect; if (!VirtualProtect(ptr, size, 64, out outMemProtect)) throw new Exception("Unable to modify memory protection."); }上面的函数用于修改内存保护 不过是为了让委托可以进行交互 包括汇编代码可以被互调用
static void Hello_x86() { Console.Title = ((new StackFrame()).GetMethod()).Name; Console.WriteLine("I was x86 assembly call a test function."); Console.ReadKey(false); }上面的函数是一个测试函数 这个函数没有太大意义 只是表现利用了汇编调用
本函数 然后本函数输出一个回应的信息 用于提示该函数被写入内存汇编调用
依赖的外部函数
[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);依赖的命名空间
通过inline-asm技术解决C#语言解决嵌入x86汇编,希望大家能够喜欢。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文中的汇编语言是基于x86芯片,下面给出代码:;TITLEGAME4THPAGE60,132STSEGSEGMENTDB64DUP(0)STSEGENDS;-
因为现在的项目使用的是AnyCpu在x86的设备使用的是x86,在x64使用的是x64,但是对于非托管代码,必须要在x64使用x64的dll,在x86使用x86
vbe6ext.olb不能被加载的解决方法: 1、首先打开“我的电脑”; 2、找到路径:”C:/programfiles(x86)/commonfiles/
x86中的IO端口访问汇编是直接面向硬件的,它可以访问系统的mem空间,也可以直接访问系统的io空间。汇编中使用in/out来访问系统的io空间。IN从端口输入
1、按以下路径打开文件夹,C:\ProgramFiles(x86)\CommonFiles\microsoftshared\OFFICE12\OfficeS