002-注册算法分析

一、工具和调试环境

  • 动态调试工具:x64dbg
  • 系统环境:win10 1909

二、分析Serial/name的算法

直接使用提示字符串验证,得到错误提示如下:

接下来使用x64dbg重新加载或者附加,然后直接搜索字符串Try Again,只有一处引用,就很nice

双击跳到引用的地方,其中edi__vbaStrCat函数地址,ebx__vbaObjSet函数地址,这里就是错误提示弹窗的地方。往上看,可以发现一个jmp直接跳过错误提示弹窗的代码,那么jmp的下一行代码(下图红框)大概是从别的地方跳过来的,那么下面就查看什么地方跳到此处

选中该行,右键选中查找引用,然后选择选中的地址。可以看到有一处引用,这就很nice

双击跳到引用的地方,可以发现je跳过的地方好像是正确提示弹窗代码,在此处下断点,然后运行程序,依旧使用提示字符串验证。断点触发,然后我们修改ZF标志位,再继续运行,发现正确提示弹窗出现。那么这个跳转就是关键跳转了。

接下来继续向上观察是影响je指令的指令,上面不远处就会发现test si, si,也就是说是通过si的值来影响跳转,当si = 0就提示错误,si != 0 就提示正确。想上继续查看si的值是怎么来的

如上图,si的值是__vbaStrCmp的返回值然后进行下面运算

; eax = __vbaStrCmp(str1, str2)的返回值, 相等返回0
mov esi, eax
neg esi ; 当 eax = 0 时, esi = 0, eax != 0 时,esi = -1
sbb esi, esi ; 当 eax = 0 时, esi = 0, eax != 0 时,esi = -1
inc esi ; 当 eax = 0 时, esi = 1, eax != 0 时,esi = 0
neg esi ; 当 eax = 0 时, esi = -1, eax != 0 时,esi = 0
; 即 str1 与 str2 相等时, esi = -1, 不相等时, esi = 0

由此我们只要让str1str2相等即可,下面就在调用该函数的地方下个断点,运行,断点断下后,查看该函数的两个参数分别是什么

可以看出一个是我们输入的Serial,那么另一个应该就是需要输入的正确的Serial。接下来就需要找到正确Serial是怎么来的。

直接在函数头部下一个断点,然后一直单步观察寄存器和栈区的变化,看什么时候出现正确的Serial,最后在如下图的0x00402525处获取到正确的Serial

可以看到正确的Serial是拼接而成的,固定格式为:AKA-XXX,其中XXX是一串数字。接下来重复刚刚的操作,找到XXX首次出现的地方,见下图

__vbaStrI4函数是将长整型(4个字节)的数值转换为十进制表示的字符串,XXX就是edi转换后的,那么edi的值是如何来的呢?上图红框中就是edi的值的计算,也是我们要找的核心算法。

0040240F   | 8B45 E4                  | mov eax,dword ptr ss:[ebp-1C]           | [ebp-1C]:L"Type In Your Name" ; name的首地址
00402412 | 50 | push eax |
00402413 | 8B1A | mov ebx,dword ptr ds:[edx] |
00402415 | FF15 E4404000 | call dword ptr ds:[<&__vbaLenBstr>] | ; 获取 name 的长度
0040241B | 8BF8 | mov edi,eax | ; edi = strlen(name)
0040241D | 8B4D E8 | mov ecx,dword ptr ss:[ebp-18] | [ebp-18]:L"Type In Your Name" ; name的首地址
00402420 | 69FF FB7C0100 | imul edi,edi,17CFB | ; edi = strlen(name) * 0x17CFB
00402426 | 51 | push ecx |
00402427 | 0F80 91020000 | jo afkayas.1.4026BE |
0040242D | FF15 F8404000 | call dword ptr ds:[<&rtcAnsiValueBstr>] | ; 获取 name 的第一个字符的 ascii码值
00402433 | 0FBFD0 | movsx edx,ax | ; edx = name[0]
00402436 | 03FA | add edi,edx | ; edi = strlen(name) * 0x17CFB + name[0]
00402438 | 0F80 80020000 | jo afkayas.1.4026BE |
0040243E | 57 | push edi |
0040243F | FF15 E0404000 | call dword ptr ds:[<&__vbaStrI4>] |
00402445 | 8BD0 | mov edx,eax | eax:L"1658111"

首先获取name的长度,然后将其长度乘以0x17CFB,将运算的结果再加上name第一个字符的ascii码值就得到了edi的最终值:edi = strlen(name) * 0x17CFB + name[0]

三、算法核心代码模拟

char* GetSerial2(char* szName)
{
static char szSerial[60] = {}; int key = strlen(szName) * 0x17CFB + szName[0]; sprintf(szSerial, "AKA-%d", key);
return szSerial;
}

