本帖最后由 wansconst 于 2026-4-1 20:36 编辑
我之前没有学习过PC程序逆向,之前有下过一个CE程序,不会使用干脆直接拖入IDA中,发现真的可以进行解析成功,那好呀直接根据题目运行后的提示搜索字符串,发现了一条记录,查看引用跟进,找到本次题目的主逻辑。
查看伪代码猜测p_Str就是我们输入的字符串并查看紧接着跟着他的函数
进入函数内部发现一个静态变量,我们点击它的地址查看它的值,发现并没有其他地方进行赋值只要我们刚刚一处进行了读取,说明它是提前存好的,如果IDA View窗口没有值我们就去Hex View窗口进行查看
然后再回到主函数查看它的其他代码
最后我们已经确定解密逻辑就在如图第三个框框里的if分支内,那么我们可以直接进入函数内部进行查看
函数内部显示开辟了100字节空间的函数再是进行这100字节空间的初始化,我们进入到初始化函数内部查看其逻辑
可以发现它进行了前32字节数据的初始化,我们把伪代码丢给AI生成python脚本进行获取它初始化的内容,代码如下:
[Python] 纯文本查看 复制代码
def decrypt_block():
# 原始数据,按照 sub_401620 中的顺序
data = [
758280311, # 0x2D2D2D77 -> 0x77, 0x2D, 0x2D, 0x2D
1663511336, # 0x632D2D28 -> 0x28, 0x2D, 0x2D, 0x63
1880974179, # 0x702D2D63 -> 0x63, 0x2D, 0x2D, 0x70
494170226, # 0x1D6F6E72 -> 0x72, 0x6E, 0x6F, 0x1D
842146570, # 0x32320F0A -> 0x0A, 0x0F, 0x32, 0x32
657202491, # 0x272D2D3B -> 0x3B, 0x2D, 0x2D, 0x27
658185525, # 0x273F2D35 -> 0x35, 0x2D, 0x3F, 0x27
]
# 构建字节数组
bytes_list = []
# 添加 DWORD 值(4字节整数),注意小端序
for dword in data:
# 小端序转换为字节
bytes_list.extend([dword & 0xFF, (dword >> 8) & 0xFF,
(dword >> 16) & 0xFF, (dword >> 24) & 0xFF])
# 添加 WORD 值 (12323 = 0x3023)
bytes_list.append(0x23) # 低字节
bytes_list.append(0x30) # 高字节
# 添加 BYTE 值 (99 = 0x63)
bytes_list.append(0x63)
# 对前 31 个字节进行异或 0x42 解密
for i in range(31):
bytes_list[i] ^= 0x42
# 转换为字符串
result = bytes(bytes_list[:31]).decode('ascii')
return result
if __name__ == '__main__':
# 计算并打印结果
decrypted_string = decrypt_block()
print(f"解密后的字符串: '{decrypted_string}'")
print(f"字符串长度: {len(decrypted_string)}")
print(f"十六进制表示: {bytes(decrypted_string, 'ascii').hex()}")
这是我第一次分析Windows程序,笨重之处请见谅,不太会表达没表达清楚的地方请发表评论我会一一回复。 |