精易论坛

标题: 对任意类型参数函数取指针 [打印本页]

作者: 神女软件定制    时间: 2024-8-11 01:22
标题: 对任意类型参数函数取指针
曲线解决:错误(10063): 被取地址的子程序“子程序1”的参数 1 必须是基本数据类型,且不能为字节集。

在帖子:https://125.confly.eu.org/forum.php?mod ... 14829320&extra= 中看到一个对非基本数据类型参数的函数取指针的思路


只能针对特定的参数数量,优化了一下,自适应任意非0个参数数量,原理就是通过返回地区,去扒原生函数的代码,它返回多少,就跟着返回多少
只根据第一个参数是否为空,来决定是否返回函数指针
  
子程序名返回值类型公开备 注
___辅助取子程序指针___ 根据第一个参数是否为空来判定是否返回指针
置入代码 ({ 139, 69, 0, 131, 120, 12, 0, 116, 2, 201, 195, 139, 64, 4, 3, 64, 252, 139, 93, 4, 235, 1, 67, 129, 59, 139, 229, 93, 194, 117, 247, 49, 201, 102, 139, 75, 4, 201, 201, 90, 1, 204, 255, 226 })


汇编代码:
[JavaScript] 纯文本查看 复制代码
mov eax, dword [ebp+0x00]
cmp dword [eax+0x0C], 0x00000000
je label1
leave
ret
label1:
mov eax, dword [eax+0x04]
add eax, dword [eax-0x04]
mov ebx, dword [ebp+0x04]
jmp label3
label2:
inc ebx
label3:
cmp dword [ebx], 0xC25DE58B
jne label2
xor ecx, ecx
mov cx, word [ebx+0x04]
leave
leave
pop edx
add esp, ecx
jmp edx


一般获取函数指针,会用“调用子程序”来调用,这个方式有个bug,不能获取到正确的返回值,于是修复弄了另外一种方式,需要在目标函数开头调用一次,返回前调用一次,(相对麻烦一点了,但是没办法)
  
子程序名返回值类型公开备 注
__begin辅助取子程序指针  
置入代码 ({ 139, 69, 0, 131, 120, 12, 0, 116, 8, 201, 137, 157, 0, 4, 0, 0, 195, 139, 64, 4, 3, 64, 252, 139, 93, 4, 235, 1, 67, 129, 59, 139, 229, 93, 194, 117, 247, 49, 201, 102, 139, 75, 4, 201, 201, 90, 1, 204, 255, 226 })
子程序名返回值类型公开备 注
_end辅助取子程序指针  
置入代码 ({ 201, 139, 157, 0, 4, 0, 0, 195 })


[hide=d9999] dididid.e (4.51 KB, 下载次数: 18) [/hide]


作者: momoko001    时间: 2024-8-11 03:29
共同努力,共同进步
作者: renhe2018    时间: 2024-8-11 05:50
大清早上来支持
作者: 笨来无一悟    时间: 2024-8-11 05:58
目前有五种方法 每一种都不完美第一种 安装汇编插件 缺点是写的源码发给没有安装插件的人就跑不起来 第二种 运行的时候 判断某个值 取上层函数的地址 不负责弹出多少 缺点是必须写一个如果真 还有和第三种一样的问题 必须运行之后才能获取 第四中 返回(取下一行函数地址()) 某某子程序() 不用运行也能取 缺点 取的过程比较麻烦 需要新建子程序 还要注意自定义数据类型不能引用非局部变量否则产生多余的CALL 就误判了 第五种 解决了第四种引用不方便的问题 可是缺点依旧存在 比第四种方便的代价是没有第四种稳定 好在测试多次 能过的时候稳定过 不能过的时候稳定崩 调试的时候过了 一般就过了 具体啥原因导致的还没摸清 单独写在非启动窗口创建完毕之外的子程序开头测试多次都是正常的 希望第六种方法是易语言官方解除这个限制
作者: 笨来无一悟    时间: 2024-8-11 06:08
笨来无一悟 发表于 2024-8-11 05:58
目前有五种方法 每一种都不完美第一种 安装汇编插件 缺点是写的源码发给没有安装插件的人就跑不起 ...

