怕猪猪与逆向 发表于 2020-8-9 09:47

难度颇高的CrackMe,分析了半天终于搞定了分析给大佬们试试

这个程序差点搞的我自闭,绕来绕去,被虐的体无完肤的时候,终于日回去了,总共修改了三处,过程下午贴出来,先观摩下大佬的分享过程,让菜鸡学习下。

solly 发表于 2020-8-11 01:08

这个crackme每次会生成随机的账号名和密码,首先要固定一下账号名和密码,不然就只能用内存注册机了。
固定账号名和密码只要改一条指令:RDTSC,在如下位置:
00401737/$55                push ebp
00401738|.8BEC            mov ebp,esp
0040173A|.51                push ecx
0040173B|.52                push edx
0040173C      33C0            xor eax,eax                              ;破解位置: 由 rdtsc(0F 31) 改成 xor eax, eax (33C0)后,输入字符全部固定为大写的 M
0040173E|.69C0 FD430300   imul eax,eax,0x343FD                     ;214013
00401744|.05 C39E2600       add eax,0x269EC3                         ;2531011
00401749|.C1E8 10         shr eax,0x10                           ;hiword()
0040174C|.25 FF7F0000       and eax,0x7FFF                           ;15914
00401751|.8B4D 10         mov ecx,                        ;'z'
00401754|.85C9            test ecx,ecx
00401756|.75 05             jnz short Ye_CM1_5.0040175D
00401758|.B9 FFFFFF7F       mov ecx,0x7FFFFFFF
0040175D|>2B4D 08         sub ecx,                        ;'z'-'a'
00401760|.41                inc ecx                                  ;26
00401761|.33D2            xor edx,edx
00401763|.F7F1            div ecx
00401765|.0355 08         add edx,                        ;(15914 % 26) + 'a'
00401768|.8BC2            mov eax,edx
0040176A|.5A                pop edx
0040176B|.59                pop ecx
0040176C|.8BE5            mov esp,ebp
0040176E|.5D                pop ebp
0040176F\.C2 1000         retn 0x10


然后在账号中输入16个大写 M,密码中输入 32 个 M 就可以成功了。

初始化的账号和密码的编码方式説明:
以账号 MMMMMMMMMMMMMMMM 为例説明,将字符 M 取 ASCII 码:0x4D, 异或 0x10,即 0x4D xor 0x10,得到 0x5D,转换成16进制字符串:“5D",这样16个M就是 "5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D",然后再加上9个字符,这9个字符是 MD5("666")中的第3到11字符,为:”E0B27C451“ ,组成 "5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5DE0B27C451",这就是程序初始化好的账号名,密码只是由32个M编码后组成的,后面也是加的"E0B27C451"组成:"5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5DE0B27C451"。但在界面输入的没有编码的原始字符,即账号是16个M组成,密码是32个M组成。

怕猪猪与逆向 发表于 2020-8-9 23:11

什么鬼,怎么看不到回复评论?

李道臣 发表于 2020-8-10 00:08



看了画眉的视频才搞定的,但是依然不知道啥原理!还是lz列害。{:1_907:}

李喔 发表于 2020-8-10 09:24

列还厉害!!!!!!

Man_Sir_Chen 发表于 2020-8-10 09:52

列还厉害

vlks 发表于 2020-8-10 10:02

一直苦于没有练习的目标啊,谢谢大佬。

N30 发表于 2020-8-10 11:43

嗯嗯嗯,来看看,

Joky 发表于 2020-8-10 12:01

小白一个,求楼主发一下教程!谢谢。
字符串搜索,易语言按钮特征码,API都试过了 找不到。

怕猪猪与逆向 发表于 2020-8-10 13:00

粗略谈下这个程序的分析过程

为什么返回固定key还是不成功了,因为初始窗口过程前还会调用一个call来初始化全局变量并存放对应的真key
所以返回固定key修改完,保存到文件,然后重新运行你会发现成功了
如果是一步步修改的,先修改返回固定key,然后修改=返回的固定key =返回固定的key 然后运行就成功了,


总结,这个程序大概思路是先初始化存放真全局变量key,然后通过线程混淆跟踪,还有就是全局标记是跟执行过程息息相关的,环环相扣,防止别人直接nop或jmp过程,只有这些全局标记的值都是正确的才会跳转到成功,不然就算载入窗口显示的还是失败!

怕猪猪与逆向 发表于 2020-8-10 13:02

这是比窗口初始化还早的调用,可能是hook也可能是易语言自带的全局变量初始化过程
页: [1] 2
查看完整版本: 难度颇高的CrackMe,分析了半天终于搞定了分析给大佬们试试