Gnu Prolog 内存大小设置不当 VirtualProtect函数487错误 启动失败修复

版本

Gnu Prolog 1.4.5
(compiled under x86_64 / Windows 7 with MSVC++)

起因

由于Gnu Prolog Setting中默认的最大内存大小才32kb,实在不够看,所以lz在Setting里面将它调大了一些。
重启软件就闪出命令行窗口,不能打开GUI。

分析

PwSh中执行gprolog.exe,看到以下报错:

PS E:\Applications\GNU-Prolog\bin> .\gprologFatal Error: VirtualProtect failed : 487

应该是lz设置内存大小不当,导致内存页保护的函数Error了。
试着重装让其恢复默认,但是遗憾的是卸载的并不干净,程序的配置依然没有删除,重新安装后依然默认读取以前的配置,程序还是进不去……
卸载时lz注意到程序目录里面的文件是删除的很干净了,而重装回来的程序依然能读取到配置,故猜想程序的配置是保存在注册表中的。
所以思路就是删掉配置,让gprolog恢复默认,嗯,就酱。

逆向

扔进IDA64,看导入表:
发现确实有注册表读写操作,查看函数的Xref交叉引用,定位到sub_48FDF0。

可以看出是进入HK\Software\GnuProlog中读取键值,但是这个HK具体是啥我不知道(对应图中hKey参数,是一个常量),索性百度一下RegOpenKeyEx。

ok,这回知道常量名字是啥了,拿出masm32的window.inc打开,搜索常量名字。

这回终于知道读取的是哪个主键了,HKCU。

解决

注册表找到HKCU\Software\GnuProlog,发现果然储存着配置,直接整个注册表项干掉。
重新打开gprolog.exe,它终于正!常!启!动!了!泪目!

反思

完成后lz突然想到,这玩意是Gnu的软件啊!也就是说他是开源的,那我逆向岂不是逆了个寂寞……
所以lz试了一下仅凭源代码能不能找到配置在注册表的位置。
翻了一下官网,源代码在SourceForge托管,上去逛了一圈,没找到仓库内搜索。
索性跑去github上建了个空仓库,从SourceForge Import了一份源代码。

ok现在借用一下github的仓库内搜索功能,直接搜Register(翻译过来是注册表项),果然找到了:

看来是绕了个大圈子,有源码我不看,偏偏要逆向,闹笑话了,哈哈。

THE END
喜欢就支持以下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称