CrackMe-009

发布于 2023-04-14  120 次阅读


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