海天一色001 发表于 2021-1-21 13:54

160个Crackme之049学习笔记

本帖最后由 海天一色001 于 2021-1-21 13:57 编辑

第49个CM,先打开,是Name/Serial模式,先输入“52pojie/1234567890”,点击Check按钮,弹出错误信息框,内容翻译过来是“你的注册信息是无效的... 注意大多数特殊字符可能会引起注册问题!”

一、查壳:

ASM编程,无壳。
二、爆破:
将CM程序导入OD中,ASM程序,从00401000开头向下查看,代码很简洁清晰,标准的windows程序。
到004010D5处,一个跳转命令,跳过了注册成功的信息框,那么就是关键跳了,nop一下,

保存为DueList.4.nop.exe,双击运行,弹出注册成功信息框,但标题栏为空。
点击“确定”按钮,又见一个注册成功信息框,此时标题栏中有“Duelist's Crackme #4”的字样。点掉,再点掉,就在标题栏有无字符之间不断重复,说明爆破不完全成功,此处nop掉可能使程序正常运行的参数丢了,造成死循环了。只好用Ctrl+Alt+Del键来强行关闭了。
回到OD,在004010D7处下断,F9运行,F8单步:

运行完004010E8代码,听到“叮咚”一声,看到当前代码又回到了004010D7处!
继续F8单步,再次、3次、4次。。。N次代码回到004010D7处,程序进入了死循环?所以会不断弹出正确信息框吗?
又按了N次F9,程序竟然向下走到了004010ED处!
再F8单步在0040111D处返回到系统空间 77D18734 (user32.77D18734)后,Alt+F9,又又又返回到004010D7处!
继续F8,又是回到004010D7处。又是N多次后,终于确认,这个程序在004010D5处nop不是好的选择。
所以DueList.4.nop.exe是一个不怎么成功的爆破程序。
转换一下思路,正确提示这里不行,再看看错误提示处:

向下到0040121A至0040122B处是弹出错误提示的代码段,点击0040121A行,信息栏中显示“跳转来自 0040113F, 00401148, 00401163, 0040116B, 004011B1, 004011B6, 004011F9”。
干脆将这6个来源的跳转全部nop掉,再保存为DueList.4.nop1.exe,运行一下,不用输入任何Name/Serial,点击Check按钮,弹出正确提示窗口,说明这次爆破成功了,只是nop的地方多了点。
三、追码:
撤消刚才所有的修改,继续观察代码:
爆破时已知修改正确提示窗口前的跳转命令不可取,而nop掉跳转到错误窗口的指令可行,那就从“0040113F, 00401148, 00401163, 0040116B, 004011B1, 004011B6, 004011F9”这6个跳转地址入手来查看:
先来到第1个地址0040113F处,指令是je DueList_.0040121A,相等则跳,再上下查看:

在00401127处下断,F9运行,输入Name/Serial为“52pojie/1234567890”,点击Check按钮,程序中断,F8单步,动静结合分析:
00401127至00401132处,00401150至0040115B处分别得到用户名“52pojie”和注册码“1234567890”的字符串长度为0x7和0xA;
0040113C至00401148处,对用户名进行限制,0<用户名长度<8;
00401160至0040116B处,对注册码进行限制,不能为空,且注册码长度必须等于用户名长度。
单步至00401169处,因为两个字符串长度不等,下一句会跳走,所以在单步至0040116B处时,双击寄存器窗口的Z标志位上的“0”,使之改为“1”,程序不跳走,继续单步向下:

00401171至00401192处,得到用户名和输入的注册码,可以看到内存地址中将用户名存入00402160处,注册码存入00402179处。
继续单步向下,00401197到004011D9之间根据输入的用户名生成真正的注册码:

先判断用户名字符,不能小于0x41,不能大于0x7A,即所有的大小字母和[ \ ] ^ — 、这六个特殊符号:
字符值大于0x5A时,减去0x20,即小写转成小写:
所以原来输入的“52pojie/1234567890”就不对了,Ctrl+F2 再F9重新运行,输入“wapojie/1234567”,点击Check按钮,程序中断于00401127处,再F8单步向下:
利用004011C0至004011CA的循环,在ds:中字符串“A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9” 查找上面输入用户名运算后生成的字符位置;
将ds:中字符串“SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF”相同位置的字符取出存入ds:中,循环结束后生成了真正的注册码“9SSSF0F”:

004011DB至004011F9处,前3行指令作为参数,进入第四行的00401244的call中进行判断,正确则eax=1,跳到正确提示004010D7处,否则失败。
这样就可以编写注册机了。
本想用刚刚开始学习的C语言来编程,却发现VB中有的字符串处理函数在C语言中竟然没有!!!需要用到指针等让我还没弄明白的东西去自己编写函数,未经系统学习,确实太难了点!
所以这次的注册机仍然先以Vb来编写。
Option Explicit
Private Sub Command1_Click()
Dim i As Integer
Dim NString: NString = "A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9"
Dim CString: CString = "SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF"
Dim Name: Name = Text1.Text
Dim msg1
Dim NChar, CChar
Dim Nnum
    If Len(Name) < 1 Or Len(Name) > 7 Then
      msg1 = MsgBox("必须输入1至7个英文字符!点击确定按钮重新输入,点击取消则默认用户名为“wapojie”,注册码为“9SSSF0F”!", 1, "注意")
      If msg1 = 1 Then
            Text1.SetFocus
            Text1.Text = ""
      End If
      If msg1 = 2 Then
            Text1.Text = "wapojie"
            Text2.Text = "9SSSF0F"
            Exit Sub
      End If
    End If
    For i = 1 To Len(Name)
      NChar = Mid(Name, i, 1)
      If Asc(NChar) > 90 Then NChar = Chr(Asc(NChar) - 32)
      Nnum = InStr(1, NString, NChar)
      CChar = CChar & Mid(CString, Nnum, 1)
    Next i
      Text2.Text = Trim(CChar)
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 8 Or KeyAscii = 127 Then Exit Sub '如果输入退格键和删除键则退出过程
    If KeyAscii < 65 Or KeyAscii > 122 Then KeyAscii = 0 '如果超出范围则无效,需重新输入新的字符
End Sub
附件,含CM原程序、爆破后的程序、注册机及源码、OD的调试文件,等等。
百度链接:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ
提取码:p8dk。

约定的童话 发表于 2021-1-21 15:46

VM壳玩的转不?

13169456869 发表于 2021-1-21 16:54

感谢分享!!!!!!

lwedwin 发表于 2021-1-21 19:25

是个好东西   谢谢分享

哥比彩砖还炫 发表于 2021-1-21 20:05

为什么有的明明有壳,但是我用peid查不出来呢?

pojie6033 发表于 2021-1-21 20:57

先收藏了,还没学习到那一步

sunpeng0320 发表于 2021-1-21 21:56


先收藏了,正挺好
还没学习到那一步

PrincessSnow 发表于 2021-1-22 02:42

谢谢大佬的分享!~

mllaopang 发表于 2021-1-22 09:09

感谢分享

silent小泷 发表于 2021-1-22 10:36

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