关于DNF还原VM的一些个人观点

本文分享了三种还原VM的方法:对比法、查找法和跟踪返回点法。通过具体实例解析每种方法的应用场景和操作步骤,旨在帮助初学者理解和掌握VM还原技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实我也是个菜鸟,只是看大家那么对人问VM,发表下自己的看法,大牛别笑
VM的还原,我个人呢,总结了集中方法
第一种方法:对比
比如说现在的过图第一个点97F660

0097F65E    CC              int3
0097F65F    CC              int3
0097F660    E9 61D2A501     jmp 023DC8C6
0097F665    68 48F76C01     push 0x16CF748
0097F66A    64:A1 00000000  mov eax,dword ptr fs:[0]
0097F670    50              push eax

一看就知道是一个CALL的头部,VM HOOK了5个字节,下一句是push 0x16CF748
这个好办多了,其实有好多CALL,头部都PUSH了一个像这样的一个数,看看上面是什么,就知道怎么还原了
在最近找个CALL看看,就可以还原.比如

004A89A0    55              push ebp
004A89A1    8BEC            mov ebp,esp
004A89A3    6A FF           push -0x1

004A89A5    68 10746801     push 0x1687410
004A89AA    64:A1 00000000  mov eax,dword ptr fs:[0]

一对比看就知道上面被HOOK的地方为
push ebp
mov ebp,esp
push -1
刚刚好5个字节,于是呢,还原就是

0097F660 = 55 8B EC 6A FF

但是呢,这种方法适用范围小

第二种方法,查找
现在过图CALL的第3个点是9F644D

009F644D   /E9 9C5C9E01     jmp 023DC0EE
009F6452   |90              nop
009F6453   |90              nop
009F6454   |59              pop ecx
009F6455   |5F              pop edi
009F6456   |5E              pop esi
009F6457   |5B              pop ebx
009F6458   |8BE5            mov esp,ebp
009F645A   |5D              pop ebp
009F645B   |C3              retn

大家看一下,009F644D处HOOK了5个字节,然后NOP填充了2个字节,意思就是一共HOOK了7个字节
那么他HOOK后跳回的地址就是00976454

然后我们CTRL+S查找命令 JMP 00976454
就找到一个点
02F4FF63    64:890D 0000000>mov dword ptr fs:[0],ecx
02F4FF6A    9C              pushfd
02F4FF6B    66:892424       mov word ptr ss:[esp],sp
02F4FF6F    9C              pushfd
02F4FF70    9C              pushfd
02F4FF71    8D6424 4C       lea esp,dword ptr ss:[esp+0x4C]
02F4FF75  ^ E9 DA64AAFD     jmp 009F6454

然后大家往上走,就看到一句
02F4FF63    64:890D 0000000>mov dword ptr fs:[0],ecx

刚刚好7个字节,
于是还原了就是
009F644D = 64 89 0D 00 00 00 00
如果实在不放心,大家可以测试下崩溃不,或者找最几个相同的地方去看看

第三种,跟踪返回点
现在过图的第二个点97F91D

0097F91D    E8 B7CFA501     call 023DC8D9
0097F922    85C0            test eax,eax
0097F924    0F84 93000000   je 0097F9BD
0097F92A    8B4D CC         mov ecx,dword ptr ss:[ebp-0x34]
0097F92D    8B81 24060000   mov eax,dword ptr ds:[ecx+0x624]
0097F933    50              push eax

这种VM不是JMP跳转的,他是CALL一个地址
CALL呢有一个返回地址,返回地址其实就是RETN时ESP的值
知道这个就好办了
我们看他是HOOK了5个字节,那么他的返回点就是0097F922
我们在0097F91D处下断,断下后,CTRL+T(设置条件断点)
我们在 条件为真 的前面打勾 在后面输入
[ESP]==0097F922
然后确定,CTRL+F7(自动步入)
他就会自动一直往下跑,一直跑到ESP的值是0097F922的时候才会暂停
大家等一会就会断下了,最后呢断在
02F50B52    C74424 24 22F99>mov dword ptr ss:[esp+0x24],0x97F922
02F50B5A    883424          mov byte ptr ss:[esp],dh
02F50B5D    894424 14       mov dword ptr ss:[esp+0x14],eax
02F50B61    60              pushad
02F50B62    53              push ebx
02F50B63    FF7424 48       push dword ptr ss:[esp+0x48]
02F50B67    C2 4C00         retn 0x4C
跳回去后,执行的第一条指令是 test eax,eax,那被HOOK的地方一定跟EAX有关,我们往上看
找不到我们要的数据,那怎么办呢,我们继续网上找
查找所有常量  02F50B52
我们就会找到一句
02F53B5E  ^\E9 EFCFFFFF     jmp 02F50B52
我们条过去看看

