level 13
现在支持的指令还不太全,Xor And Or ROR ROL之类的暂时是不支持的。但基本的Add Inc Dec Lea Call ret push pop等还是支持的。
2014年05月29日 15点05分
3
level 13
使用范例:
给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
已知机器码:
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
ls+=1,新建线程执行机器码也AccessViolation,CallWndproc也完全不行
2014年06月26日 05点06分
8
level 13
解决方法是关dep。
在windows8关dep不是很容易,而且关掉会有更多的系统漏洞
2014年06月26日 05点06分
10
level 13
更新!支持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 2
感谢大牛分享,有个问题想请教一下
您这个的原理是什么呢?因为之前一直在找,发现有个CallWindowProc api是可以在将汇编转为byte组的情况下执行汇编的,请问这个的原理和您的这个原理是否相同呢?
还请赐教,谢谢
2014年09月01日 01点09分
14
委托实际上是包装过的函数指针,用反射把委托内部的函数指针改成Byte()的地址就能执行Byte()里的机器码。
2014年09月01日 02点09分
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分