直接运行发现是一个输入flag进行验证。
IDA 载入 根据字符串搜索找到对应的地方。
sub_401990
验证pe头标志位 判断 是否程序被调试。
sub_401950
对于反调试,可以直接 nop掉从而 绕过。
v6()
调用 返回值需要为0IDA 动态分析
需要返回为 1
层层递进
返回11
关键 unk_1000A0C0()
unk_1000A0C0() 函数
函数里面先布置了 数据在最后 利用 sub_10003170()
利用c++函数指针来调用判断 (vm保护)
依次 找到对应函数 和参数从而调用。
对应数据动态调试。我们利用 OD 更清晰。
VM保护分析。
反复调试,程序先对我们的输入进行依次取值,保存在一个 寄存器里面,加密后保存在一个对应位置保存在对应的 v4 数组 0 1 2 3 对应下标。
下一次寄存器里面的数 异或 保存到 寄存器
再下一次数据 +2 保存到寄存器
加密后的数据保存到对应的buf里面 因为是第4个数 所以保存在下标为3 的地方
所有数据进行了 异或 后 +2 的操作后,又依次取出保存到寄存器 再去另一个数保存到寄存器异或,最后保存到 之前的buf数组。
然后进行依次比较
所有程序的整体逻辑是:
XOR_data1 = 0x33
XOR_data2 = [0x36,0x48,0x0d,0x23,0x0c,0x25,0x09,0x17,0x53,0x06,0x10,0x1a,0x24,0x2e,0x38,0x42]
CMP_data = [0x51,0x5f,0x72,0x69,0x6a,0x32,0x89,0x79,0x2b,0x52,0x52,0x56,0x4a,0x4d,0x60,0x12]
flag = ""
for i in range(len(CMP_data)):
XOR_data2[i] ^= CMP_data[i]
flag += chr((XOR_data2[i]-2)^XOR_data1)
print flag
# V&N{W&M_Easy_Re}