x32dbg动态调试--内存断点

观察程序

  1. 使用Detect It Easy检测目标程序为PE32
  2. 运行程序,依次点击“Shift”–>“Try It”,发现有Crudd‘s Crack HeadSerial等字符串,只能输入数字,点击“Check It”按钮没有任何提示信息。

分析过程

  1. x32dbg载入目标程序,运行到目标程序空间,鼠标右键在“当前模块”搜索字符串
  2. 鼠标点击Serial字符串,x32dbg跳转到下列窗口界面。经过调试发现,程序调用SetWindowText函数设置静态文本框的内容为Serial,并且程序调用还调用GetWindowText函数获取Serial对应对话框中的数字字符串。
  3. 函数功能分析:具体见下图所示。
  4. crackhead.4013D2()函数功能分析如下图所示。
  5. crackhead.4013D2()函数功能对应的Python脚本源代码如下。
inBuf = "12345666"
v0 = 0
v1 = 0
k = 0
if(ord(inBuf[0])==45):
    v1 = -1
    k += 1
nEnd = len(inBuf) - k
for i in range(nEnd):
    v0 = (ord(inBuf[k+i]) - 48) + v0*10
    print(k+i,v0,hex(v0))

res = v1 ^ (v1 + v0)
print(res)
  1. 在x32dbg中重新启动目标程序,并在0x40339C处设置重复的“内存,写入”断点
  2. 多次按F9运行目标程序,直到出现如下界面,并使用x32dbg进行动态调试。
  3. 利用磁盘类型与卷名数据进行计算得到一个4字节数据(0x5A9678CA),这个数据再与0x797A7553进行异或(参考第6步图示)的值(0x23ec0d99),最后与序列号进行比较判断是否破解成功。
  4. 分析上面图中函数功能,编写实现其功能的Python脚本。
nType = 3             # GetDriveType
volName = "windows"   # GetVolumeInformation

ret = 0;
ebx = ord(volName[3])<<24|ord(volName[2])<<16|ord(volName[1])<<8|ord(volName[0])
for k in range(nType,0,-1):
    ret += ebx * k
ret &= 0xffffffff
print(hex(ret))
ret ^= 0x797A7553
print("Serial: ", hex(ret)," =====> ",ret)
  1. 验证

参考文献

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值