分类: <span>程序</span>

卸载 Dll 过程中隐藏的异常

最近测试时发现代码中一处关于 std::function 函数对象的问题。在卸载某个 Dll(记为 A)的时候会触发该模块中一个单例对象的析构,在它析构内部的 std::function 成员时产生了内存访问异常(0xc0000005)。而触发这个异常的 std::function 其实是复制于另一个 Dll(记为 B),卸载 Dll A 时,Dll B 已经卸载掉了。

此时调用它关联的函数会抛异常容易理解,但这时并没有进行调用操作。原因在于函数对象析构时会调用关联的 _Delete_this 方法释放资源,而这个函数一般定义在 std 的 _Func_impl / _Func_impl_no_alloc 模板类中。所以当实例化 function 时对应删除函数的代码也是属于当前模块里的(也就是 Dll B)。现在 Dll B 已经卸载,那么只要有任何触发相关代码执行的操作都会引发异常。


Appverif 启动后闪退

最近发现 Appverif 打不开了,公司不少同事的电脑上也遇到这个问题。

涉事的 appverif 版本是: 10.0.18362.1
win 10 的版本是 20H2(19042.867)

主要现象就是启动 appverif.exe 时命令行窗口一闪而过,UI 窗口没有创建就退出了。
用 windbg 调了一下,发现 appverif 在初始化 UI 窗口前会去检查并登记注册表 Image File Execution Options 键值下的 exe,而当遍历到其中的 MsSense.exe 时因为没有权限失败了(STATUS_ACCESS_DENIED)

具体堆栈如下:

00 vrfcore!VfCoreOpenImageFileExecutionOptionsKey+0xc4
01 vrfcore!VerifierOpenLayerProperties+0x4b
02 appverifUI!AppVerif::GetVerifiedImages+0xd6
03 appverifUI!StartUI+0x64
04 appverif!wWinMain+0x43e
05 appverif!__wmainCRTStartup+0x153
06 KERNEL32!BaseThreadInitThunk+0x19
07 ntdll!__RtlUserThreadStart+0x2f
08 ntdll!_RtlUserThreadStart+0x1b

VfCoreOpenImageFileExecutionOptionsKey 中会调用 NtOpenKey 打开每个项,而轮到 MsSense.exe 时因为返回 STATUS_ACCESS_DENIED 而导致初始化过程失败,进程退出。
用注册表编辑器打开一看 admin 确实是没有访问权限,那么给它加上就可以了。

可以用 NSudo 启动一个注册表编辑器,给 MsSense.exe 手动加上管理员组的读取权限,这样 Appverif 就恢复正常了。

当然,新的 Appverif 已经修复了这个问题,直接更新到最新版就没问题了。


实现函数监视器

函数监视器可以监视代码中对外部函数的调用情况,通过这些调用信息可以让我们方便理解程序的意图。
类似的实现思路可以用 dll 转发或者微软的 detour 库实现 api hook。
最近我自己写了一个函数监视器,可以监视进程内所有模块导出函数的调用情况,并且可以自行选择需要监视和设置断点的函数。


播放 nas 中的视频

用 sony 电视自带的视频 app 可以直接走 dlna 播放 nas 的视频,非常方便,但是有个严重的问题就是外挂的字幕没法一起挂上。
似乎是 dlna 的限制,不会在乎是否有外挂字幕的存在。试了试可以用 ftp + kodi 代替。


红米 Note 7 Pro 刷 Pixel Experience

先前买了台红米,到手后刷完国际版仍然觉得不尽如人意,后来就找到了 Pixel Experience。嗯 PE 用着感觉就顺手多了。然后比较神经病的是这红米每次刷完机之后就再也进不去 twrp,按住音量上也只是停留在 twrp 的 logo 界面到天荒地老。。。也不知道是不是我操作有误还是机子有问题。这样子我更新系统就比较麻烦了(因为进不去 recovery),所以每次更新这能按下面的步骤重新刷。好在手机上的东西不多,升级系统后最麻烦的还是需要各个 app 登录一遍账号,重新修改一些系统设置,和 app 的通知行为等等。


CrackMe 反汇编练习之 092

作为练手的 160 个 CrackMe 系列整理分析

CrackMe 来源:【反汇编练习】160个CrackME索引目录1~160建议收藏备用

这个 CrackMe 使用的是 Blowfish 对称加密算法,算法本身并不复杂,只要将几个关键函数逆向后将程序的流程搞清即可。有个 upx 壳,很好脱就不说了,放着不管也无所谓。


CrackMe 反汇编练习之 081

作为练手的 160 个 CrackMe 系列整理分析
CrackMe 来源:【反汇编练习】160个CrackME索引目录1~160建议收藏备用

这个 CrackMe 使用了 RSA 算法,因为程序中也给了相应的提示,在逆的过程中就会有意识的去找这方面的特征,当然 RSA 算法还是需要事先了解下。
算法参考可见:RSA加密算法 OR RSA 算法的加密原理是什么


自建 KMS 激活服务

KMS(Key Management Service,密钥管理服务)是一种激活服务,允许组织来统一管理 Windows 系统和 Office 的激活,目的是为了让中大型公司的激活更易于管理和控制。KMS 可以用来激活 VOL 版本的 WIndows 系统和 Office。因此通过自行搭建 KMS 服务便可完成相关激活事项自给自足了。另外网上容易下载到的 KMS 激活工具大多捆绑了不少流氓软件,趁着激活的时候混入系统,还有很多不知道究竟是不是误报的报毒提示,实在心累。


C++ 程序的逆向分析以及 RTTI 信息检索

分析 C++ 程序时,要是能从一个二进制文件中识别出 C++ 程序的结构,并且能标识出一些主要的类和它们的关系是非常有帮助的。而其中为了实现运行时类型识别而生成的运行时类型信息(Runtime type information,RTTI)也能在程序分析上提供方便。

注意,文中讨论的 C++ 可执行文件仅限于使用 MSVC 编译器编译出的 C++ 可执行文件。

●识别类及其构造函数


使用 CMake 编译 vc90 版 libphonenumber

这是一份使用 vs2008 和 CMake 料理 libphonenumber 的食谱。

准备原料