逆向工程初步160个crackme-------2
有了第一个crackme的经验后,这个crackme用了半个小时就验证成功了。(思路和第一个crackme相似)
动态调试工具:ollydbg (2.10)
文件分析工具:PEID (0.95)
同样我们先来运行一下程序了解一下程序的大致流程,对程序有个大致了解。
让输入用户名和序列号,我们随便输入一个
输入后弹出一个消息框,显示失败提示从新输入的信息。
现在我们对程序有了初步的了解,
思路:我们需要找到在什么位置判断的序列号错误并弹出失败的信息。然后在找到正确的序列号是什么,正确的序列号是在何时产生的以及生成的算法。
在这之前我们先来分析一下文件的信息,利用PEID工具
由信息可知其实VB编写的32位应用程序,现在我们开始对其进行逆向分析。
- 打开OD并运行程序,随便输入用户名和序列号点击确定弹出失败的信息
- 我们需要从弹出失败的窗口入手,往上寻找判断函数(判断序列号是否正确的函数),因此我们需要设置弹出失败消息框的API断点,因为我对VB不了解也不知道其用的什么函数所以就把所有弹出消息框的函数都设置了断点,其在哪个函数入口停止那就是调用的哪个函数。
设置完断点后再次点击“OK”,程序停在了弹出消息框的函数的入口,看eip和栈中函数调用提示信息可知其调用的是MessageBoxIndirect()函数
3. 然后我们在栈中的返回地址上右击选择反汇编跟踪,然后在call调用处(即调用MessageBoxIndirect()函数的位置)下段点,(运行程序并再次点击OK),程序将在此处停止
4. 我们知道判断函数肯定是自己编写的,肯定在用户模块所以我们需要一层一层的往上次函数找,(判断函数肯定不在系统模块),所以我们往call前寻找函数头,然后在往上层调用函数走。
注意一般的函数头都为push ebp | mov ebp,esp
,或者是在最近的一个retn指令下,但是不是说其一定在retn指令下面,一个函数可能包含retn指令。本程序就是其函数头并不一定在最近的rent指令下,此处的xor esi,esi并不是函数头部,其实由retn上面的一条指令跳转到这的,继续往上寻找函数入口。
找到push bp,疑似函数头部在其设置断点之后运行程序并再次点击“OK”,程序停在此处,
然后查看栈中上层函数的返回地址,重复 步骤3和步骤 4,直到返回到用户区()
- 返回到用户区后暂停在调用函数处,此时模块为A!fkayas
而且在注释区发现失败窗口的提示信息(胜利在像我们招手)
6.继续往前 寻找发现成功的信息,并在成功的信息上方看到一条跳转指令和测试指令,而且跳转指令正好跳转到失败的信息处,所以可以得知此处即为判断序列号的正确的位置。
- 找到关键位置之后我们就分析此处的代码
测试指令为test si,si
那么就找出改变esi值的所有指令,逆向分析指令,因为跳转指令为je,所以要想不跳转则ZF位为1,test si,si中的si不为0
,继续往上分析(下面代码倒着分析)
mov esi,eax //所以eax为0
neg esi //因为CF应为0所以此处esi为0
sbb esi,esi //因为esi不能为FFFFFFFFH,所以此处CF位应为0
inc esi //esi不能为0,此处esi不能为FFFFFFFFH
neg esi //因为si不为0,所以此处的esi不能为0
又因为EAX是函数_vbaStrCmp(VB程序字符串比较函数)的返回值,所以_vbaStrCmp比较的两个字符串应相等。在函数调用处下断点(再次运行程序点击OK)
在栈窗口中可以看到两个字符串参数,一个为我们输入的序列号,所以另一个应该为真正的序列号,现在我们要做的就是找到序列号是在哪里产生的,是如何产生的(序列号的算法),
- 我们往上发现字符串连接函数,其中一个参数是“AKA-”正好是正确序列号的开头,所以我们在其调用处设段并运行程序,
运行程序之后程序断到此处,发现其入口参数,其中第二各参数应该是序列号算法得到的,
其值为585234那么我么就从函数头部开始看有没有和585234相关的东西,在函数头下断点(再次运行程序并点击OK),F8单步运行并注意观察各个窗口中的注释信息,一旦发现5885234的信息就暂停运行,
在此处发现5885234的信息,分析前面的代码,动态跟踪此代码块得知
0040240F . 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C]
00402412 . 50 push eax ; /String
00402413 . 8B1A mov ebx,dword ptr ds:[edx] ; |
00402415 . FF15 E4404000 call dword ptr ds:[<&MSVBVM50.__vbaLenBs>; \__vbaLenBstr
;计算出输入用户名的长度,
;eax返回值为用户名的长度
0040241B . 8BF8 mov edi,eax
0040241D . 8B4D E8 mov ecx,dword ptr ss:[ebp-0x18]
00402420 . 69FF FB7C0100 imul edi,edi,0x17CFB
;用户名长度乘以0x17cfb,结果保存到edi中
00402426 . 51 push ecx ; /String
00402427 . 0F80 91020000 jo Afkayas_.004026BE ; |
0040242D . FF15 F8404000 call dword ptr ds:[<&MSVBVM50.#516>] ; \rtcAnsiValueBstr
;将用户名第一个字符的ansi码转化为数值存到ax中
00402433 . 0FBFD0 movsx edx,ax
00402436 . 03FA add edi,edx
;edx=ax
;edi=edi+edx
00402438 . 0F80 80020000 jo Afkayas_.004026BE
0040243E . 57 push edi
0040243F . FF15 E0404000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>; MSVBVM50.__vbaStrI4
00402445 . 8BD0 mov edx,eax
;再把edi的值以asiic的形式存到内存中
最后得序列号算法为:(用户名的长度乘以0x17cfb后,加上第一个字符的asiic值得到的数)与"AKA-"连接组合成序列号,注册机就不写了很简单。
逆向工程初步160个crackme-------2的更多相关文章
- 逆向工程初步160个crackme-------7
这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...
- 逆向工程初步160个crackme-------4
crackme–3因为涉及到浮点数操作以及一些指令和寄存器(由于本人对浮点指令不了解),所以先隔过去分析后面的程序. 工具:1. 按钮事件地址转换工具E2A 2. PEID 3. Ollydbg 首先 ...
- 逆向工程初步160个crackme-------1
放假在家学习的效率真的很低,看完看雪加密解密的前两章就迫不及待的找了几个crackme练习一下,顺便熟悉ollydbg的使用. 工具:exeinfope(查壳工具),ollydbg(2.10版) 1. ...
- 逆向工程初步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全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
- 攻防世界 reverse BABYRE
BABYRE XCTF 4th-WHCTF-2017 int __cdecl main(int argc, const char **argv, const char **envp) { char ...
- python基础之流程控制(1)
一.分支结构:if 判断 1.什么要有if 判断语句? 让计算机可以像人一样根据条件进行判断,并根据判断结果执行相应的流程. 2.基本结构 单分支结构 # 单分支 if 条件1: 代码1 代码2 代码 ...
- 我的xshell配色方案,绿色/护眼/留存/备份
[mycolor] text(bold)=e9e9e9 magenta(bold)=ff00ff text=00ff80 white(bold)=fdf6e3 green=80ff00 red(bol ...
- [GDKOI2021] 提高组 Day 2 总结
[ G D K O I 2021 ] 提 高 组 D a y 2 总 结 不明的感觉今天的题比昨天的简单些,感觉今天爆炸的可能性很低. 嗯,于是乎,就很自信地打完了比赛.然后下午 ...
- [递推]C. 【例题3】数的划分
C . [ 例 题 3 ] 数 的 划 分 C. [例题3]数的划分 C.[例题3]数的划分 题目描述 将整数 n n n 分成 k k k 份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例 ...
- 消息中间件-ActiveMQ
转播给所有订阅这个topic的使用者 package com.study.mq.b7_transaction; import org.apache.activemq.ActiveMQConnectio ...
- DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
DevEco Device Tool迎来了2.1 Beta1,其中的亮点之一是:支持Hi3861开发板的源码在Windows平台编译.带着浓厚的兴趣,第一时间做了一次体验. 首先在官网下载" ...
- 大学四年,总结一套适合小白的Java自学路线和方法
前言篇 大家好,我是bigsai 好久不见,甚是想念,文章同时收录在回车课堂(文底阅读原文可达). 无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班.报班通常太费钱,时间又不 ...
- 10行C++代码实现高性能HTTP服务
前言 是不是觉得C++写个服务太累,但又沉迷于C++的真香性能而无法自拔?作为一个老牌C++程序员(可以看我 github 上十几年前的C++项目:https://github.com/kevwan ...
- os shutil 模块
OS --- 操作系统接口 os.system(command) # 在python中执行系统指令 os.popen(command[, mode[, bufsize]]) #os.popen() 方 ...