Start
0x01 信息收集

查壳,VB5程序:

拖进IDA:

关键跳,爆破的话nop掉jz就可以了

拖进VB Decompiler:

在Form窗体中只有两个控件,一个是Text,一个是Click,直接进入Click:

大体流程整理(这里的反编译是存在问题的,所以拖入x32dbg进行分析):
Key = Text2.Text
Name = Text1.Text
var_34 = 0
for i in Key:
var_34 += ord(i)
var_34 *= 1234567890
if var_34 == Name:
print("RiCHTiG !")
else:
print("LEiDER Falsch ! ")
0x02 流程分析
x32dbg定位到Click事件的回调函数:

获取Name长度:

调用rtcMidCharVar函数:
0x19F228用来存储结果
0x19F260用来存储Name
0x01为Step步长


调用vbaStrVarVal,取第一个参数的


往下调用vbaVarAdd:

调用vbaVarMove放到[ebp-34]:

vbaVarForNext进入下一个循环:

[ebp-34] => 0019F270用来存放最终的结果:

输入:fuck
得到:0x01A9

往下将0x01A9 * 1234567890:

压入四个参数,调用vbaMidStmtVar,替换第四个和第九个的值为-,最终的值放到[ebp_34]:


得到Serial:524-9135-250
最终调用vbaVarTstEq,对比通过Name得到的Serial和输入的Serial是否相等:

0x03 注册机编写
关键注册码生成代码:
import sys
import random
import string
from PyQt5.QtWidgets import QApplication, QMainWindow
from crackMe09 import Ui_MainWindow
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.generate_name_serial)
self.Name = ''
self.Key = ''
def generate_name(self):
self.Name = ''.join(random.sample(string.ascii_letters + string.digits, random.randint(1,10)))
def generate_serial(self):
res = 0
for i in self.Name:
res += ord(i)
res *= 1234567890
self.Key = str(res)
key_list = list(self.Key)
key_list[3], key_list[8] = '-' * 2
self.Key = ''.join(key_list)
def generate_name_serial(self):
self.generate_name()
self.generate_serial()
self.textEdit.setText(self.Name)
self.textEdit_2.setText(self.Key)

Comments NOTHING