海天一色001 发表于 2020-8-11 16:33

160个Crackme之044学习笔记

本帖最后由 海天一色001 于 2020-8-11 16:35 编辑

上两个CM不能叫CM,目前还是一头雾水状态,需要学习新的知识才能应付啊。再来看第44个CM程序,难度仍是“?”,保护方式显示Name/Serial(Delphi)。
打开Dope2112.1.exe,在两个文本编辑框(Name/Serial)中输入“52pojie/1234567890”,点击Registrieren按钮,最下面的标签上显示出“Leider nicht versuchs noch mal !”的提示,这应该是错误提示吧,似英文非英文的。


第一步、查壳:

Delphi程序,无壳。
第二步、爆破:
DeDe无法加载Delphi 2.0版本,用IDR试一试,仍然出错了。
直接用OD载入:

程序前面倒是简洁的很,一大堆的call,不知道有什么用。
再用智能搜索字符串试一试:
找到了刚才的提示:

双击00421D5A这一行代码进入CPU窗口:

这两个字符串挨的很近,估计一个是正确提示一个是错误提示,还是百度一下:
德语!!!!
“Hey du hast es geschaft !”---嘿,你做到了!
“Leider nicht versuchs noch mal !”-----抱歉,请重试!
猜测没错,那么00421D40处的jnz跳过了正确提示,是关键跳了。

所以在这里nop掉,保存为Dope2112.1_nop.exe,打开,直接点击Registrieren按钮,又出了“Der Name muss min. 6 Zeichen lang sein”提示,猜测是Name要6个字符,用网上的德文翻译一下,没错。
重新输入“52pojie/1234567890”, 点击Registrieren按钮,出现正确提示,爆破成功。

第三步、追码:
撤消刚才爆破时nop的修改,来到段首处下断:
F9运行,输入“52pojie/1234567890”,点击Registrieren按钮,程序中断于00421BAE处。
F8单步慢慢向下,仔细查看信息窗口、寄存器窗口和堆栈窗口,基本上猜测判断出部分call的作用:

004117F8是得到文本的call
00405248 暂时不知道有什么用,反复F8、F7调试几次后发现是大写字母转换成小写字母的
00403364 得到字符串长度
00421BC1至00421BDB处代码为判断Name字符串是否满足至少6位,如不足6位则跳出“Der Name muss min. 6 Zeichen lang sein”提示;
00421BF2处将eax清零,作为下面循环数的暂存器;
00421BF4至00421CEA处,判断Name字符串中的每一个字符是否符合都是小写字母,如果不是,则统一定义对应值为0x5D;然后依次取name字符串中前5个字符的对应值,再加1个0x5D,存入dl中累加,得到一个数值;
00421CF0至00421CFE处,取Name字符串长度乘以0x4A7E的值,转换成10进制数值,存入SS :中;

00421D03至00421D0A处,将00421BF4至00421CEA处得到的累加值转换成10进制数值;

00421D0F至00421D22处将3个字符串连接起来组成真正的注册码;

从栈窗口中可以看到输入的Name、假码、真码;

00421D35至00421D5F处判断真假,在CM程序窗口中显示正确或错误的提示:

注册算法(VB编程):
Private Sub Command1_Click()
Dim Name, Serial As String
Dim i As Integer
Dim Num, Num1, Num2 As Double
    Name = Text1.Text
    If Len(Trim(Name)) < 6 Then
       MsgBox ("Name必须超过6位,如不符合要求,默认Name为“52pojie”,Serial为“172-133490”!")
       Text1.Text = "52pojie"
       Text2.Text = "172-133490"
       Exit Sub
    End If
    Name = LCase(Name)
   Num1 = 93
    For i = 1 To 5
      Select Case Mid(Name, i, 1)
         Case "a"
               Num = 24
         Case "b"
               Num = 37
         Case "c"
               Num = 66
         Case "d"
               Num = 12
         Case "e"
               Num = 13
         Case "f"
               Num = 6
         Case "g"
               Num = 54
         Case "h"
               Num = 43
         Case "i"
               Num = 23
         Case "j"
               Num = 47
         Case "k"
               Num = 19
         Case "l"
               Num = 130
         Case "m"
               Num = 155
         Case "n"
               Num = 146
         Case "o"
               Num = 3
         Case "p"
               Num = 99
         Case "q"
               Num = 31
         Case "r"
               Num = 66
         Case "s"
               Num1 = 92
         Case "t"
               Num = 41
         Case "u"
               Num = 199
         Case "v"
               Num = 102
         Case "w"
               Num = 88
         Case "x"
               Num = 10
         Case "y"
               Num = 40
         Case "z"
               Num = 80
         Case Else
               Num = 93
       End Select
       Num1 = Num1 + Num
       If Num1 >= 256 Then Num1 = Num1 - 256
    Next i
    Num2 = Len(Name) * 19070
    Serial = Num1 & "-" & Num2
    Text2.Text = Serial
End Sub
附件,含CM原程序、爆破后的程序、注册机、OD的调试文件等。
百度链接是:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ,提取码:p8dk。160个CM、我已练习过的前44个crackme程序(不含012、042、043)都在里面。

mj7089471 发表于 2020-8-11 17:13

牛逼!你说你

迈克尔詹姆斯 发表于 2020-8-11 17:23

十分感谢楼主分享!!楼主V587。。。万分感谢。。要比其他分享的,还慢慢优越感的楼主强多了。。。谢谢谢谢!!

imiaox 发表于 2020-8-11 17:49

谷歌翻译一下Leider nicht versuchs noch mal
是德语,意思是 抱歉,不要再试

乔帮主爱破解 发表于 2020-8-11 19:26

评论能获得币吗?

这个ID是偷来的 发表于 2020-8-11 19:41

感谢分享,很有用!

yuelingge 发表于 2020-8-11 19:47


感谢分享。 学习了

jiayou618 发表于 2020-8-11 20:11

厉害!精品啊。先谢谢了,

isroot 发表于 2020-8-11 20:35

学习学习{:17_1068:}

mdjlw 发表于 2020-8-11 20:52


感谢分享
页: [1] 2
查看完整版本: 160个Crackme之044学习笔记