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

本文介绍了一种通过逆向工程C++程序,解析rstrui.exe以获取Windows系统还原点ID的方法。作者详细阐述了利用IDA和OD分析rstrui.exe的关键函数,特别是`CSxFunctionTracer::CSxFunctionTracer()`,并找到了获取系统ID的COM接口。通过监控内存和单步调试,最终成功获取到系统ID,揭示了系统如何使用此ID与还原点文件进行匹配。
摘要由CSDN通过智能技术生成

上一节是获取了系统磁盘上系统还原点文件,成功解决了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_ic

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、专业:国内第一款真正完美支持Win2000、XP、2003、Vista等操作系统进行一键备份、一键还原的专业软件。 2、安全:支持多个操作系统混合、支持多硬盘、支持分区或盘符错乱、支持Linux 混合分区等;没有对硬盘分区表进行修改,安全稳定,保障数据安全。 3、简单:支持文件拖曳,直接把Ghost 镜像文件( *.gho)拖到程序窗口,即可进行辨认并自动写入地址栏;只需要按一个按钮,所有操作全部自动化完成。 4、个性:“备份系统”时提供三种常用压缩比率(可缩短备份时间或减少备份镜像体积);装机用户或技术人员还可以自由定制 Ghost 核心程序(内置为 Ghost11.1最新版)和定制进行一键备份、一键还原之后的所执行的操作,选项有:完成后自动重启并进入系统、完成后自动关机、返回到DOS,可以进行其它的DOS下操作。 5、智能:自动搜索所有硬盘和所有分区;自动获取分区容量、剩余空间、分区格式;自动检测镜像文件的存储驱动器类型(管您是光驱,还是闪存盘,还是移动硬盘,轻轻一按,即可自动复制到磁盘进行恢复);自动检测空文件;自动中文名判断(Ghost 识别中文字符会变成乱码,所以本程序在Windows自动先进行检测并做出提示)。 6、贴心:备份系统前自动清理IE的临时垃圾文件和回收站,减少体积;支持配置文件(WinGho.ini)静默安装方式(即Ghost光盘的自动安装功能),并添加了“备份系统”后在系统启动菜单添加“一键还原系统”功能。 7、人性化:当使用本程序进行备份系统之后,再次启动本程序时则自动弹出提示备份的文件存在路径和自动添加到还原选项的地址栏上,轻轻一按即可立刻进行还原系统;还原系统时自动忽略 Ghost 镜像文件 CRC 校验。
在 SQL Server 中,当数据库正在进行还原操作时,会将该数据库的状态设置为“正在还原”。如果您需要在 C++ 中访问 SQL Server 数据库并查看数据库状态,可以使用 SQL Server Management Objects (SMO)。以下是一个简单的示例代码,可以获取数据库状态: ```c++ #include <iostream> #include <windows.h> #include <sql.h> #include <sqlext.h> #include <sqltypes.h> #include <comdef.h> #include <atlbase.h> #include <atlconv.h> #include <atlstr.h> #include <msxml6.h> #include <comutil.h> #include <vector> #include "sqloledb.h" #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") using namespace std; int main() { HRESULT hr = CoInitialize(NULL); if(FAILED(hr)) { cout<<"CoInitialize Failed!"<<endl; return 0; } try { _ConnectionPtr pConn("ADODB.Connection"); pConn->ConnectionString = "Provider=SQLOLEDB;Data Source=YourServerName;Initial Catalog=YourDatabaseName;UID=YourUserName;PWD=YourPassword;"; pConn->CursorLocation = adUseClient; pConn->Open("", "", "", adConnectUnspecified); _RecordsetPtr pRst("ADODB.Recordset"); CString strSql = "SELECT state_desc FROM sys.databases WHERE name = 'YourDatabaseName'"; pRst->Open(strSql, pConn.GetInterfacePtr(), adOpenStatic, adLockReadOnly, adCmdText); if(pRst->adoEOF) { cout<<"No records found!"<<endl; } else { cout<<"Database state: "<<(LPCSTR)(_bstr_t)pRst->Fields->GetItem("state_desc")->Value<<endl; } pRst->Close(); pConn->Close(); } catch(_com_error& e) { cout<<"Error: "<<(LPCSTR)e.Description()<<endl; } CoUninitialize(); return 0; } ``` 您需要将上述代码中的“YourServerName”、“YourDatabaseName”、“YourUserName”和“YourPassword”替换为实际的值。此代码将打开一个与 SQL Server 数据库的连接,并检索指定数据库的状态。如果该数据库正在进行还原操作,则会显示“RESTORING”状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值