004/160 CrackMe ajj CKme

分析

可以通过搜索字符串的方式找到 “恭喜恭喜!注册成功” 的提示
在关键跳转上面打断点,输入一组假的 Name Serial 测试
发现点击图片框时程序会停在断点,说明图片框和按钮作用相同
直接 nop 掉关键跳转即可完成爆破,下面再研究一下注册机

004/160 CrackMe ajj CKme_第1张图片

注册机算法分析

分析上面的代码,但是看不出来注册码是怎么算出来的
甚至也找不到正确的注册码
004/160 CrackMe ajj CKme_第2张图片
查一下发现是 Delphi写的004/160 CrackMe ajj CKme_第3张图片
那么可以用 Delphi Decompiler 试一下
发现三个有关函数 chkcodePanel1ClickPanel1DblClick
chkcode 的位置在 0x00457C40,回到 OD 下断点试试
004/160 CrackMe ajj CKme_第4张图片
在 OD 里找到对应的位置,上面还有一些奇奇怪怪的字符串
下完断点在注册码里每输入一个字符都会触发一次断点
说明注册码的正确性应该是在输入过程中进行判断的
004/160 CrackMe ajj CKme_第5张图片
果然,注册码的生成就在 chkcode 这部分
在输入注册码过程中判断是否正确,再点图片框显示图片
最终注册码为 "黑头Sun Bird" + [注册码长度+5] + "dseloffc-012-OK" + [用户名]
004/160 CrackMe ajj CKme_第6张图片
粘贴进去试试:
004/160 CrackMe ajj CKme_第7张图片
这个时候你会发现输入注册码以后需要点好几下才能显示注册成功的图片
想起刚才看到的 Panel1ClickPanel1DblClick 两个函数
在 IDA 里对反编译这两个函数就会发现
输入注册码之后还需要 先双击再单击图片框 才能显示图片
下图对比 IDA 中单击和双击和两个函数
左侧为单击事件,右侧为双击事件
004/160 CrackMe ajj CKme_第8张图片
C语言注册机:
简单粗暴,终于不用像前两个CM一样考虑中文了,感动ing

#include 
#include 

//英文 
int main()
{
	unsigned char username[200];
	scanf("%s",username);
	printf("黑头Sun Bird%ddseloffc-012-OK%s",strlen(username)+5,username);
	return 0;
}

注册效果:
004/160 CrackMe ajj CKme_第9张图片

你可能感兴趣的:(CTF,#,Reverse)