MD5

MD5属于单向散列算法,加密原理和过程网上都有,再次不再赘述。
但就从逆向工程的角度来看, MD5最显著的特征莫过于他有4个常数用来初始化。因此,在判断加密算法时需要注意是否具有64个常量元素的表(而不是通过四个常数)来判断,MD5常见的变种有3种

1.改变初始话的4个常数

2.改变填充的方法

3.改变Hash变化的处理过程

对是否使用MD5加密需要依靠以上三个方法进一步判断

一段反汇编代码实列

首先,我设置的断点是在调用了GetDlgItemTextA处,也就是输入了用户名和注册码后。在图中明显可以看出0040118B处程序已经获得了用户输入的注册码,下一步自然是对输入的注册码进行进一步的判断。此时可以注意到下面多处调用了jnz判断语句,进一步跟踪,得到

也就是说明前面三个是注册码的基本判断条件,见下图
此时可以得出注册码的格式为xxxx-xxxx-xxxx-xxxx

然后,在下面的004011E0处又有一个调用函数,跟进,如下图
很明显这可能是进行MD5初始化。当然,为了进一步继续验证向下跟进
可以发现,在下面00401203处进行了字符填充
在跟进下面所调用的call函数后,在下面又发现了正弦函数表此时可以断定就是MD5算法了
这是接下来的图在00401236处,这里开始对输入进行了一次处理,然后和MD5计算出来的序列进行比较,再进行strcmp比较两个注册码,这个分析就结束了。

可以干的事情

1.暴力跳转,直接跳过注册

2.分析反汇编,知道了加密算法也知道处理步骤就可以写注册机了

附上程序源码

程序的加密函数:
/*-------------------------------------------------------------*/
/* MD5Hash - MD5计算主函数                                    */
/*-------------------------------------------------------------*/
BOOL CheckSerial(HWND hWnd)
{MD5_CTX context;long dtLength,lsLength;int i;TCHAR szName[MAXINPUTLEN]={0};TCHAR szHash[MAXINPUTLEN]={0};TCHAR szBuffer[MAXINPUTLEN]={0};TCHAR szSerial[MAXINPUTLEN]={0};TCHAR szTeam[]="www.pediy.com";TCHAR szSNtemp[20]={0};TCHAR szBase32[]="23456789ABCDEFGHJKLMNPQRSTUVWXYZ";unsigned int tcTemp=0;dtLength=GetDlgItemText(hWnd, IDC_Name, szName, sizeof(szName)/sizeof(TCHAR)+1);  if (dtLength==0){SetDlgItemText(hWnd, IDC_Serial, "Wrong Serial!");return FALSE;}lsLength=GetDlgItemText(hWnd,IDC_Serial,szSerial,sizeof(szSerial)/sizeof(TCHAR)+1);if (lsLength!=19){SetDlgItemText(hWnd,IDC_Serial,"Wrong Serial!");return FALSE;}if ((szSerial[4]!='-')||(szSerial[9]!='-')||(szSerial[14]!='-')){SetDlgItemText(hWnd,IDC_Serial,"Wrong Serial!");return FALSE;}memcpy(szSNtemp,szSerial,4);memcpy((szSNtemp+4),(szSerial+5),4);memcpy((szSNtemp+8),(szSerial+10),4);memcpy((szSNtemp+12),(szSerial+15),4);MD5Init(&context);MD5Update(&context,szName,dtLength);MD5Update(&context,szTeam,lstrlen(szTeam));MD5Final(szHash, &context);for(i=0;i<16;i++){tcTemp=(unsigned int)szHash[i]%32;szBuffer[i]=szBase32[tcTemp];}if (lstrcmp(szSNtemp,szBuffer)==0){SetDlgItemText(hWnd,IDC_Serial,"Success!");return TRUE;} else{SetDlgItemText(hWnd,IDC_Serial,"Wrong Serial!");return FALSE;}return TRUE;
}
注册机解密函数:
/*-------------------------------------------------------------*/
/* MD5Hash - MD5计算主函数                                    */
/*-------------------------------------------------------------*/
BOOL GenerateSerial(HWND hWnd)
{MD5_CTX context;long dtLength;int i;TCHAR szName[MAXINPUTLEN]={0};TCHAR szHash[MAXINPUTLEN]={0};TCHAR szBuffer[MAXINPUTLEN]={0};TCHAR szTeam[]="www.pediy.com";TCHAR szBase32[]="23456789ABCDEFGHJKLMNPQRSTUVWXYZ";TCHAR szSerial[20]={0};unsigned int tcTemp=0;dtLength=GetDlgItemText(hWnd, IDC_Name, szName, sizeof(szName)/sizeof(TCHAR)+1);  if (dtLength==0){SetDlgItemText(hWnd, IDC_Serial, "please input name");return FALSE;}MD5Init(&context);MD5Update(&context, szName, dtLength);MD5Update(&context,szTeam,lstrlen(szTeam));MD5Final(szHash, &context);for(i=0;i<16;i++){tcTemp=(unsigned int)szHash[i]%32;szBuffer[i]=szBase32[tcTemp];}memcpy(szSerial,szBuffer,4);szSerial[4]='-';memcpy((szSerial+5),(szBuffer+4),4);szSerial[9]='-';memcpy((szSerial+10),(szBuffer+8),4);szSerial[14]='-';memcpy((szSerial+15),(szBuffer+12),4);SetDlgItemText(hWnd, IDC_Serial,szSerial);       return TRUE;
}

