有了第一个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. java例题_06 最大公约数&最小公倍数

    1 /*6 [程序 6 求最大公约数及最小公倍数] 2 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 3 程序分析:利用辗除法. 4 */ 5 6 /*分析 7 * ======== ...

  2. day-06-集合-缓存机制-深浅copy

    (1) is id ==用法 is 判断的是内存地址是否相同 id 查看内存地址:id相同,值一定相同,值相同,id不一定相同 == 比较判断是否相等 l1 = [1, 2, 3] l2 = [1, ...

  3. python基础(五):列表的使用(上)

    什么是列表 列表是一系列元素,按特定顺序排列组成.列表总的元素之间没有任何关系,既可以时字符串,也可以是数字,还可以是布尔值. 由此可以看出,列表通常包含多个元素,因此再给列表命名的时候,最好使用复数 ...

  4. 【C/C++】面向对象开发的优缺点

    原创文章,转发请注明出处. 面向对象开发的优缺点 面向对象开发 是相对于 面向过程开发 的一种改进思路. 由于流水线式的面相过程开发非常直接,高效.在面对一些简单项目时,只需要几百行,甚至是几十行代码 ...

  5. leetcode 刷题(数组篇)74 题 搜索二维矩阵 (二分查找)

    二分查找要注意边界值的取值,边界情况的判定 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一 ...

  6. Toolkit 大更新:UI 更美观,用起来更方便!

    前言 前段时间有小伙伴在群里聊天,说到 Toolkit 下载量到 4.9k 了.就突然想起来,很久没有更新这个插件. PS:我是用它申请了 License,一般时候使用 Json 格式化功能. 趁着周 ...

  7. 「一站式」兼容所有云厂商文件存储Spring Boot 实现

    背景 在互联网发展的今天,近乎所有的云厂商都提供对象存储服务.一种海量.安全.低成本.高可靠的云存储服务,适合存放任意类型的文件.容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本. 当我们 ...

  8. 1. Intellij IDEA导入,主题修改,布局界面+部分工具栏菜单介绍

    Project 和module 的区别 module 相当与eclispe的项目project 相当与eclpise的工作空间 主题的修改 Setting的快捷键:Ctrl+shift+S

  9. SpringBoot开发秘籍 - 集成Graphql Query

    概述 REST作为一种现代网络应用非常流行的软件架构风格受到广大WEB开发者的喜爱,在目前软件架构设计模式中随处可见REST的身影,但是随着REST的流行与发展,它的一个最大的缺点开始暴露出来: 在很 ...

  10. Spring Cloud Alibaba(5)---Nacos(配置中心)

    Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...