妈妈再也不用担心vb.net不能嵌入汇编代码啦!
vb.net吧
全部回复
仅看楼主
level 13
Nukepayload2 楼主
我最近看到两段c#语言的执行机器码的代码,目测较长那段代码效率极低下,于是把它改了改。
效率立刻飙升百倍!
原本生成给1自增1000000次的机器码需要非常长的时间,至少有半分钟了,我等不及,强行中断了
把String+=String形式用StringBuilder改写后
生成机器码耗时1500毫秒左右。
最后我用Byte数组和List改写
生成机器码耗时75毫秒左右
2014年05月29日 15点05分 1
level 13
Nukepayload2 楼主
链接
2014年05月29日 15点05分 2
level 13
Nukepayload2 楼主
现在支持的指令还不太全,Xor And Or ROR ROL之类的暂时是不支持的。但基本的Add Inc Dec Lea Call ret push pop等还是支持的。
2014年05月29日 15点05分 3
level 11
不能直接把机器码传给cpu?
2014年05月29日 19点05分 4
这个是通过委托执行机器码的,应该跟直接传没多大区别。
2014年05月29日 23点05分
如果你知道机器码,你可以直接把它执行。
2014年05月30日 00点05分
level 13
Nukepayload2 楼主
使用范例:
给100自增10次并输出结果
Dim ab as New ASM.Builder
With ab
.mov_eax_edx
For i As Integer = 0 To 9
.Inc_eax
Next
.ret
End With
Dim ar As New ASM.Invoker
msgbox(ar.Invoke(ab,100))
2014年05月29日 23点05分 5
level 13
Nukepayload2 楼主
已知机器码:
public 循环右移一位() As Byte={
&H89,&HD0,
&HD1,&HC8,
&HC3
}
Dim ar As New ASM.Invoker
msgbox("&H"+ar.Invoke(循环右移一位,1).ToString("x"))'我估计结果是&H80000000
2014年05月30日 00点05分 6
噗还以为是解析字符串_(:з」∠)_如果直接解析字符串的话效率会下降很多?
2014年05月31日 08点05分
回复 WindCian :估计降几百倍吧
2014年05月31日 13点05分
level 1
使用Windows8的注意!!!此方法在windows8不可用,会导致AccessViolation
2014年06月26日 05点06分 7
level 13
Nukepayload2 楼主
ls+=1,新建线程执行机器码也AccessViolation,CallWndproc也完全不行
2014年06月26日 05点06分 8
level 13
Nukepayload2 楼主
在win7非常稳定
2014年06月26日 05点06分 9
level 13
Nukepayload2 楼主
解决方法是关dep。
在windows8关dep不是很容易,而且关掉会有更多的系统漏洞
2014年06月26日 05点06分 10
level 13
Nukepayload2 楼主
更新!支持Windows8了!替换掉旧的Invoker类即可
  *** <summary>
  *** 执行机器码,现在此操作支持Windows8
  *** </summary>
  *** <remarks></remarks>
  Public Class Invoker
    Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As IntPtr,
                                dwSize As Int32,
                                flNewProtect As Int32,
                                ByRef lpflOldProtect As Int32) As Integer
    Private Const PAGE_EXECUTE_READWRITE = &H40
    Private Delegate Function Ret1Arg(arg1 As UInteger) As UInteger
    *** <summary>
    *** 执行机器码,能使用一个参数,有一个返回值
    *** </summary>
    *** <param name="asmByteData">机器码数组</param>
    *** <param name="param1">第一个参数</param>
    *** <returns></returns>
    *** <remarks></remarks>
    Function Invoke(asmByteData As Byte(), param1 As UInteger, Optional IsWindows8 As Boolean = True) As UInteger
      Dim startAddress As IntPtr = UnsafeAddrOfPinnedArrayElement(asmByteData, 0)
      If IsWindows8 Then VirtualProtect(startAddress, asmByteData.Length, PAGE_EXECUTE_READWRITE, 0)
      Dim methodPtr As FieldInfo = GetType(Ret1Arg).GetField("_methodPtr", BindingFlags.NonPublic Or BindingFlags.Instance)
      Dim del As New Ret1Arg(Function(arg1 As UInteger)
                    Return 0
                  End Function)
      methodPtr.SetValue(del, startAddress) *偷梁换柱,强行用反射把函数指针的地址改成我们的asm字节码
      Return del(param1)
    End Function
    *** <summary>
    *** 执行机器码,能使用一个参数,有一个返回值
    *** </summary>
    *** <param name="asmByteData">机器码生成器</param>
    *** <param name="param1">第一个参数</param>
    *** <returns></returns>
    *** <remarks></remarks>
    Function Invoke(asmByteData As Builder, param1 As UInteger) As UInteger
      Return Invoke(asmByteData.ToByteArray, param1)
    End Function
  End Class
