源程序如下(打开方法:将后缀改为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)


人生苦难处,正是修行时