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 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分