首页 > 其他 > 详细

CrackMe_001

时间:2019-09-22 21:19:24      阅读:108      评论:0      收藏:0      [点我收藏+]

解压文件,首先熟悉程序的功能与需求:

第一步:打开软件有一个nag窗口,嗯,这个是要去掉的(都让你kill了,这么贱的要求,就满足他吧)

技术分享图片

 然后是主要界面,注册,退出

技术分享图片

 两个功能都是一样的,都是注册的意思,这是我们要完成的(main 目标)

技术分享图片

 

 技术分享图片

没有其他的需求了,点击Exit和x都没有nag窗口。

第二步:查壳与脱壳

没有壳,Delohi编写

技术分享图片

 

第三步:破解

载入OD,通过查找字符串,看到nag窗口的文字

技术分享图片

 

双击字符串,找到位置,发现这是一个函数,应该就是那个窗体函数了,

技术分享图片

下断,运行,retn后回到call函数下方,nop掉刚刚的函数,导出。运行一下,nag已经去掉。

技术分享图片

 

 

验证部分:

第一种:爆破

找到字符串,查看对应位置

技术分享图片

 

可以看到,失败和成功之间有一个jnz判断,只要不实现跳转,那么就是成功

 技术分享图片

 

 所以,直接nop掉这个jnz的判断语句,那么就成功爆破了。

技术分享图片

 

 同样的,后面的校验也是如此:

找到这个位置,nop掉对应的jnz判断

技术分享图片

 

然后保存并导出,3.0版本已经完全爆破成功。

 技术分享图片

 

 

然而,不会写注册机的逆向不是一个好的逆向,所以,得看看注册码的加密方式。

方法二:逆向算法

菜鸡看了大佬的wp, https://www.52pojie.cn/thread-264393-1-1.html

找到判断验证的位置,下断并运行一下,能看到堆栈和系统的备注信息:

技术分享图片

 

可以通过结果和注释,能够猜测,注册码应该是CW-XXXX-CRACKED,然后再重新运行一次,寻找XXXX的加密方式,找到了call 0x00406718这个位置,应该是注册码产生的地方

技术分享图片

 

 跟进以后,有点儿绕,汇编没学好Orz,看了一下其他人的wp(https://www.52pojie.cn/thread-264393-1-1.html),发现加密方式在上面!!!

技术分享图片

 

 先取第一位数转换为十六进制,然后乘上0x29,再自加,最后转换为十进制。唔。。。。。那么call 0x00406718的作用应该是循环调用之前的步骤吗?!dalao好像没有说Orz

最后是注册机:

技术分享图片
 1 // CrackMe160.cpp : 定义控制台应用程序的入口点。
 2 // NameSerial部分
 3   
 4 #include "stdafx.h"
 5 #include "iostream"
 6   
 7 int _tmain(int argc, _TCHAR* argv[])
 8 {
 9     printf("Input Name:\r\n");
10     // 取第一个字符值
11     int cName = getchar();
12     if ( cName > 0x21) // 只处理可见字符
13     {
14         cName *= 0x29; // 乘法
15         cName *= 2; // 自增一倍
16         printf("Serial: CW-%4d-CRACKED\r\n",cName);
17     }else{
18         printf("input error!\r\n");
19     }
20     system("pause");
21     return 0;
22 }
注册码

唔。。。好像没啥问题。

后面一个注册:

这个不难,找到调用的位置,查看栈段就能看到:

技术分享图片

 

 是Hello Dude!与我们的输入进行比较!

技术分享图片

 

 

总结:菜鸡的crackme001完成了,还是汇编太菜了。

 

CrackMe_001

原文:https://www.cnblogs.com/yidianhan/p/11560403.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!