有了第一个crackme的经验后,这个crackme用了半个小时就验证成功了。(思路和第一个crackme相似)

动态调试工具:ollydbg (2.10)

文件分析工具:PEID (0.95)

同样我们先来运行一下程序了解一下程序的大致流程,对程序有个大致了解。

让输入用户名和序列号,我们随便输入一个

输入后弹出一个消息框,显示失败提示从新输入的信息。

现在我们对程序有了初步的了解,

思路:我们需要找到在什么位置判断的序列号错误并弹出失败的信息。然后在找到正确的序列号是什么,正确的序列号是在何时产生的以及生成的算法。

在这之前我们先来分析一下文件的信息,利用PEID工具

由信息可知其实VB编写的32位应用程序,现在我们开始对其进行逆向分析。

  1. 打开OD并运行程序,随便输入用户名和序列号点击确定弹出失败的信息
  2. 我们需要从弹出失败的窗口入手,往上寻找判断函数(判断序列号是否正确的函数),因此我们需要设置弹出失败消息框的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,直到返回到用户区()

  1. 返回到用户区后暂停在调用函数处,此时模块为A!fkayas

    而且在注释区发现失败窗口的提示信息(胜利在像我们招手)



    6.继续往前 寻找发现成功的信息,并在成功的信息上方看到一条跳转指令和测试指令,而且跳转指令正好跳转到失败的信息处,所以可以得知此处即为判断序列号的正确的位置。

  2. 找到关键位置之后我们就分析此处的代码

    测试指令为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)



在栈窗口中可以看到两个字符串参数,一个为我们输入的序列号,所以另一个应该为真正的序列号,现在我们要做的就是找到序列号是在哪里产生的,是如何产生的(序列号的算法),

  1. 我们往上发现字符串连接函数,其中一个参数是“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的更多相关文章

  1. 逆向工程初步160个crackme-------7

    这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...

  2. 逆向工程初步160个crackme-------4

    crackme–3因为涉及到浮点数操作以及一些指令和寄存器(由于本人对浮点指令不了解),所以先隔过去分析后面的程序. 工具:1. 按钮事件地址转换工具E2A 2. PEID 3. Ollydbg 首先 ...

  3. 逆向工程初步160个crackme-------1

    放假在家学习的效率真的很低,看完看雪加密解密的前两章就迫不及待的找了几个crackme练习一下,顺便熟悉ollydbg的使用. 工具:exeinfope(查壳工具),ollydbg(2.10版) 1. ...

  4. 逆向工程初步160个crackme-------3

    这个Crackme3 涉及到浮点指令以及浮点数的存储与运算,我没学习过浮点指令,不得不从网上恶补了1个小时,一边看汇编指令一边百度其指令含义. 回头得好好补补这方面的知识了,太菜了! 我大致了解了一下 ...

  5. 逆向工程初步160个crackme-------6

    工具:1. 按钮事件地址转换器E2A 2. PEID 3. Ollydbg 同样我们先来运行一下这个程序, ok按钮是被禁用的,有一个help按钮点击后弹出一个消息框:消息框显示提示信息为.本程序需要 ...

  6. [反汇编练习]160个CrackMe之001

    [反汇编练习] 160个CrackMe之001. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. Heron and His Triangle HDU - 6222

    题目链接:https://vjudge.net/problem/HDU-6222 思路:打表找规律. 然后因为数据范围较大可以考虑用字符串模拟,或者__int128要注意用一个快读快输模板. 1 #i ...

  2. PTA 找出不是两个数组共有的元素

    7-2 找出不是两个数组共有的元素 (20 分)   给定两个整型数组,本题要求找出不是两者共有的元素. 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤),随后是N个整数,其间以 ...

  3. MySQL的安装及使用

    安装MySQL 这里建议大家使用压缩版,安装快,方便.不复杂. 1.MySQL软件下载 mysql5.7 64位下载地址: https://dev.mysql.com/get/Downloads/My ...

  4. Java进阶专题(二十八) Service Mesh初体验

    前言 ​ ⽬前,微服务的架构⽅式在企业中得到了极⼤的发展,主要原因是其解决了传统的单体架构中存在的问题.当单体架构拆分成微服务架构就可以⾼枕⽆忧了吗? 显然不是的.微服务架构体系中同样也存在很多的挑战 ...

  5. 自动QQ邮箱发送邮件

    语言:python 参考:https://www.runoob.com/python/python-email.html 前提: 1.QQ邮箱开启了SMTP服务 2.生成了授权码,这个授权码将作为自己 ...

  6. Elasticsearch 主节点和暖热节点解析

    Elasticsearch 主节点和暖热节点解析 主节点 控制整个集群,进行一些轻量级操作,列如:跟踪哪些节点是集群中的一部分,决定节点分片分配,负责集群健康, 不包含数据,也不参与搜索和索引操作,对 ...

  7. Java中的泛型 - 细节篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的泛型 - 细节篇>,希望对大家有帮助,谢谢 细心的观众朋友们可能发现了,现在的标题不再是入门篇,而是各种详细篇,细节篇: 是因为之 ...

  8. CVE-2021-21402 Jellyfin任意文件读取

    CVE-2021-21402 Jellyfin任意文件读取 漏洞简介 jellyfin 是一个自由的软件媒体系统,用于控制和管理媒体和流媒体.它是 emby 和 plex 的替代品,它通过多个应用程序 ...

  9. SVN讲解

    1.SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复到已经删除的文件 2.SVN和Git相比,有什么优势? 使用简单,上手快 git没有目录级权限控 ...

  10. Img2Latex 临时方法

    Img2Latex 临时方法 博客园Markdown编辑器中公式需采用Latex编写,然鹅现在并不想学习Latex 毕竟工科生,写论文也免不了的各种公式 (终极解决方案当然是学会Latex) 1.工具 ...