学破解第121天,《160个CrackerMe之004》学习
前言:
从小学到大专(计算机网络技术专业),玩过去的,所以学习成绩惨不忍睹,什么证书也没考,直到找不到工作才后悔,不知道怎么办才好。
2017年12月16日,通过19元注册码注册论坛账号,开始做伸手党,潜水一年多,上来就是找软件。(拿论坛高大上的软件出去装X)
2018年8月某一天,报名了华中科技大学网络教育本科(计算机科学与技术专业)2018级秋季。(开始提升学历)
2019年6月17日,不愿再做小菜鸟一枚,开始零基础学习破解。(感谢小糊涂虫大哥在我刚开始学习脱壳时,录制视频解答我的问题)
2020年7月7日,感谢H大对我的鼓励,拥有了第一篇获得优秀的文章。(接下来希望学习逆向,逆天改命)
坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/thread-1208234-1-1.html
立帖为证!--------记录学习的点点滴滴
0x1分析题目
1.打开软件,就是用户名和注册码的提示
2.没有注册按钮,想想论坛春节红包第二题,估计是一样的套路,要求是下面显示图片就是破解成功
0x2寻找爆破点
1.Delphi程序啊,两个获取文本框输入的API也不能用,Delphi反编译工具也不会用,不管了,吾爱OD在手,在windows上跑的程序,不信还能上天
2.搜字符串,看到了注册成功字样,然后输入用户名和密码,我在哪点确定呢???
3.找不到从哪跳转到注册成功这里的啊,凉凉,爆破都不给机会的吗?
4.我不信windows上跑的程序不吃消息断点,挂上消息断点,全部消息,还真断不下来,算你狠!!!
5.再看看这个窗口视图,为啥断不下来呢?
6.那我就从窗口产生开始下断点吧,找到最顶层的父窗口句柄004204A8 直接F2或者硬件断点,强行断下来从这里开始分析。
7.分析了一大圈,不行了,去找个反编译工具IDR学一学,2小时后,我又回来了,看看下面的截图
8.看看这些事件,单机,双击,keyup,还有chkcode,最终发现文本框的输入改变或会触发chkcode事件,Ctrl+G转到00457C40这里看看
00457C1C . 53 75 6E 20 4>ascii "Sun Bird",0
00457C25 00 db 00
00457C26 00 db 00
00457C27 00 db 00
00457C28 . FFFFFFFF dd FFFFFFFF
00457C2C . 0F000000 dd 0000000F
00457C30 . 64 73 65 6C 6>ascii "dseloffc-012-OK",0
00457C40 /. 55 push ebp
00457C41 |. 8BEC mov ebp,esp
00457C43 |. 51 push ecx
00457C44 |. B9 05000000 mov ecx,0x5
00457C49 |> 6A 00 /push 0x0
00457C4B |. 6A 00 |push 0x0
00457C4D |. 49 |dec ecx
00457C4E |.^ 75 F9 \jnz short CKme.00457C49
9.继续单步跟踪,基本上就能得到我要的信息了
00457C6F |. FFB3 10030000 push dword ptr ds:[ebx+0x310] ; 黑头Sun Bird
00457C75 |. 8D55 F8 lea edx,[local.2]
00457C78 |. 8BC6 mov eax,esi
00457C7A |. E8 85FEFAFF call CKme.00407B04
00457C7F |. FF75 F8 push [local.2] ; 取出了7,输入的用户名长度就是7
00457C82 |. FFB3 14030000 push dword ptr ds:[ebx+0x314] ; dseloffc-012-OK
00457C88 |. 8D55 F4 lea edx,[local.3]
00457C8B |. 8B83 D4020000 mov eax,dword ptr ds:[ebx+0x2D4]
00457C91 |. E8 B2B6FCFF call CKme.00423348
00457C96 |. FF75 F4 push [local.3] ; 52pojie
00457C99 |. 8D83 18030000 lea eax,dword ptr ds:[ebx+0x318]
00457C9F |. BA 04000000 mov edx,0x4
00457CA4 |. E8 93BFFAFF call CKme.00403C3C
00457CA9 |. 33D2 xor edx,edx
00457CAB |. 8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CB1 |. E8 AAB5FCFF call CKme.00423260 ; 把固定字符串和我输入的52pojie拼起来
00457CB6 |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318] ; 黑头Sun Bird7dseloffc-012-OK52pojie
00457CBC |. 8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CC2 |. E8 B1B6FCFF call CKme.00423378
00457CC7 |. 33F6 xor esi,esi
00457CC9 |> 8D55 EC /lea edx,[local.5]
00457CCC |. 8B83 D4020000 |mov eax,dword ptr ds:[ebx+0x2D4]
00457CD2 |. E8 71B6FCFF |call CKme.00423348
00457CD7 |. 8B45 EC |mov eax,[local.5] ; 52pojie
00457CDA |. E8 9DBEFAFF |call CKme.00403B7C
00457CDF |. 83C0 03 |add eax,0x3 ; 用户名长度+3=10
00457CE2 |. 8D55 F0 |lea edx,[local.4]
00457CE5 |. E8 1AFEFAFF |call CKme.00407B04
00457CEA |. FF75 F0 |push [local.4]
00457CED |. 8D55 E8 |lea edx,[local.6]
00457CF0 |. 8B83 D4020000 |mov eax,dword ptr ds:[ebx+0x2D4]
00457CF6 |. E8 4DB6FCFF |call CKme.00423348
00457CFB |. FF75 E8 |push [local.6] ; 52pojie
00457CFE |. 8D55 E4 |lea edx,[local.7]
00457D01 |. 8BC6 |mov eax,esi
00457D03 |. E8 FCFDFAFF |call CKme.00407B04
00457D08 |. FF75 E4 |push [local.7]
00457D0B |. 8D45 FC |lea eax,[local.1]
00457D0E |. BA 03000000 |mov edx,0x3 ; edx = 3
00457D13 |. E8 24BFFAFF |call CKme.00403C3C
00457D18 |. 46 |inc esi ; esi+1
00457D19 |. 83FE 13 |cmp esi,0x13 ; 循环到esi = 0x13,也就是19
00457D1C |.^ 75 AB \jnz short CKme.00457CC9
00457D1E |. 8D55 E0 lea edx,[local.8]
00457D21 |. 8B83 D8020000 mov eax,dword ptr ds:[ebx+0x2D8]
00457D27 |. E8 1CB6FCFF call CKme.00423348
00457D2C |. 8B45 E0 mov eax,[local.8] ; 12345
00457D2F |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318] ; 黑头Sun Bird7dseloffc-012-OK52pojie
0x3分析算法
1.先来个黑盒测试
输入:
52pojie
52pojie1
52pojie12
52pojie123
输出:
黑头Sun Bird12dseloffc-012-OK52pojie
黑头Sun Bird13dseloffc-012-OK52pojie1
黑头Sun Bird14dseloffc-012-OK52pojie12
黑头Sun Bird15dseloffc-012-OK52pojie123
2.结合上面的分析代码,可以猜出黑头Sun Bird + 用户名长度 + 5 + dseloffc-012-OK + 用户名就是密码。
3.但是鼠标单击之后,图片还是不显示?最后参考其他大佬的文章,看到了要先双击,然后单击才能显示图片。
4.如果只是爆破的话,只需要把这个关键跳nop掉(右键搜索注册成功字样就能看到),然后单击就能直接显示图片了。
00458031 |. 81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85
0045803B |. 75 76 jnz short CKme.004580B3
0x4注册机的编写
1.算法部分:
黑头Sun Bird + 用户名长度 + 5 + dseloffc-012-OK + 用户名得到注册码
2.代码实现:
package cpyutil.xiao.cai.niao.com;
import java.util.Scanner;
public class Register {
public static void main(String[] args) {
String name;
int code;
String serial;
System.out.println("请输入name(不小于4个字符):");
Scanner sc = new Scanner(System.in);// 初始化一个输入流
name = sc.nextLine();// 从控制台读取输入的字符串
if (name == null || name.length() < 4)// 如果输入的长度小于4退出程序
System.exit(0);
sc.close();// 关闭输入流
code = name.length() * 0x15B38;//将字符串的长度乘以0x15B38
code += name.charAt(0);//加上第一个字符
code += 2;//加2
code *= 3;//乘3
code -= 2;//减2
code -= -15;//减-15
// 将数值转换成字符串
serial = String.valueOf(code);
// 输出正确的serial
System.out.println("生成的serial:");
System.out.println(serial);
}
}
输出结果:
请输入用户名:
52pojie12
注册码:
黑头Sun Bird14dseloffc-012-OK52pojie12
3.验证注册机的效果,输入52pojie12和黑头Sun Bird14dseloffc-012-OK52pojie12,成功显示照片。
0x5总结
1.这个出照片的过程我是真的猜不到,要先点击两次再单击一次
2.注册码的算法和前面差不多,并不难,就是用户名好像只能是数字开头一样。
3.通过IDR找出的事件地址再去下断点果然好多了。
PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!