02F53B34    66:0FBEC1       movsx ax,cl
02F53B38    66:0FB6D2       movzx dx,dl
02F53B3C    66:0FC9         bswap cx
02F53B3F    FD              std
02F53B40    9D              popfd
02F53B41    2F              das
02F53B42    61              popad
02F53B43    9C              pushfd
02F53B44    F8              clc
02F53B45    881C24          mov byte ptr ss:[esp],bl
02F53B48    9C              pushfd
02F53B49    83C4 0C         add esp,0xC
02F53B4C    60              pushad
02F53B4D    54              push esp
02F53B4E    C60424 E0       mov byte ptr ss:[esp],0xE0
02F53B52    8D6424 24       lea esp,dword ptr ss:[esp+0x24]
02F53B56    E8 754763FD     call 005882D0
02F53B5B    57              push edi
02F53B5C    9C              pushfd
02F53B5D    60              pushad
02F53B5E  ^ E9 EFCFFFFF     jmp 02F50B52

大家注意到没.红色这条就是我们要的指令了
复制下来,跳回到0097F91D,把他改为 call 005882D0
然后我们二进制复制下来就OK了
那么还原了就是
0097F91D = E8 AE 89 C0 FF

到这呢,我的方法也就结束了,本人仅仅发表个人观点,大家交流下,大牛勿喷!!
### 配置VM虚拟机作为DNF服务器 配置VM虚拟机作为DNF服务器需要完成以下几项关键任务:安装必要的软件包、配置网络环境以确保外部设备可以访问虚拟机中的服务,以及设置SNMP服务以便于监控和管理。 #### 1. 安装必要的软件包 在Linux系统中,可以通过`dnf`命令行工具来安装所需的软件包。例如,为了支持SNMP服务,可以使用以下命令安装相关组件: ```bash dnf -y install net-snmp net-snmp-devel net-snmp-libs net-snmp-utils ``` 这一步骤确保了SNMP服务及其依赖库被正确安装[^1]。 #### 2. 配置网络环境 为了让虚拟机能够作为DNF服务器运行并被其他设备访问,必须正确配置网络模式。通常建议使用桥接模式(Bridged Mode),这样虚拟机将直接连接到物理网络,并获得独立的IP地址。具体操作步骤如下: - 在VMware中选择虚拟机,进入“编辑虚拟机设置”。 - 将网络适配器更改为“桥接模式”。 - 确保虚拟机与主机处于同一子网内,且能够通过ping命令互相通信。 此外,如果需要从外部设备通过SSH访问虚拟机,需确认已安装并启动OpenSSH服务: ```bash dnf -y install openssh-server systemctl start sshd systemctl enable sshd ``` 这些命令用于安装OpenSSH服务器并确保其开机自启[^2]。 #### 3. 设置SNMP服务 安装完成后,还需要对SNMP服务进行适当配置,以满足DNF服务器的需求。主要涉及编辑主配置文件`/etc/snmp/snmpd.conf`,添加或修改相关内容,如社区字符串、访问权限等。完成后重启SNMP服务: ```bash systemctl restart snmpd ``` #### 4. 安装VMware Tools 为了提升虚拟机性能及兼容性,推荐安装VMware Tools工具包。可通过以下命令实现自动化安装: ```bash yum -y install open-vm-tools vmtoolsd -v && systemctl start vmtoolsd ``` 上述命令不仅完成了VMware Tools的安装,还验证了其版本信息并启动了对应的服务[^1]。 ### 示例代码片段 以下为一个简单的Shell脚本,用以检查SNMP服务状态并尝试自动修复: ```bash #!/bin/bash if ! systemctl is-active --quiet snmpd; then echo "SNMP service is not running. Attempting to start..." systemctl start snmpd fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值