′执行Assembly Code部分 RunDll32 = CallWindowProc(GetCodeStart(hProc, Params), 0, 1, 2, 3)
4 w1 H8 [$ S, D1 n FreeLibrary hModule ′释放空间
2 M6 _; _+ @5 G9 v End Function( w0 v6 p7 R* S6 e# U
Private Function GetCodeStart(ByVal lngProc As Long, ByVal arrParams As Variant) As Long3 d4 j6 |3 a% P8 f: V- v
′---以下为Assembly部分--8 Y0 i) @0 L9 L6 T7 v" V8 L+ L
′作用:将函数的参数压入堆栈
. K0 c7 {7 j2 G6 G& M Dim lngIndex As Long, lngCodeStart As Long
# S! C: }1 Y& ~7 L8 c! P: T/ J( f5 Q ′程序起始位址必须是16的倍数- ~1 X# H3 e2 A" |
′VarPtr函数是用来取得变量的地址1 b& H% } [6 ^# }- b
lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 13 ?. R& T' B9 M) ^: j, }% ^
m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) ′程序开始的元素的位置" N2 G) ], v0 L+ [) [
′前面部分以中断点添满
+ i& g; h0 ~$ s+ q: K8 ?+ S6 W# v For lngIndex = 0 To m_opIndex - 1
, m: ^3 H9 }+ B o: h* e9 ^ m_OpCode(lngIndex) = &HCC ′int 35 L3 i1 r9 k+ |& K% v
Next lngIndex7 K* c# P: O' [0 W$ ~" \, R
′--------以下开始放入所需的程序----------/ b3 H0 @/ Z6 T: a) P
′将参数push到堆栈$ r7 [5 ^9 ~. Z' A# S. D
′由于是STDCall CALL 参数由最后一个开始放到堆栈) V$ T) c$ L0 w) ~! V# x
For lngIndex = UBound(arrParams) To 0 Step -1
; e+ m* U8 x$ [0 P AddByteToCode &H68 ′push的机器码为H686 |5 U2 ^) H/ n$ u
AddLongToCode CLng(arrParams(lngIndex)) ′参数地址/ ?# x6 O: M0 y6 `6 T
Next lngIndex" S" o) t' `$ ^7 R% N
′call hProc
. n. I- } x L5 o* x1 H4 G AddByteToCode &HE8 ′call的机器码为HE82 l/ S I) B) H
AddLongToCode lngProc - VarPtr(m_OpCode(m_opIndex)) - 4 ′函数地址 用call的定址3 G i. C( Z* S7 l
′-----------结束所需的程序-------------- |