CrackMe-009

Start

0x01 信息收集

image.png

查壳,VB5程序:

image.png

拖进IDA:

image.png

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

image.png

拖进VB Decompiler:

image.png

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

image.png

大体流程整理(这里的反编译是存在问题的,所以拖入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事件的回调函数:

image.png

获取Name长度:

image.png

调用rtcMidCharVar函数:

0x19F228用来存储结果

0x19F260用来存储Name

0x01为Step步长

image.png

image.png

调用vbaStrVarVal,取第一个参数的

image.png

image.png

往下调用vbaVarAdd:

image.png

调用vbaVarMove放到[ebp-34]:

image.png

vbaVarForNext进入下一个循环:

image.png

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

image.png

输入:fuck

得到:0x01A9

image.png

往下将0x01A9 * 1234567890:

image.png

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

image.png

image.png

得到Serial:524-9135-250

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

image.png

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)

image.png

End

avatar