CrackMe_001
解压文件,首先熟悉程序的功能与需求:
第一步:打开软件有一个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完成了,还是汇编太菜了。
原文地址:https://www.cnblogs.com/yidianhan/p/11560403.html
- 用Pandas在Python中可视化机器学习数据
- Intent 属性详解(下)
- 把复杂json解析成javabean思路:思路:
- Python数据科学计算库的安装和numpy简单
- 4G安全:研究人员发现攻击4G无线上网卡和SIM卡的方法
- Python文学化编程 - Jupyter notebook使用和插件拓展
- PoisonCake(毒蛋糕):内置于手机ROM的恶意代码模块
- Spring+SpringMVC+MyBatis整合
- Python之numpy数组学习(五)——广播
- WordPress再悲剧:WPcache-Blogger感染事件影响五万WordPress网站
- 浅谈神经机器翻译
- 窃取Facebook用户信息:利用Android同源策略漏洞的恶意应用被发现
- 关于React Native 安卓首屏白屏优化
- 浅谈spring security 403机制一、无权限访问二、匿名访问三、有权限访问原因机制指定AccessDeniedHandler指定error-page情景原因结论
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Tree - 129. Sum Root to Leaf Numbers
- Tree - 113. Path Sum II
- DFS&BFS - 200. Number of Islands
- Backtracking - 93. Restore IP Addresses
- Backtracking - 17. Letter Combinations of a Phone Number
- Backtracking - 60. Permutation Sequence
- Backtracking - 47. Permutations II
- Backtracking - 46. Permutations
- Dynamic Programming - 377. Combination Sum IV
- Backtracking - 216. Combination Sum III
- Backtracking - 40. Combination Sum II
- Backtracking - 39. Combination Sum
- Backtracking - 77. Combinations
- Backtracking - 90. Subsets II
- Backtracking - 78. Subsets