【蠢新学汇编】通过 特征码 取子程序指针 BUG版
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14830510
(出处: 精易论坛)
这个写法 是为了解决第二种第三种第四种办法 调用不方便的问题 结果方便是方便了 不稳定  第二种 第三种还有一个缺点 返回值不是整数型的不能获取能用就好 就没有那么多问题 要完美 头很大 特别是我学汇编才一年零10天
作者: cqcc    时间: 2024-8-11 06:47
必须支持一下!
作者: year1970    时间: 2024-8-11 08:10
感谢分享
作者: A举个栗子    时间: 2024-8-11 08:37
感谢分享   
作者: 墨尘新月    时间: 2024-8-11 08:55
感谢分享
作者: 7ian    时间: 2024-8-11 09:11
笨来无一悟 发表于 2024-8-11 05:58
目前有五种方法 每一种都不完美第一种 安装汇编插件 缺点是写的源码发给没有安装插件的人就跑不起 ...

我就用第4种改良,只需要判断下一行函数的第一个参数就行,数值或者引用目前都没问题,因为需要对比5个以上字节,哪怕有自定义数据类型多余的call,也基本不会冲突 还是能找到真正的call地址

想要补调用一次子程序获取地址,这种基本很难,我觉得只要官方开放 &xxx就行,不用提示,像死循环一样给个开关,这样更自由
作者: 一指温柔    时间: 2024-8-11 09:26
感谢分享
作者: shuya1    时间: 2024-8-11 09:58
感谢发布原创作品,精易因你更精彩!
作者: Fate    时间: 2024-8-11 11:00
感谢分享
作者: 华庭大哥    时间: 2024-8-11 12:50
下载看看
作者: baitso    时间: 2024-8-11 14:41
支持开源~!感谢分享
作者: 网络注册网员    时间: 2024-8-11 17:28
支持楼主
作者: 陆小白    时间: 2024-8-11 18:47
感谢分享,必须支持~
作者: jtucar    时间: 2024-8-11 19:23
支持开源~!感谢分享
作者: hjinpwhe1    时间: 2024-8-11 20:34
学习 学习
作者: ttggnn    时间: 2024-8-11 21:20
感谢分享
作者: 艾玛克138    时间: 2024-8-11 21:41
宝贵经验啊,很值得学习
作者: year1970    时间: 2024-8-12 07:57
感谢分享
作者: mytiger    时间: 2024-8-12 08:43
感谢分享~!
作者: kyo9766    时间: 2024-8-12 09:02
看一下怎么曲线救国,感谢分享
作者: 胖子葛格    时间: 2024-8-12 09:52
感谢大神分享~!
作者: please    时间: 2024-8-13 09:38
感谢分享,支持开源!!!
作者: 光影魔术    时间: 2024-8-13 11:40
感谢分享
作者: 笨来无一悟    时间: 2024-8-13 19:40
调用子程序()的时候 被调用的子程序里面这样写 似乎也可以正确返回易语言的包装函数 保护了 ESI EDI EBX
  
置入代码 ({ 86, 87, 83 })  ' 包装函数_开始
' 用户代码
置入代码 ({ 91, 95, 94 })  ' 包装函数_结束



作者: 神女软件定制    时间: 2024-8-13 20:27
笨来无一悟 发表于 2024-8-13 19:40
调用子程序()的时候 被调用的子程序里面这样写 似乎也可以正确返回易语言的包装函数 保护了 ESI E ...

嗯我也看到了,不知道为什么要这样包装
作者: 神女软件定制    时间: 2024-8-13 21:59
神女软件定制 发表于 2024-8-13 20:27
嗯我也看到了,不知道为什么要这样包装

这个是能的,要么自己弄个call,不用调用子程序,是可以避免那个返回值问题的
要么自己再弄个包装,把子程序指针包进去,还是自己弄个call,相当于把包装的这个,拿去给“调用子程序”用
作者: 网络注册会员    时间: 2024-8-14 08:35
学习一下
作者: ctry78985    时间: 2024-8-14 10:10
感谢分享
作者: leiwawa001    时间: 2024-8-14 10:15
谢谢分享。
作者: 胖子葛格    时间: 2024-8-21 15:55
感谢大神分享~!
作者: 283688410    时间: 2024-8-29 21:09
谢谢分享
作者: 熊不熊    时间: 2024-12-4 19:46
感谢分享,很给力!~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4