C++ 获取Windows还原点列表(2)

来源:互联网 发布:淘宝客服可以用手机吗 编辑:程序博客网 时间:2024/06/05 06:54

上一节是获取了系统磁盘上系统还原点文件,成功解决了WMI和PowerShell无法获得系统还原点的问题,但是还原点多余的情况依然无法解决。这几天看了室友的《加密与解密 第三版》对逆向有了很浓厚的兴趣,练手就准备用这个程序。

系统还原点的程序是C:\Windows\System32\rstrui.exe

使用IDA和OD。

历时一周,终于有了头绪,rstrui.exe里面有一个类的静态函数(CSxFunctionTracer::CSxFunctionTracer()),感觉是用来打印日志的,每个函数里面都会调用该函数,并且写上调用函数的函数名。经过寻找,找到2个关键函数:

GetSystemId_FilterRestorePointsBySystemId

根据函数名看出来是获得系统ID后,根据系统ID进行判断,看样子上一篇文章中获取的文件里应该是有系统ID的,现在只要能获取系统ID就OK了。

看了看GetSystemId的实现,代码量不多,看样子就是一个COM接口:

下图代码是调用COM接口的函数:
IDA

___guard_check_icall_fptr这函数不认识,但是查了下资料,是用来检查函数。

然后看看大概扔了什么参数进去:
OD

从右下角的堆栈区能看出来第二个参数是一个Unicode编码的字符串,内容是C:\Windows\,
根据上面IDA的分析代码,这个函数的三个参数第一个是查询到的接口指针,第二个是路径名,第三个是一个DWORD*类型的变量。看样子第三个 DWORD* 变量就是存放系统ID的地方,监视内存0x034568F4,然后执行该函数,发现数据有改动:
这里写图片描述

有16字节的数据被修改,可见这个就是系统ID,然而并不知道这个字符串代表的含义,自己写代码来试试这个接口能不能用:
这里写图片描述
很神奇,成功获取到了,然后VS居然还给出了函数原型:

CSpp::GetSystemId(unsigned short const *, struct _GUID*)

原来系统ID是GUID,妥妥的,我也来试试:
这里写图片描述
居然提示我找不到指定路径。。。好吧,参数明明扔的一样,居然给我说找不到,行,那我自己来。用OD单步进入。
在一个

call 6935833D

之后,拿到了系统ID,那应该就在这里面,于是继续跟进。
CSpp::_ReadSystemId

原来这个函数叫CSpp::_ReadSystemId,看来离结果不远了。

在不远处发现了CreateFileW和ReadFile,妥妥的,只需要看看CreateFileW第一个参数扔的什么就行了。
文件读取

这个文件里面只有一行:
系统ID

看来系统就是使用这个ID和还原点文件进行比较,

我们打开镜像文件和这个GUID在内存中的样子,进行对比:
这里写图片描述