′执行Assembly Code部分 RunDll32 = CallWindowProc(GetCodeStart(hProc, Params), 0, 1, 2, 3)
( U. ]" k# H d0 R+ }9 e FreeLibrary hModule ′释放空间! t& S5 `: P2 k, M# W$ E/ _
End Function* T S/ ^+ C' U
Private Function GetCodeStart(ByVal lngProc As Long, ByVal arrParams As Variant) As Long& [/ d$ D1 q c
′---以下为Assembly部分--
7 S9 d9 T" ^/ E+ T ′作用:将函数的参数压入堆栈4 K/ V( x9 M g$ r: e
Dim lngIndex As Long, lngCodeStart As Long
, j. n/ m& Z" O. ~ ′程序起始位址必须是16的倍数
h3 A9 l( |7 B" l ′VarPtr函数是用来取得变量的地址
' o/ L5 M, r" d) l' ]9 `! o* c lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 11 \& W# V V, r# c
m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) ′程序开始的元素的位置
) G' h, m T* r) L. g4 ? ′前面部分以中断点添满8 N# \2 u9 ?' a- T2 t' K
For lngIndex = 0 To m_opIndex - 1& F0 E A3 W5 x/ `5 x6 |
m_OpCode(lngIndex) = &HCC ′int 3
0 Q* {; _4 G$ i/ N Next lngIndex8 c0 Y8 G8 g9 |1 a
′--------以下开始放入所需的程序----------1 s, o3 T. d8 ]+ q: ~6 d& l6 x% d
′将参数push到堆栈
2 n* G5 d# q) w ′由于是STDCall CALL 参数由最后一个开始放到堆栈
2 K! ?1 C) x- L& c+ `0 c For lngIndex = UBound(arrParams) To 0 Step -1
. q. {% `, V" d9 r4 t ]. ^$ n9 R" C, p3 B
AddByteToCode &H68 ′push的机器码为H68 |