破解练习-CRACKME002的更多相关文章

  1. CrackMe005-下篇 | 逆向破解分析 | 160个CrackMe(视频+图文)深度解析系列

    作者:逆向驿站微信公众号:逆向驿站知乎:逆向驿站 CrackMe005,上篇说了具体方法,下篇来发逆向分析过程,看看老夫是如何得到上篇的具体方法的! 准备 [环境和工具] win7/xp虚拟机环境 C ...

  2. Kali对wifi的破解记录

    好记性不如烂笔头,记录一下. 我是在淘宝买的拓实N87,Kali可以识别,还行. 操作系统:Kali 开始吧. 查看一下网卡的接口.命令如下 airmon-ng 可以看出接口名称是wlan0mon. ...

  3. 对抗密码破解 —— Web 前端慢 Hash

    (更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...

  4. Syscan360会议胸牌破解揭秘

    Syscan360会议胸牌破解揭秘 背景 有幸参加今年11月份的上海Syscan360安全会议,会议期间有一个亮点就是360的独角兽团队设计了一款电子badge(胸牌)供参加人员进行破解尝试,类似于美 ...

  5. “不给力啊,老湿!”:RSA加密与破解

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...

  6. C# 破解 Reflector8.5

    一.分析 破解.net .dll,可以使用reflector,但官方提供的reflector是需要购买的,因此,破解reflector势在必行. 二.破解Reflector具体步骤 下面为详细的破解步 ...

  7. CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15

    之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...

  8. 破解SQLServer for Linux预览版的3.5GB内存限制 (UBUNTU篇)

    在上一篇中我提到了如何破解RHEL上SQLServer的内存大小限制,但是Ubuntu上还有一道检查 这篇我将会讲解如何在3.5GB以下内存的Ubuntu中安装和运行SQLServer for Lin ...

  9. 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)

    微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这个新东西 这篇我将讲解如何破解这个内存限制 要看关键的可以直接跳到第6步,只需要替换 ...

  10. 微信小程序IDE(微信web开发者工具)安装、破解手册

    1.IDE下载 微信web开发者工具,本人是用的windows 10 x64系统,用到以下两个版本的IDE安装工具与一个破解工具包: wechat_web_devtools_0.7.0_x64.exe ...

随机推荐

  1. vue3中使用computed

    演示示例(vant组件库的轮播图): <van-swipe :loop="false" :width="150" class="my-Swipe ...

  2. 【笔记】CF1659E AND-MEX Walk 及相关

    题目传送门 位运算 设题目中序列 \(w_1,w_1\& w_2,w_1\& w_2\& w_3,\dots,w_1\& w_2\& \dots \& ...

  3. 【云原生 · Kubernetes】Kubernetes容器云平台部署与运维

    [题目1]Deployment管理 在master节点/root目录下编写yaml文件nginx-deployment.yaml,具体要求如下: (1)Deployment名称:nginx-deplo ...

  4. 两行CSS让页面提升了近7倍渲染性能!

    前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载过慢,你的用户很可能会因此离你而去.所以页面性能对于前端开发者 ...

  5. swap,传参实质

    void swap(int a,int b){ int s=a; a=b; b=s; } int main(){ int x=1,y=2; swap(x,y); } 上面的函数并不能实现交换,因为传参 ...

  6. typora实现多平台发布文章

    源码下载 前言 之前写过一片文章,typora 使用CSDN作为图床,用来存储 markdown 文章的图片资源文件.后来发现 typora 还可以自定义导出命令,那么也可以利用这个功能实现直接发布到 ...

  7. mybatis中xml的sql之test中文报错

    在mybatis中sql,test中文报错( java.lang.NumberFormatException 这句话明确告诉了我们是数字格式异常).需加.tostring(). <if test ...

  8. day12 多线程1.进程与线程 & 2.线程生命周期 & 3.线程同步机制

    day12 bigDecimal,用于计算钱的数据类型 多线程 线程与进程 进程 1)执行中的应用程序 2)一个进程可以包含一个或者多个线程 3)一个进程至少要包含一个线程(如main方法) 线程 线 ...

  9. MySQL进阶实战5,为什么查询速度会慢

    一.先了解一下MySQL查询的执行过程 MySQL在查询时,它是由很多子任务组成的,每个子任务都会消耗一定的时间,如果要想优化查询,实际上要优化其子任务,可以消除一些子任务.减少子任务的执行次数.让子 ...

  10. 有状态软件如何在 k8s 上快速扩容甚至自动扩容

    概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机 安装依赖 下载安装包 按规范配置主机名, hosts 配置网络: 包括域名, DNS, ...