动态置入代码普遍都是call一个函数来实现
易语言的置入代码是在编译的时候直接把参数的字节集编译出去当成机器码执行
假设有这一段代码, 假设信息框编译后的机器码是 10,20,30
信息框(...)
置入/动态置入 代码({1,2,3})
信息框()
那易语言编译后就是 10,20,30,1,2,3,10,20,30
他是直接把置入代码编译进去了
动态置入的话一般就是
10,20,30, 这个是信息框
puch {1,2,3}的地址,
call 动态置入代码,
10,20,30 这个是后面的信息框
动态置入编译后大概就是这样的
这样的话一般会有两种实现方法
1. call一个函数来执行, 这个方式容易实现, 但是call是会改变寄存器的, 所以执行那些需要用ebp,esp等这些寄存器的时候, 这种方法就不好实现了
2. jmp长跳转, 在动态置入代码的时候计算出要返回的地址, 然后把动态执行机器码拼接一下, 先执行动态机器码, 然后跳转回原来的地方, 最后jmp跳转过去就行了
第一种方法是可以直接封装成一个命令来使用, 优点是方便携带, 缺点是会影响寄存器, 实际上也可以在调用函数里处理一下寄存器, 这样也可以实现不影响
第二种方法不能封装成一个命令, 得在调用的地方处理返回地址, 然后用易语言的置入代码jmp跳过去, 好像没啥优点, 缺点是很繁琐, 还不能封装
还是用上面的代码来做实验,
方法1编译后就是上面说的动态置入
方法2编译后大概是这样
10,20,30, 信息框
jmp {1,2,3}
jmp 下一句10,20,30的地方
10,20,30
|