绕过软件的 USB 密钥激活

逆向工程 x64dbg 修补 USB 虚拟机保护 加密狗
2021-06-30 19:08:23

(该软件为中文,含有恶意软件,不知道能不能上传到这里,暂时先描述一下)

一家水疗店让我“做点什么”,制作一个看起来像2003年的软件供他们使用,名字叫“亿航皮肤分析系统”。水疗店给了我一个USB密钥(一个加密狗USB),这是他们从另一家商店借来的,他们有副本时必须归还。

我在谷歌上找不到有关该软件的任何信息。另外,USB 密钥不会出现在计算机上的任何地方,从模拟器到 rufus,甚至在 Linux 上也没有,所以我不知道如何克隆它,或者找出它是sentinel还是HASP. 所以唯一的办法就是逆转。我正在使用 x64dbg。

该软件使用VMProtect,我使用Scyllahide通过了它。

但是我卡在这一步,下面是我没有插入USB密钥的时候

软件的开始 在此处输入图片说明

点击“播放”3次后 在此处输入图片说明

播放 4 次,请注意指针在另一条线上,00478E5600474E91 在此处输入图片说明

玩5次 在此处输入图片说明

在第 6 次播放时,出现一条消息要求插入 U 盘 在此处输入图片说明

我重新启动并插入U盘,这次在第6次播放时,和0047A868上面一样在同一行,但这次代码变成了: 在此处输入图片说明

再点击一次播放,软件就可以运行了。还是在同一条线上0047A868 在此处输入图片说明

我试过十几次了,但是在插入U盘之前和之后,一切都只是“变成”了其他代码,而不是从代码A跳到代码B,popfd只是ret没有任何步骤就变成了我试过step intostep overanimate指针停留在同一行,但只更改了代码。所以我不知道从哪里跳到使软件工作的代码。

那么,如何让它在没有U盘的情况下变成工作代码呢?

1个回答

正如预期的那样,确实检测到了 USB,但由于 Linux 在没有适当驱动程序的情况下不知道如何处理它,它只解析其硬件相关参数(供应商和产品 ID)并在那里停止。

下面分别是 USB 设备的入口usb-deviceslsusb命令:

# usb-devices
[...]
T:  Bus=01 Lev=02 Prnt=05 Port=00 Cnt=01 Dev#=  8 Spd=1.5 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=3689 ProdID=8762 Rev=02.00
S:  Manufacturer=USBKey
S:  Product=USBKey
C:  #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=50mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=00 Driver=usbhid
[...]
# lsusb
[...]
Bus 001 Device 008: ID 3689:8762
[...]

我得出的结论是这是 USB 设备,因为这是两个文件*with_usb**without_usb*使用命令lsusbusb-devices.

所以现在,我会在 USB 插入后立即开始嗅探从 USB 发送到操作系统的字节,大多数情况下无法理解它们,但也许编写一个模拟设备通信行为的驱动程序会是绕过在插入 USB 设备的情况下运行软件的强制性保护策略的最快和最简单的方法。

对于嗅探部分,您可以使用任何基于 的东西libusb,当然也可以使用任何脚本语言的包装器。我本人是 Python 的粉丝,所以这里有一个使用 Python 的 PyUSB 库的小脚本:

#!/usr/bin/env python3
try:
    import usb.core
    import usb.util
except ImportError:
    print("Couldn't find 'pyusb' library!")
    exit(-1)

# The 'Vendor' and 'Product' IDs from 'lsusb' or 'usb-devices' entries
vendorID  = 0x3689
productID = 0x8762

# Assuming the first interface
usbIF = 0

# Find the USB device
# The USB must be plugged in before running the script
device = usb.core.find(idVendor=vendorID, idProduct=productID)

# Check if device exists
if device == None:
    print("Device doesn't exist!")
    exit(0)

# Check if device is attached, detach it
if device.is_kernel_driver_active(usbIF):
    device.detach_kernel_driver(usbIF)

# Now you will want to fuzz a bit the USB endpoints
(inputCmds, outputCmds) = device[0][usbIF,0].endpoints()

如果模拟 USB 数据包有效,那将是一种更简单的方法来处理应用程序,而无需插入 USB 设备,无需反转 VMProtect 软件。