首先运行样本,随机输入字符串,我们得到:

用IDA加载样本,shift+F12,查找字符串。通过观察,很容易想到里面是否有我们输入的字符串或者是MessageBoxA字符。我们很快发现了里面有MessageBoxA字符,但没有其他的信息,比如”TrackMe”或者是之前输入的字符串。

双击该字符,通过浏览,看到”lstrcpyA”,如果你破解过多个该类型的小程序,你会发现这正是两个字符相比较的信号。

双击旁边的”CODE XREF: sub_401340+4F”,进入该函数,按”Tab”键,进入反汇编,但并没有什么有用的信息。但是我们得到了调用”lstrcpyA”的位置:”0040138F”,由此用OD找到此处,在此处下断点进行调试。

“Ctrl+G”,找到该位置,F2下断点,F9运行:


注意看到堆栈处,”String1 = “2222222”和”String2 = 2450”.回想到我们之前输入的用户名”1111111”和序列号”2222222”,它们之间会有什么联系呢?

为了验证这个问题,可以用OD再次调试,输入不同的应户名和序列号,我们这次输入用户名”12345”和序列号”1234567”,看到两个字符分别为”1234567”和”1154”.我们发现字符串1和输入的序列号是一样的,而序列号是不同的。说明它们之间有一定的运算关系。通过汇编语言,经过推到,得出序列号是由用户名用过一定的运算得到。在堆栈中出现的”String2”则是该用户名对应的相应的序列号。

验证,输入用户名”12345”和序列号”1154”


换一种思路

以上是通过找到用户名相对应的序列号达到破解的目的,接下来,我们换一种思路。如果我们改变了跳转的条件或者不让其进行跳转,是否可以达到同样的效果。

首先,OD加载样本,找到字符串”GetDlgItemTextA”出现的位置,设置断点,运行,随机输入字符串。

接下来,进行单步F8调试。注意观察,我们会在调试过程中会发现有”跳转未实现”出现。由于我们输入的红用户名和序列号不是对应的,因此跳转未实现,由此,我们让跳转实现不就可以了吗?

回到入口函数。继续单步,注意出现的“跳转以实现”字,并且条件是”JE”,我们改变条件,右键->汇编,改成”JNE”,并保存文件。

运行测试: