易语言l调用strcpynA获取子程序的真实指针

用到的API

.版本 2
.DLL命令 _RtlMoveMemory_读字节, , "kernel32.dll", "RtlMoveMemory"
    .参数 Destination, 字节型, 传址
    .参数 Source, 整数型
    .参数 Length, 整数型
.DLL命令 _RtlMoveMemory_读整数, , "kernel32.dll", "RtlMoveMemory"
    .参数 Destination, 整数型, 传址
    .参数 Source, 整数型
    .参数 Length, 整数型
.DLL命令 _lstrcpyn_子程序指针, 整数型, "kernel32.dll", "lstrcpynA", , 取内存变量地址
    .参数 lpString1, 子程序指针, 传址, 传址
    .参数 lpString2, 子程序指针, 传址
    .参数 iMaxLength, 整数型

封装取子程序指针

注意:这个子程序的参数类型也是:子程序指针!!

.版本 2
.子程序 取子程序指针, 整数型
.参数 子程序指针, 子程序指针
.局部变量 指针, 整数型
.局部变量 call, 字节型
.局部变量 读取位置, 整数型
.局部变量 实际指针, 整数型
指针 = _lstrcpyn_子程序指针 (子程序指针, 子程序指针, 0)
_RtlMoveMemory_读整数 (指针, 指针, 4)
读取位置 = 3
_RtlMoveMemory_读字节 (call, 指针 + 读取位置, 1)
.如果真 (call ≠ 232)
    读取位置 = 20
.如果真结束
读取位置 = 读取位置 + 1
_RtlMoveMemory_读整数 (实际指针, 指针 + 读取位置, 4)
返回 (指针 + 读取位置 + 4 + 实际指针)

两个要取的子程序

.版本 2
.子程序 子程序1
aa = aa + 1
.子程序 子程序2
.参数 有参数
aa = aa + 1

对两个子程序分别调用

.版本 2
.支持库 spec
.子程序 _按钮1_被单击
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 c
a = 到整数 (&子程序1)
b = 取子程序指针 (&子程序1)
调试输出 (a, b)
aa = 0
c = 取启动时间 ()
.计次循环首 (100000000, )
    置入代码 ({ 255, 85, 252 })
    ' call [ebp-4]
.计次循环尾 ()
c = 取启动时间 () - c
调试输出 (c)
调试输出 (aa)
aa = 0
c = 取启动时间 ()
.计次循环首 (100000000, )
    置入代码 ({ 255, 85, 248 })
    ' call [ebp-8]
.计次循环尾 ()
c = 取启动时间 () - c
调试输出 (c)
调试输出 (aa)
.子程序 _按钮2_被单击
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 c
a = 到整数 (&子程序2)
b = 取子程序指针 (&子程序2)
调试输出 (a, b)
aa = 0
c = 取启动时间 ()
.计次循环首 (100000000, )
    置入代码 ({ 104, 0, 0, 0, 0 })
    ' push 0
    置入代码 ({ 255, 85, 252 })
    ' call [ebp-4]
.计次循环尾 ()
c = 取启动时间 () - c
调试输出 (c)
调试输出 (aa)
aa = 0
c = 取启动时间 ()
.计次循环首 (100000000, )
    置入代码 ({ 104, 0, 0, 0, 0 })
    ' push 0
    置入代码 ({ 255, 85, 248 })
    ' call [ebp-8]
.计次循环尾 ()
c = 取启动时间 () - c
调试输出 (c)
调试输出 (aa)

源码下载:

点击下载


发布日期:

所属分类: 易语言 标签: