abex'crackme #2分析

Crackme下载:链接: https://pan.baidu.com/s/1bzi36Y 密码: 7hgg
1.基础
VB文件特征
abex'crackme #2分析_第1张图片
 
abex'crackme #2分析_第2张图片
 
abex'crackme #2分析_第3张图片
先来波程序截图

abex'crackme #2分析_第4张图片

点击Check后会提示Wrong
abex'crackme #2分析_第5张图片
 
 

 2.分析
 
通过搜索字符串找到比较函数
abex'crackme #2分析_第6张图片
 
找到了错误信息,双击进入,因为需要判断输入是否正确,所以向上拉可以找到条件跳转,以及比较函数
 
abex'crackme #2分析_第7张图片
 
再向上拉可以看到两个push,为传入函数的参数:
 
abex'crackme #2分析_第8张图片
 
 
 
所以SS:[EBP-44]指向的是字符串对象,在栈窗口中可以看到push的参数:
 
选择地址->右键->数据窗口中跟随,可以看到内存中的数据:
abex'crackme #2分析_第9张图片
只有方框标出来的内容会变化
abex'crackme #2分析_第10张图片
 
 
右键菜单->长型->ASCII数据地址,可以把相应字符串显示出来:

abex'crackme #2分析_第11张图片
 
aaaaa是我输入的密码,上面的D5D5D5D5是用来比较的参数,也就是说D5D5D5D5是最终的seria值,输入后提示正确:
abex'crackme #2分析_第12张图片
 
所以name和seria之间存在某种关系,即“以Name为基础生成seria”的算法,下面则需要找到算法
 
因为点击Check后,会调用比较函数,所以这些代码应该属于Check按钮的事件处理程序,向上找后,找到函数开始部分:
abex'crackme #2分析_第13张图片
 
push ebp
mov ebp,esp     这是典型的栈帧代码,所以得知这里就是函数开始部分。
 
比较简单的生成序列号的方法是先读取Name字符串(使用GetWindowText,GetDlgItemText等API),然后进行循环等操作,对字符进行加密(XOR,ADD,SUB等)。
 
预测正确的话,在读取Name后紧接着就是加密代码
 
3.算法代码
 
在第4个CALL处看到了如下代码:
 查看402F8E地址处的代码可知,函数的局部对象SS:[ebp-0x88] 传递进了edx中,而后作为参数压入栈,右键跟随地址,然后将数据窗口变为  长型->ASCII数据地址,更容易观察,然后开始调试,当CALL命令调用完以后,发现数据窗口中存入了Name字符串:
abex'crackme #2分析_第14张图片
 
由此确认这段代码为获取name字符串的代码
 
继续调试遇到循环语句
abex'crackme #2分析_第15张图片
 调试到这里,运行函数,将加密后的值存入ECX寄存器所指的缓冲区域
 
此时栈如下:
 0019F15C则是加密后的密码
 
继续调试,
 这一段是将加密后的密文转为16进制
 
下列代码把生成的字符串连接在一起
 最后执行循环,生成序列号

 



转载于:https://www.cnblogs.com/name1ess/p/7718913.html

你可能感兴趣的:(abex'crackme #2分析)