天清地宁 发表于 2015-8-21 02:39

160个CrackMe - 001

这个程序有提供了两个功能,一个账户密码形式的和直接输入KEY形式的。爆破
账户密码形式 Serial/Name

.   错误提示:Sorry , The serial is incorect !,不用管。在OD中直接单步走,走出MessageBox函数后返回的第一个函数,个人目测了下还不是关键地方。因为没有什么特别的跳转指令就继续跑出这层函数返回上层。返回之后往上看反汇编代码。


.   那么想要跳过这个错误提示信息则需要将 0042F803处的JNZ给nop掉。nop掉后F9让程序跑起来,然后重新点击【Check it Baby!】。OD中继续在MessageBox处中断了。并且程序弹出了GOOD窗口。
.   话说,这个功能中,账户低于4位字符的话~~也会有一个错误提示框!,记得在点击【Check it Baby!】先下MessageBox断点哦~~~


.   OD中断下后网上返回两层,返回第一层瞟了一眼没有看到什么跳转指令则网上层继续返回

.   如果想要输入的账户长度不大于4,只需要把JGE给修改成JMP让其强制跳转即可!!!
爆破输入KEYSerial
.    同理,先下MessageBox断点~,然随便输入,点击【Check it Baby!】弹出的消息为:Try Again!!。OD在MessageBox中断下来了。 按照惯例,走出MessageBOx后看看有没有什么跳转,如果有则查看跳转到哪,没有则继续网上层返回。


这里修改上面的JNZ改为NOP,不管返回什么都往下走。修改后F9跑程序!爆破成功~~~~~~~~
这个功能只需要输入KEY就行了。不防尝试找下正确的KEY到底是什么!!!!既然知道正确和错误的跳转地点,那么尝试下再跳转地点下个INT3看看,CALL的参数是什么。
函数中并没有使用push来传入参数,只是用了两个内存数据给了两个寄存器EAX和EDX。这种情况明显不是__stdcall或者__cdecl。 不妨看下寄存器给定的值到底是什么。


真相只有一个~~~~~ EAX为我输入的字符串SSSSS,那EDX是另一个字符串,是不是解密的KEY输入一下EDX的内容就知道了。。。。。。
分析 Serial/Name 算法
.   Serial/Name爆破算是玩了,仅仅是爆破。感觉就像是找了一部A片随便看下然后撸一发就完了就关掉的感觉。我不仅仅是要撸一发,还得好好的琢磨琢磨各种姿势和过程….(七夕这天作为一名单身汪,只能这么屌丝了。。。)

想找注册算法首先得找到注册成功的爆破点。想找注册算法首先得找到注册成功的爆破点。

0042FAFE|.E8 F93EFDFF   call Acid_bur.004039FC ;这个CALL的返回值
0042FB03|.75 1A         jnz XAcid_bur.0042FB1F   ;上一个CALL的返回值不等于0则跳转到错误消息
0042FB05|.6A 00         push 0x0
0042FB07|.B9 CCFB4200   mov ecx,Acid_bur.0042FBCC
0042FB0C|.BA D8FB4200   mov edx,Acid_bur.0042FBD8
0042FB11|.A1 480A4300   mov eax,dword ptr ds:
0042FB16|.8B00          mov eax,dword ptr ds:
0042FB18|.E8 53A6FFFF   call Acid_bur.0042A170
0042FB1D|.EB 18         jmp XAcid_bur.0042FB37 ;强制跳转,跳过了错误显示。
0042FB1F|>6A 00         push 0x0
0042FB21|.B9 74FB4200   mov ecx,Acid_bur.0042FB74
0042FB26|.BA 80FB4200   mov edx,Acid_bur.0042FB80
0042FB2B|.A1 480A4300   mov eax,dword ptr ds:
0042FB30|.8B00          mov eax,dword ptr ds:
0042FB32|.E8 39A6FFFF   call Acid_bur.0042A170 ;函数内调用了MessageBox显示错误

call Acid_bur.004039FC为判断函数返回0则为真的注册码。那么我们在这里下断看看。这个程序直接是明文比较的。观察寄存器就能看到我输入的密码4567,和计算出来的密码。。

自己测试过,直接输入账户1234密码CW-4018-CRACKED显示GOOD,正确的。但是我要的是算法。查看明文KEY:CW-4018-CRACKED可知是由,字符串,数字,字符串组成。那么,我们则可以尝试使用IDA了。通过IDA搜索是否存在CRACKED字符串。

运气好,找到了。那么。在内存地址0042FAB3。OD中GO过去刚好离爆破点很近啊~~~爆破点在0042FB03处。那么我们可以单步在这里附近单步下看看函数具体做了写什么。范围取值在0042FA79到0042FAFE之间。因为0042FA79计算账户长度>=4的跳转点以及0042FAFE函数call

