【文章标题】: 日期限制的简单暴破
【文章作者】: 范晨鹏
【作者邮箱】: [email]p_168@163.com[/email]
【作者主页】:
09bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8A6P5h3I4S2j5W2)9J5k6h3y4F1j5X3I4G2k6%4y4Q4x3X3g2U0L8$3@1`.
【作者QQ号】: 109427716
【软件名称】: mstMD5汉化版
【软件大小】: 很小
【下载地址】:
afdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4X3i4K6u0W2L8$3&6D9K9h3&6W2k6r3!0%4L8W2)9J5k6h3&6W2N6q4)9J5c8Y4y4G2k6Y4c8Q4x3V1j5@1x3K6p5J5x3g2)9J5k6h3S2@1L8b7`.`.
【加壳方式】: 没加
【保护方式】: 什么是保护方式?
【编写语言】: vc7
【使用工具】: OllyICE
【操作平台】: windows
【软件介绍】: 一个查看MD5值的小东东
【作者声明】: 菜鸟也不易!
--------------------------------------------------------------------------------
【详细过程】
载入程序。
按“ctrl+F8”,程序跑起来了,屏幕哗哗地翻动。一会儿,不动了。蓝色的光标停在了下面一行。
00402FD4 . E8 FD600100 call 004190D6
程序弹出了“本程序已经过期”的提示。
简单的暴破,就是修改跳转。程序的正常执行流程是:检查注册码,正确,则程序正常执行;错误,则执行错误提示。
我们要做的,就是把它改成:检查注册码,正确,则程序正常执行;错误,则程序正常执行。
往上几行,寻找跳转。离0x00402FD4这一行最近的一个跳转是:
00402FAD . /76 46
jbe short 00402FF5
jbe的意思是“若小于则跳转”。写程序的人的话来说,就是:如果还没有到期,就跳到正常执行的流程上;否则,就一条道走到黑。(提示过期并退出)。
还记得爆破无敌口诀吧?“一条(跳)就胡,一饼(EB)伺候”--如果这里一跳就能胜利,那就把这里改成EB(绝对跳转jmp)。
好。我们改一下下。在jbe这里双击,弹出“汇编于此处”的窗口。把jbe改成jmp。后面的数字不动。点“汇编”。这就改好了。关闭“汇编于此处”窗口。这时00402FAD这一行变成了红色
00402FAD /
EB 46
jmp short 00402FF5
然后把文件保存了即可:右键,“复制到可执行文件”-->“选择”,弹出“文件”窗口,不用仔细看,直接点"×"关闭窗口,OllyICE会提示你保存文件。点“是”。
好了,看程序是不是不可以正常执行了?
收工!
--------------------------------------------------------------------------------
有问题?
1、Ctrl+F8是什么意思?
自动步过。
2、什么是“步入”、“步过”、“执行到返回”?
OllyICE是我们的“眼线”,它监视程序的一举一动并按要求向我们汇报。“步入”就是程序走每一步都要报告。“步过”就是擤鼻涕擦脸这些事就不汇报了。“执行到返回”,就是它只汇报程序“刚刚完成一项工作”。
程序的执行过程:
main->code->call-┐ ┌-code->call-┐ ┌-code->exit
│ │ │ │
└code->ret->┘ └code->ret->┘
“步入”监视的内容:
同上。
“步过”监视的内容:
main->code---------------code-------------code->exit
“执行到返回”监视的内容:
main--------┐ ┌--------┐ ┌---->exit
│ │ │ │
└--->ret->┘ └--->ret->┘
上图中,main表示程序开始执行,code表示程序代码/指令,call表示函数调用,ret表示函数执行完毕。exit表示程序执行完毕。
上面,每一个有文字的地方,OllyICE都会执行一次停顿,以使我们有机会查看程序在干什么。
3、解释一下下面这段代码:
00402F9F . FF75 E8 push dword ptr [ebp-18]
00402FA2 . E8 93380000 call 0040683A
00402FA7 . 3D D6193201 cmp eax, 13219D6
00402FAC . 59 pop ecx
00402FAD . 76 46 jbe short 00402FF5
//这是我们修改跳转的那一行
00402FAF . E8 69470100 call 0041771D
00402FB4 . 8B10 mov edx, dword ptr [eax]
00402FB6 . 8BC8 mov ecx, eax
00402FB8 . FF52 0C call dword ptr [edx+C]
00402FBB . 83C0 10 add eax, 10
00402FBE . 8945 F0 mov dword ptr [ebp-10], eax
00402FC1 . 6A 66 push 66
00402FC3 . 8D4D F0 lea ecx, dword ptr [ebp-10]
00402FC6 . C645 FC 03 mov byte ptr [ebp-4], 3
00402FCA . E8 DCF6FFFF call 004026AB
00402FCF . 53 push ebx
00402FD0 . 53 push ebx
00402FD1 . FF75 F0 push dword ptr [ebp-10]
00402FD4 . E8 FD600100 call 004190D6
//程序在这里弹出了“过期”的提示
……
00402FF5 > \51 push ecx
//从这里以后,程序就正常执行了
00402FF6 . 8BCC mov ecx, esp
00402FF8 . 8965 EC mov dword ptr [ebp-14], esp
……
答:从00402F9F 到 00402FAD 是日期比较模块,00402FAF到00402FF4是提示过期的模块。00402FF5以后是程序主模块。所以,从00402F9F 到 00402FAD 是重点
00402F9F . FF75 E8 push dword ptr [ebp-18]
//将内存ebp-18的地址压栈。ebp-18保存的是系统时间20070517
00402FA2 . E8 93380000 call 0040683A
//调用日期处理函数,这个函数把字符串20070517(系统时间)变为int类型,并保存到寄存器eax里
00402FA7 . 3D D6193201 cmp eax, 13219D6
//将eax和 20060630比较大小。13219D6是 20060630的十六进制形式。
00402FAC . 59 pop ecx
// 比较完了,将[ebp-18]出栈
00402FAD . 76 46 jbe short 00402FF5
//若小于,则跳转到正常执行的模块
00402FAF . E8 69470100 call 0041771D
//沦落到这一步,则只能一条道走到黑。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的[Bgcolor=red]完整[/Bgcolor], 谢谢!
2007年05月18日 9:32:05
[培训]科锐逆向工程师培训第53期2025年7月8日开班!