小结

1.楼主笔记而已,不严谨之处可以指出。
2.大概这个寒假还会慢慢写233,可以一起学习。
3.都看到这里了,不点个赞再走?0.0

判别加密算法特征----MD5相关推荐

  1. PG口令加密算法从MD5升级到SCRAM-SHA-256

    PG口令加密算法从MD5升级到SCRAM-SHA-256 1.前提条件 确保PG实例版本是10及以上版本. postgres=# select version();version ---------- ...

  2. 加密算法 AES MD5 SHA1

    2019独角兽企业重金招聘Python工程师标准>>> 加密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的 ...

  3. iOS 加密算法之MD5加密使用

    2020.06.04编辑 前言 对于加密算法这个概念我的确不太清楚,虽然我知道加密算法存在的意义,但是这并不妨碍我不知道加密算法具体都有哪些.所以今天这篇文章就是了大家一起学习开发中哪些加密算法. 在 ...

  4. ESP32学习笔记(47)——加密算法AES/MD5/SHA

    一.简介 1.1 SSL SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用 ...

  5. java常用加密算法及MD5的使用

    前言:工作中经常遇到将数据进行各种方式的加密,然后封装到一个自定义的实体类中作为参数进行传输数据.当然这是为了数据在传输过程中的安全保证,不被其他人轻易的就获取到原数据: 首先,加密解密的概念很简单明 ...

  6. 建议使用 Bcrypt加密算法 代替 MD5/SHA1

    前言 为了保障用户的敏感数据安全,通常都会对其进行加密,然后将加密后的数据存入数据库中,例如用户密码,在用户进行登录的时候,将其输入的密码与数据库中存放的密文进行比较,以验证用户密码是否正确. BCr ...

  7. sha java 应用_Java中常用的加密算法应用MD5,SHA,RSA

    1. MD5加密,常用于加密用户名密码,当用户验证时. protected byte[] encrypt(byte[] obj) ...{ try ...{ MessageDigest md5 = M ...

  8. 加密算法之MD5与SAH-1

    示例代码: package com.java.test;import java.security.MessageDigest;public class Demo3 {public static voi ...

  9. 加密算法之MD5算法

    在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组.算法的输出由四个32位分组组成,将它们级联形成一个128位散列值.  首先填充消息使其长度恰好为一个比512 ...

最新文章

  1. Spring boot 集成工作流flowable去掉xml配置
  2. boost::typeindex::runtime_cast相关的测试程序
  3. c#和javascript函数的相互调用(ObjectForScripting 的类必须对 COM 可见。请确认该对象是公共的,或考虑向您的类添加 ComVisible 属性。)...
  4. 全局变量_Python函数中的全局变量与局部变量
  5. AIR3.0针对移动设备的高性能渲染方案
  6. 群体智能之粒子群优化(PSO)
  7. 计算机七年级下册课件ppt课件ppt,七年级音乐下册
  8. 视频转换器如何将视频MKV转换成MP4格式 1
  9. PCB线路板上的电子元件你认识多少?
  10. SVM -支持向量机原理详解与实践之四
  11. element-ui(vue-cli)在ie11中空白页无法显示
  12. 快35了,还在“点点点”?那些入行几年的测试点工后来都怎么样了?
  13. 总结:K8S之pod配置
  14. hadoop中HDFS的NameNode原理
  15. redis中的increment()方法遇到的问题记录
  16. 对计算机系相关人物进行访谈,瑶湖计算机系副主任姚华访谈录
  17. 电脑远程开机控制实现 免拆机安装
  18. 人工智能工具推荐:采集图片神器——后羿采集器
  19. canvas压缩图片或者进行视频抓拍
  20. idea 怎么导入war包,idea怎么打开war包,idea怎么导出一个war包

热门文章

  1. 攻防世界 Crypto高手进阶区 3分题 wtc_rsa_bbq
  2. python实现npy格式文件转换为txt文件
  3. 那个跑外业的同事开始学习考测绘师了
  4. NLP: 0基础应用T5模型进行文本翻译代码实例~
  5. 我的程序员成长之路——回顾自己三年的工作
  6. 联想服务器刀片机型号,ThinkSystem SN550刀片服务器
  7. 笔记本双系统安装Ubuntu 20.04.3 LTS没有WIFI的解决方法
  8. input输入框去除历史记录
  9. 花呗部分用户已接入央行征信系统,快看你被选中了没?
  10. [Android系统开发]Launcher Hotseat图标居中排列