| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 905 人关注过本帖
标题:手里拿着锤子,眼里都是钉子!——VFP 原生支持“伪回调函数”的惊人真相!
只看楼主 加入收藏
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
 问题点数:0 回复次数:10 
手里拿着锤子,眼里都是钉子!——VFP 原生支持“伪回调函数”的惊人真相!
上次看到吹版提供的 VFP callback “内嵌汇编”代码,挺有意思;
恰好最近在跟AI聊逆向,聊汇编,于是琢磨着,就拿它练练手,改造先前揪出的另一个废弃函数 OemToAnsi,将 callback 功能集成到 VFP9.exe 当中。
整个改造过程,头 99% 都很顺利,然而卡在最后一步“调用流程”,绕了不少弯路。
好在运气并不坏,貌似解决了!
讲真,纯贪玩而已——我自己也不清楚有无 Bug,至少,Demo 是成功跑起来了!


搜索更多相关主题的帖子: VFP 流程 调用 汇编 函数 
2026-08-27 22:59
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
得分:0 
附件是Demo代码和改造好的EXE:

callback_demo.rar (1.33 KB)

vfp9.rar (2.64 MB)




[此贴子已经被作者于2026-9-7 17:12编辑过]

2026-08-27 23:01
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
得分:0 
大致原理是,用户申请 1KB 全局参数缓冲区,用于在调用 Windows API 时,与 API 之间传递一切参数与返回值;
然后,改造一个VFP废弃函数 OemToAnsi,用于注册回调;
至于说它是“伪回调函数”,我们知道,VFP 并无“函数指针”概念,我们注册的“回调函数”,严格说来,其实只是“回调函数分发器”。

说到这个“分发器”,一开始确实绕了不少弯路!
最初的想法,是手搓一条 P-Code 代码,然后 call P-Code 的执行主入口,瞒天过海地直接执行用户注册的 VFP 函数。
试了很多次,皆失败。
这才反应过来:
VFP 的整个 P-Code 体系,错综复杂,涉及到的结构体、上下文,外人不可能搞得清楚明白;
若阿猫阿狗都能轻易执行一条 P-Code 代码,那么,他便有能力随随便便执行任意数目的 P-Code 了!
这相当于掌握了VFP字节码的全部核心机密!——这可能么?!显然这绝不可能的!
于是,只好灰溜溜地放弃了这个企图。
退而求其次,利用 COM 接口,相对而言,就比较简单了。

汇编代码,令人联想到三十多年前的面条代码,东转西跳的,完全没有“面向对象”的优雅别致;
而且,每一行代码都精打细算,一般50字节左右,就能写出一个完整函数,100字节,基本上就能完成一项工作啦!
这对于写一句“Hello world!”,编译出来动辄就几十、上百KB的现代编程语言而言,简直恍若隔世!

2026-08-28 09:40
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
得分:0 
汇编的话题,说到底,也只能跟AI聊。
若在论坛上聊吧,似乎没啥好聊,也没啥可聊的。
主要现代人一般不会去看古早的汇编代码。


[此贴子已经被作者于2026-8-29 11:35编辑过]

2026-08-28 15:20
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
得分:0 
采用“参数大礼包”来注册回调,及
采用“参数大礼包”来接收API参数,
有个好处(或者说“副作用”):
回调函数可以支持任意数量、任意类型的参数!
当然,初衷纯粹是为了偷懒——懒得写太复杂的参数解析代码;
还有就是为了尽一切可能地节省汇编代码,毕竟 Code Cave 空间有限。

“参数大礼包”的概念,基于如下断言:

我们假定,API的调用者,完全清楚自己在干什么!完全清楚自己调用的API的参数结构与数量!完全清楚返回值应是什么!
——若仍不清楚,赶紧自己去查参考手册!

“伪回调函数”只负责与API交互,不负责《API调用从入门到精通》!


2026-08-28 22:38
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2747
专家分:4967
注 册:2012-2-29
收藏
得分:0 
2026-08-29 06:36
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
得分:0 
修改了一下回调函数返回值的处理,直接让VFP回调函数 return 1/0 ,这样更符合习惯。
见2#附件。

2026-08-29 10:28
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1246
专家分:1687
注 册:2021-10-13
收藏
得分:0 
不是我的研究方向,不是很理解,但感觉很厉害
2026-08-30 08:56
roadcom
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2026-7-9
收藏
得分:0 
其实,主要目的不完全是为了实现 callback。
这逆向的过程,似乎无意中捅到了马蜂窝!
直接将 _VFP 的 COM 接口给一把端了。
幕布开启,缓缓地,缓缓地,打开了一个新世界……

2026-08-31 00:16
trial03
Rank: 1
等 级:新手上路
帖 子:44
专家分:3
注 册:2025-1-20
收藏
得分:0 
虽然看不懂, 但感觉很厉害!!
2026-08-31 10:21
快速回复:手里拿着锤子,眼里都是钉子!——VFP 原生支持“伪回调函数”的惊人真 ...
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020430 second(s), 10 queries.
Copyright©2004-2026, BCCN.NET, All Rights Reserved