妈妈再也不用担心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 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 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分
1