2014年08月31日 14点08分 12
百度抽风,星号需要自己替换回来
2014年08月31日 14点08分
如果感觉If语句拖后腿了,可以把Win8的和低版本的函数分开写
2014年08月31日 14点08分
level 13
Nukepayload2 楼主
真的能运行,有图有真相
2014年08月31日 14点08分 13
不快啊,1自加1次还46US,不是很给力啊,说明并没有直接汇编给CPU执行
2015年06月23日 15点06分
说错,是46NS,也不是很快,没有把CPU的威力全部发恢出来
2015年06月23日 15点06分
我还以为很快的,还没高速一点的单片机那么快
2015年06月23日 15点06分
20MHZ的单片机自加1的速度就要超过它,说明CPU的能力只发挥了那么一丁点,CPU是3GHZ的,呵呵,继续努力哦[哈哈][吐舌][呵呵]
2015年06月23日 15点06分
level 2
感谢大牛分享,有个问题想请教一下
您这个的原理是什么呢?因为之前一直在找,发现有个CallWindowProc api是可以在将汇编转为byte组的情况下执行汇编的,请问这个的原理和您的这个原理是否相同呢?
还请赐教,谢谢
2014年09月01日 01点09分 14
委托实际上是包装过的函数指针,用反射把委托内部的函数指针改成Byte()的地址就能执行Byte()里的机器码。
2014年09月01日 02点09分
level 7
不明觉厉!!!菜鸟膜拜大神!!!!!!!!
2014年09月06日 00点09分 15
level 8
厉害!
2014年09月07日 18点09分 16
level 7
不错!不错!
2014年09月09日 11点09分 17
level 7
原来阁下用的是反射。
2014年09月18日 06点09分 18
level 7
楼主的反射用得很巧妙,这个的确也很好用。
我现在也把封装在vb类库中的方法反射出来,让它变成新的脚本控制命令,用于修改word的排版制定,这样对于不同的设计款式,就无需再去修改主程序,只要修改txt脚本就行了。
2014年09月18日 11点09分 19
反射最好别连续执行。因为它开销比较大。用作制作脚本引擎会带来性能问题。
2014年09月18日 11点09分
这个,暂时在格式控制上还没发现问题,迟点看坐标绘图的情况如何。
2014年09月18日 12点09分
其实,.net本身也使用了大量的反射。我算了一下,二十页计算书的输出和格式控制,按每页最多几十个指令,整本书下来也最多是千级的指令数量,还没有到达万级,这个问题不会显现。
2014年09月19日 06点09分
而且,我的程序是按页执行一段反射指令,然后进行主程序自行操作计算对该页添加图表,并不涉及大量连续执行反射指令的情况。所以这类脚本控制是没问题的。
2014年09月19日 07点09分
level 7
另外,我想问一下,汇编码的执行量通常都很大,是否存在效率问题?
2014年09月19日 07点09分 20
这两个类本身是影响性能的,但汇编码本身能直接在cpu运行
2014年09月19日 07点09分
反射后去执行类的方法和反射后执行汇编码,其实反射比原来所增加的开稍是一样的。
2014年09月19日 08点09分
回复 SUSAN_ANA :这种办法是用来移植某些程序的,不是用作提高效率的。
2014年09月19日 09点09分
我没想过要提高效率,因为执行速度已经够快了。整个软件的关键效率在于矩阵运算的算法效率,至于那几千条反射调用,肉眼根本无法判别其速度。
2014年09月19日 15点09分
level 3
安卓跑开发环境???
2014年11月04日 03点11分 21
1 2 尾页