0042FA79|> \8D55 F0       lea edx,
0042FA7C|.8B83 DC010000 mov eax,dword ptr ds:
0042FA82|.E8 D1AFFEFF   call Acid_bur.0041AA58            ;获取账户,字符串,字符串首地址存储在EBP-0X10处
0042FA87|.8B45 F0       mov eax,
0042FA8A|.0FB600      movzx eax,byte ptr ds:       ;DWORD DATA = (DWORD)buff;
0042FA8D|.F72D 50174300 imul dword ptr ds:      ;DATA * 0x43175 == DATA * 0x29
0042FA93|.A3 50174300   mov dword ptr ds:,eax   ;0x431750 = DATA * 0x29;
0042FA98|.A1 50174300   mov eax,dword ptr ds:
0042FA9D|.0105 50174300 add dword ptr ds:,eax   ;0x431750 *= 2
0042FAA3|.8D45 FC       lea eax,
0042FAA6|.BA ACFB4200   mov edx,Acid_bur.0042FBAC
0042FAAB|.E8 583CFDFF   call Acid_bur.00403708            ;将CW字符串首地址存储在EBP-0x4处
0042FAB0|.8D45 F8       lea eax,
0042FAB3|.BA B8FB4200   mov edx,Acid_bur.0042FBB8         ;CRACKED
0042FAB8|.E8 4B3CFDFF   call Acid_bur.00403708            ;将字符串地址存储在EBP-0X8处
0042FABD|.FF75 FC       push
0042FAC0|.68 C8FB4200   push Acid_bur.0042FBC8            ;UNICODE "-"
0042FAC5|.8D55 E8       lea edx,
0042FAC8|.A1 50174300   mov eax,dword ptr ds:
0042FACD|.E8 466CFDFF   call Acid_bur.00406718            ;将0x431750存储的十六进制转换成字符串,地址存储在EBP-0x18处
0042FAD2|.FF75 E8       push
0042FAD5|.68 C8FB4200   push Acid_bur.0042FBC8            ;UNICODE "-"
0042FADA|.FF75 F8       push
0042FADD|.8D45 F4       lea eax,
0042FAE0|.BA 05000000   mov edx,0x5
0042FAE5|.E8 C23EFDFF   call Acid_bur.004039AC            ;字符串拼接。(EBP-0X4)+(EBP-0X18)+(EBP-0X8) 存储在ebp-0xC
0042FAEA|.8D55 F0       lea edx,
0042FAED|.8B83 E0010000 mov eax,dword ptr ds:
0042FAF3|.E8 60AFFEFF   call Acid_bur.0041AA58            ;得到输入的密码
0042FAF8|.8B55 F0       mov edx,
0042FAFB|.8B45 F4       mov eax,
0042FAFE|.E8 F93EFDFF   call Acid_bur.004039FC            ;输入的密码与程序计算出来的KEY做比较
0042FB03|.75 1A         jnz XAcid_bur.0042FB1F            ;上一个CALL的返回值不等于0则跳转到错误消息


那么转换成C语言就是

void Decryption(char* mima)
{
    char szBuff;
    unsigned long data = (unsigned long)mima;
    data *= 0X29;
    data *= 2;
    sprintf(szBuff, "CW-%d-CRACKED", data);
    printf("%s \r\n", szBuff);
}


因为在计算KEY中,只使用了用户的第一个字母,后三位没用。所以,账户abcd和aaaa使用的KEY是相同的完毕~~~~~


preety110 发表于 2018-3-16 16:42

file:///C:/Users/XY/Pictures/Saved%20Pictures/11.jpg
我按照楼主的做法,但是在虚拟机里面,这个地方不显示了。
file:///C:/Users/XY/Pictures/Saved%20Pictures/12.jpg

a6133616 发表于 2018-4-12 20:13

我下了MessageBOX的断点后,弹出来了Try Again后 确定了 继续单步走 出了系统领空后 单步往下 到不了你说的那个JNZ。一直在循环runt= = 这是咋回事呢

C文敗類 发表于 2015-8-21 02:46

这根本就看不明白呀。。

Tyler 发表于 2015-8-21 08:18

天清地宁 发表于 2015-8-21 09:51

Tyler 发表于 2015-8-21 08:18
这根本就看不明白呀。。

{:1_903:}不是吧。。

天清地宁 发表于 2015-8-21 09:52

C文敗類 发表于 2015-8-21 02:46
这根本就看不明白呀。。

{:1_903:}不是吧。。

legend菜 发表于 2015-8-21 10:15

楼主真厉害,学习了

天清地宁 发表于 2015-8-21 10:33

legend菜 发表于 2015-8-21 10:15
楼主真厉害,学习了

{:1_907:}问下我写的东西容易看懂么?

plaodj 发表于 2015-8-21 11:10

这个必须要学习谢谢啦

1263468262 发表于 2015-8-21 11:27

看不懂 因为我们英语都不会 这就是原因

helius 发表于 2015-8-21 14:41

页: [1] 2 3
查看完整版本: 160个CrackMe - 001