CrackMe爆破与算法分析(一)
[abexcm5]
程序的功能:输入一个序列号,判断序列号是否正确。
爆破
根据错误提示信息,找到执行错误提示的代码段:
做了个比较,相等则出现正确提示。OD修改jcc指令绕过检查。
成功破解
算法分析
GetVolumeInformationA获取所在盘符。与字符串"4562-ABEX"合并。
合并后前4个字节依次加1,循环两次。
再与字符串"L2C-5781"合并,得到正确的序列号
[Acid Bytes2]
程序的功能是比较一个序列号。
IDA发现函数和字符串都很少,PEid查壳,加了upx压缩壳。
脱壳三部曲
寻找OEP
确定原始程序入口OEP在哪
dump内存
保存原始程序入口之后的代码到新的文件
修复文件
恢复dump出来的文件的IAT表
ESP定律法脱壳
加壳程序使用pushad、popad指令保存和恢复初始时寄存器的内容。利用堆栈平衡对esp下硬件断点即可找到原程序入口点。
x64dbg单步执行pushad指令,esp变为红色表示esp被修改。
给地址0018FF6C下硬件断点。
F9执行到断点处,连续F8运行到OEP
x64dbg Scylla插件dump内存到文件
确认OEP为00442E44,点击"dump",保存文件为CrackMe2_dump.exe
x64dbg Scylla修复IAT表
点击"IAT autoSearch",自动检测IAT的偏移量和大小。
点击"Get Imports",分析IAT的结构。
点击"fix dump",选择CrackMe2_dump.exe。
生成脱壳后且IAT重建后的程序CrackMe2_dump_SCY.exe
爆破
调试脱壳后的程序,查找字符串发现正确序列号,输入正确序列号即可破解程序。
算法分析:
简单地比较硬编码字符串
[reg]
注册码共享软件(提供免费试用,但有使用次数,注册后才能正常使用)。输入用户名和注册码,生成带有用户名和注册码的.dll文件。
爆破
根据字符串“未注册”找到关键函数。
函数从.dll文件取出用户名和注册码,调用地址0x45D0F4处的函数。如果返回值为0,跳转到读取“未注册”字符串的代码;返回值为1,执行读取“您的有效期至”字符串的代码。
爆破思路一:
je Reg.0045D58E改成 jne Reg.0045D58E,输入错误的注册码可以通过验证
爆破思路二:
je Reg.0045D58E改成空指令
爆破思路三:
修改比较函数入口0x45D0F4处的指令,使其始终返回1
算法分析:
分析0x45D0F4处的函数:判断注册码长度,判断字符ascii码,调用函数返回真正的注册码。
[ceycey]
输入密码,没有错误提示。点击“about”,显示一段话。
IDA发现函数列表很少。使用PEID查壳,加了UPX壳。
脱壳
ESP定律法找到OEP:004578F4
x64dbg Scylla插件dump出文件并修复IAT。
Ollydbg分析脱壳后的程序
查看出现的字符串,定位到“Easy huh?”字符串所在的代码段,下断点。
爆破
静态分析
目标是让程序弹出“Easy huh?”。
保证jnz short loc_457642这条命令不跳转即可,直接nop掉。
算法分析
算法函数有两个参数。判断两个参数是否为空,都不为空,进入循环,两个参数每次循环四个字节进行比较,如果两个参数全部相等,返回1。
动态分析寄存器可知两个参数分别为输入及正确的密码。正确的密码作为硬编码存在于代码中。