逆向工程初步160个crackme-------1
放假在家学习的效率真的很低,看完看雪加密解密的前两章就迫不及待的找了几个crackme练习一下,顺便熟悉ollydbg的使用。
工具:exeinfope(查壳工具),ollydbg(2.10版)
1.同样先运行一下程序,看看其具体操作并大致了解一下其程序流程
运行程序后出现弹出一个消息框(提示信息),点击确定后又弹出一个对话框
这应该是是程序的主窗口,点击exit是退出,我们点
击一下最左边的按钮,弹出一个对话框,让输入名字和序列号
我们随便输入一个点击check it baby后弹出消息框
点击确定后其让再次输入。
现在我们了解了程序的基本流程
我们就从最后弹出的消息框入手
思路:那么一定是在判断序列号是否正确之后选择弹出正确或者不正确的消息框,弹出消息框的API为MessageBoxA或MessageBoxW,现在打开OD并打开程序,
设置完断点后运行程序,直到到达第二次断点处(注意程序会停两次,因为其程序一开始也弹出一个消息框,设置完断点后其在弹出时也会停下)
我们在右下角堆栈窗口里可以看到messagebox的调用信息和参数,由于我们是随便写的序列号所以可以看到其MessageBox的参数为失败的信息,我们需要找到在哪判断的失败并调用弹出失败的信息,
我们需要返回上层调用(即谁调用的messagebox)
根据堆栈信息的得知在0042A1AE处为返回地址,所以在反汇编窗口中ctry+g,搜索0042a1ae并转到代码处
分析此处代码到最近的函数头部(push bp ,mov bp,sp 一般都为函数入口)发现其并无条件转移指令和判断信息,只是一些api调用语句所以我们在函数头部下个断点,在往上层调用寻找(再次点击check)运行后其会停在刚刚下的断点处
观察堆栈找出返回地址并右击鼠标,选择反汇编窗口跟随,反汇编窗口显示上层调用的反汇编代码,红色标志的call为刚刚函数的调用语句,
我们发现了弹出消息窗口的提示信息,有成功和不成功两块,分析找到在成功与不成功信息上方,最近的一条转移语句,分析这条语句得出如果执行则跳到失败语句块,如果不执行则跳到成功语句块,其上方还有一个call语句,此call语句为关键判断序列号是否正确,且因为是jne转移指令所以当zf位为0时才能执行成功的代码块。在call处下段(再次点击check),程序会断在此call语句
F7单步步进此call语句进入判断函数,分析从开头到retn返回指令之间的反汇编语句,f7单步执行分析
反复调试此段程序后发现, 只有当edi和esi指向的字符串相等时才能使ZF位为0,程序开头发现esi指向"CW-4100-CRACKED",
edi指向"121212"为一开始输入的序列号。
我们关闭OD运行程序把刚才的用户名和得到真正的序列号"CW-4100-CRACKED"输入弹出成功的消息框正准备高兴的时候试试序列号是否唯一,换个用户名之后发现此序列号不对,
再打开OD运行程序,输入新的用户名:进入判断函数后发现esi指向的序列号变了
说明不同的用户对应不同的序列号,md在分析
查看esi指向的内存块往上分析看其实何时发生变化的,(再次点击chack),
程序停在判断函数的调用语句,观察数据窗口发现序列号已经产生往上分析,
找到函数头(函数入口)下断点。(再次chack)
程序停在函数入口位置,F8单步步过运行,并观察数据窗口,正确序列号存储位置什么时候发生变化,
F8。。。。当在执行完一条call指令后数据窗口序列号存储发生变化,正确序列号出现
说明此call指令产生正确的序列号,在此call指令处下断(再次chack)单步进入此call
发现此时正确序列号还没产生,在F8运行并观察数据窗口,前面我们发现所有的序列号都是就中间四位不一样而其余字母都一样,当数据窗口中的中间四位产生时我们发现在寄存器窗口出现中间四位字符的存储地址!
我们在数据窗口搜索此地址并分析其是什么时候产生的。
(再次chack),观察数据窗口什么时候产生这四个字符
在执行完一个call之后产生中间四个字符,在此call下断(再次点击chack,并进入call)
再F8并观察数据窗口,
执行完call Aci_bur.004006fc0后产生四个字符,所以再次在此call处下断(点击chack并进入此call),
在F8单步执行,并观察数据窗口看四个字符什么时候产生
在执行和上面一样的步骤,进入call,
在进call
发现在此处字符产生,分析此处代码
std
rep movs dword ptr es:[edi],dword ptr ds:[esi]
得其把edi所指的数据传到esi,而esi正好为产生四个正确字符的地址,而edi为0019e64a,继续追踪此地址,(在数据窗口跟踪0019e64a地址)步骤和前面一样,
就这样反复调试,执行到其地址处数据开始变化为止
分析此处代码,
rep movs byte ptr es:[edi],byte ptr ds:[esi]
此代码把0019e5d8处的字符传到正确的序列号处,所以在跟踪0019e5d8
还重复上述步骤,
执行此处代码时0019e5d8的序列号字符产生,分析此处代码
此为一个循环,把eax循环除10得到的余数以asiic的形式存到0019e5d8处,所以要跟踪eax的值看eax,
把断点定到循环体上方,(再chack),
当停在函数上方时eax==0x10fa,往上跟踪看eax什么时候变成0x10fa的当运行到mov eax,dword ptr ds:[esi]时,eax变成0x10fa,是esi所指的数据,esi的值为0019f658,
按照上面的方法继续在数据窗口中跟踪,
当运行到此处时0019f658变为0x10fa
由mov dword ptr ss:[esp+0x4],eax语句可知是eax传给的它,所以在往上跟踪eax看其什么时候变为0x10fa
当其执行到此处时eax变为0x10fa,
由mov eax,dword ptr ds:[0x431750]语句可得
是0x431750地址处的数据传给了eax,
所以在追踪0x431750
执行到此处是0x431750内的数据变为0x10fa
观察此处代码发现其实将ebx+0x1dc地址的数据乘以0x431750内的数据后,0x431750内的数据在翻倍,在第一条语句设断点调试此语句块,
ebx+0x1dc ==eax,又因为eax指向输入的用户名所以
是用用户名的第一个字符与0x431750相乘,
0x431750中的数据为0x29
最后得:把用户名的第一个字符与0x29相乘后得到的数据
就是序列号中间四个字符,其余字符固定CW-****-CRACKED
(分析一大圈,进去又出来发现序列号算法这莫简单,就是有点难找到算法的位置)
右边按钮分析过程与左边类似,只不过其序列号固定,只需要进入判断函数中就能得到
序列号为Hello Dude!
总结:在调试程序利用结果索因,“错找出何时(代码位置)何地(数据位置)开始错的”,例如序列号错误,什么位置判断错误的,出现正确的序列号,数据在内存哪又是在什么时候出现的。
合理利用F8宏观追踪,F7缩小追踪范围,提高调试效率。
逆向工程初步160个crackme-------1的更多相关文章
- 逆向工程初步160个crackme-------2
有了第一个crackme的经验后,这个crackme用了半个小时就验证成功了.(思路和第一个crackme相似) 动态调试工具:ollydbg (2.10) 文件分析工具:PEID (0.95) 同样 ...
- 逆向工程初步160个crackme-------7
这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...
- 逆向工程初步160个crackme-------4
crackme–3因为涉及到浮点数操作以及一些指令和寄存器(由于本人对浮点指令不了解),所以先隔过去分析后面的程序. 工具:1. 按钮事件地址转换工具E2A 2. PEID 3. Ollydbg 首先 ...
- 逆向工程初步160个crackme-------3
这个Crackme3 涉及到浮点指令以及浮点数的存储与运算,我没学习过浮点指令,不得不从网上恶补了1个小时,一边看汇编指令一边百度其指令含义. 回头得好好补补这方面的知识了,太菜了! 我大致了解了一下 ...
- 逆向工程初步160个crackme-------6
工具:1. 按钮事件地址转换器E2A 2. PEID 3. Ollydbg 同样我们先来运行一下这个程序, ok按钮是被禁用的,有一个help按钮点击后弹出一个消息框:消息框显示提示信息为.本程序需要 ...
- [反汇编练习]160个CrackMe之001
[反汇编练习] 160个CrackMe之001. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之027
[反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之026
[反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之025
[反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
- Harry And Magic Box HDU - 5155
题目链接:https://vjudge.net/problem/HDU-5155#author=0 题意:在一个n*m的方格中要满足每一行每一列至少有一个珠宝,问总共有多少种方案. 思路:利用递推的思 ...
- codefoces B - Phoenix and Beauty
原题链接:https://codeforc.es/problemset/problem/1348/B 题意:告诉我们一个数组及其长度和k,判断是否可以构造一个新数组使得每K段长度和都相等. 思路:首先 ...
- 攻防世界 reverse SignIn
SignIn 2019_SUCTF __int64 __fastcall main(__int64 a1, char **a2, char **a3) { char mod; // [rsp+0 ...
- 闲来无事,在微信推文中看到一个炫酷的具有动态特效的中国地图,是用R语言做的,于是尝试了一下
目录 最终的效果图如下: 1.环境准备 2.需要安装的包: 3.进一步配置: end 最终的效果图如下: 1.环境准备 既然是用R语言作图,那么这几个软件是一定需要安装的: R语言的编译器:https ...
- Android Studio 之 EditText
EditText 简介 •简介 EditText是一个非常重要的组件,可以说它是用户和Android应用进行数据传输窗户: 有了它就等于有了一扇和Android应用传输的门,通过它用户可以把数据传给A ...
- 自动QQ邮箱发送邮件
语言:python 参考:https://www.runoob.com/python/python-email.html 前提: 1.QQ邮箱开启了SMTP服务 2.生成了授权码,这个授权码将作为自己 ...
- [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.1 Bode图回顾
8.0 序 工程设计过程主要包括以下几个过程: 1.定义规格与其他设计目标 2.提出一个电路.这是一个创造性的过程,需要利用工程师的实际见识和经验. 3.对电路进行建模.变换器的功率级建模方法已经在第 ...
- python 开发环境安装(最全最完整)
一.下载安装包 Windows64 位电脑安装 Python,浏览器的地址栏访问: https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64 ...
- 敏捷史话(十四):敏捷之峰的攀登者 —— Jim Highsmith
"我们希望,一起组成的敏捷联盟能够帮助到其他同行,帮他们用新的更'敏捷'的方式去思考软件开发.方法论和组织.做到这一点,我们就得偿所愿了."Jim Highsmith 在雪鸟会议结 ...
- 翻译:《实用的Python编程》09_02_Third_party
目录 | 上一节 (9.1 包) | 下一节 (9.3 版本分发) 9.2 第三方模块 Python 拥有一个包含各种内置模块的大型库(自带电池(batteries included))(译注:&qu ...