源程序如下(打开方法:将后缀改为exe):
打开是一个这样的程序,然后点help进行注册

在程序中随意输入注册码,然后在OD中查找所有参考文本字串


我们分析这一块汇编代码,可以知道Name的输入被存在了0040218E,然后f1(name)函数在0040137E,Serial的输入被存在了0040217E,然后f2(serial)函数在004013D8。依次存在EAX和EBX中,然后比较

然后我们依次去看0040137E函数和004013D8函数

经过ai分析这个函数主要功能是:检测输入的字符串是否只包含字母,将小写转换成大写,然后计算字符串的异或和,最后存在EAX里面

经过ai分析这个函数主要功能是:转换数字字符串为数字值,要注意,代码后面还与0x1234异或的步骤,在IDA中没有展示
下面来构造自动机
先实现相关的几个函数
def sub_4013D2(a1, a2): #小写转大写
result = a1 - 32
a2[0] = result
return result
def sub_4013C2(a1):
v1 = 0
for char in a1:
v1 += char
print(v1)
return v1
def sub_40137E(a3):
a3_list = list(a3) # 将字符串转换为列表以便修改
for i in range(len(a3_list)):
v4 = a3_list[i]
if v4 == 0:
print(a3_list)
sum_result = sub_4013C2(a3_list)
return sum_result ^ 0x5678 ^ 0x1234
if (v4 < 0x41):
break
if (v4 >= 0x5A):
a3_list[i] = sub_4013D2(v4, [a3_list[i]])
continue
# 如果循环中检测到不符合条件的字符,模拟显示错误信息
print("Error: Incorrect try. Please try again.")
return None
def sub_4013D8(a1):
v1 = 0
v2 = 0
v3 = 0
result = 0
for char in a1:
if char == 0:
break
v1 = 10
v3 = char - 48
v2 = v3 + v1 * v2
result = v2
return result
然后写测试主程序
def test_program():
# 模拟汇编代码的流程
input_str1 = input()
a3_1 = [ord(c) for c in input_str1] + [0] # 转换为 ASCII 值列表,并添加结束符
# CALL sub_40137E
eax_value = sub_40137E(a3_1)
if eax_value is not None:
print(f"Result of sub_40137E with input '{input_str1}': {hex(eax_value)}")
else:
print(f"Input '{input_str1}' is invalid for sub_40137E.")
print(eax_value)
然后将该结果放在源程序中

测试成功(将文件后缀改为py)


Comments | NOTHING