吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5095|回复: 44
收起左侧

[原创] 【逆向入门】160CM-001-注册算法分析(嚼碎了教给你)

  [复制链接]
枫MapleLCG 发表于 2022-10-4 22:34
本帖最后由 枫MapleLCG 于 2022-10-4 22:59 编辑

题目来源:
【反汇编练习】160个CrackME索引目录1~160建议收藏备用
https://www.52pojie.cn/thread-709699-1-1.html
(出处: 吾爱破解论坛)

一,工具准备:
动态调试工具:x64dbg(x86)
查壳工具:DIE(EXEINFO)
环境:Windows10(1909)裸机

二,Serial/name:
将文件拖入dbg运行,有两个题目(serial/name 和 serial)

本次分析第一个题目的算法(第二个无,仅仅是爆破)


2-1首先进行serial/name
输入假码
image.png
搜索字符串,下断点,断下。
这段代码是判断name有没有大于等于4位数字,有则跳过报错。本文不多分析。
0042F9C8 | E8 8BB0FEFF              | call acid burn.41AA58                   | 获取位数
0042F9CD | 8B45 F0                  | mov eax,dword ptr ss:[ebp-10]           |
0042F9D0 | E8 DB40FDFF              | call acid burn.403AB0                   |
0042F9D5 | A3 6C174300              | mov dword ptr ds:[43176C],eax           |
0042F9DA | 8D55 F0                  | lea edx,dword ptr ss:[ebp-10]           |
0042F9DD | 8B83 DC010000            | mov eax,dword ptr ds:[ebx+1DC]          |
0042F9E3 | E8 70B0FEFF              | call acid burn.41AA58                   | 从这里开始取前四位数字
0042F9E8 | 8B45 F0                  | mov eax,dword ptr ss:[ebp-10]           |
0042F9EB | 0FB600                   | movzx eax,byte ptr ds:[eax]             |
0042F9EE | 8BF0                     | mov esi,eax                             |
0042F9F0 | C1E6 03                  | shl esi,3                               |
0042F9F3 | 2BF0                     | sub esi,eax                             |
0042F9F5 | 8D55 EC                  | lea edx,dword ptr ss:[ebp-14]           |
0042F9F8 | 8B83 DC010000            | mov eax,dword ptr ds:[ebx+1DC]          |
0042F9FE | E8 55B0FEFF              | call acid burn.41AA58                   |
0042FA03 | 8B45 EC                  | mov eax,dword ptr ss:[ebp-14]           |
0042FA06 | 0FB640 01                | movzx eax,byte ptr ds:[eax+1]           |
0042FA0A | C1E0 04                  | shl eax,4                               |
0042FA0D | 03F0                     | add esi,eax                             |
0042FA0F | 8935 54174300            | mov dword ptr ds:[431754],esi           |
0042FA15 | 8D55 F0                  | lea edx,dword ptr ss:[ebp-10]           |
0042FA18 | 8B83 DC010000            | mov eax,dword ptr ds:[ebx+1DC]          |
0042FA1E | E8 35B0FEFF              | call acid burn.41AA58                   |
0042FA23 | 8B45 F0                  | mov eax,dword ptr ss:[ebp-10]           |
0042FA26 | 0FB640 03                | movzx eax,byte ptr ds:[eax+3]           |
0042FA2A | 6BF0 0B                  | imul esi,eax,B                          |
0042FA2D | 8D55 EC                  | lea edx,dword ptr ss:[ebp-14]           |
0042FA30 | 8B83 DC010000            | mov eax,dword ptr ds:[ebx+1DC]          |
0042FA36 | E8 1DB0FEFF              | call acid burn.41AA58                   |
0042FA3B | 8B45 EC                  | mov eax,dword ptr ss:[ebp-14]           |
0042FA3E | 0FB640 02                | movzx eax,byte ptr ds:[eax+2]           |
0042FA42 | 6BC0 0E                  | imul eax,eax,E                          |
0042FA45 | 03F0                     | add esi,eax                             |
0042FA47 | 8935 58174300            | mov dword ptr ds:[431758],esi           |
0042FA4D | A1 6C174300              | mov eax,dword ptr ds:[43176C]           |
0042FA52 | E8 D96EFDFF              | call acid burn.406930                   |
0042FA57 | 83F8 04                  | cmp eax,4                               | 判断name是否为4位数字
0042FA5A | 7D 1D                    | jge acid burn.42FA79                    |
0042FA5C | 6A 00                    | push 0                                  |
0042FA5E | B9 74FB4200              | mov ecx,acid burn.42FB74                | 42FB74:"Try Again!"
0042FA63 | BA 80FB4200              | mov edx,acid burn.42FB80                | 42FB80:"Sorry , The serial is incorect !"
0042FA68 | A1 480A4300              | mov eax,dword ptr ds:[430A48]           |
0042FA6D | 8B00                     | mov eax,dword ptr ds:[eax]              |

咱们往下看。如图,这是判断完name长度后跳转到的地方
这里就开始计算我们的注册码了
2-2 取首位数字
image.png
我们先看第一个方框圈起来的部分:movzx eax,byte ptr ds:[eax]
movzx 是一个数据传送指令,功能例子:movzx a,b  将b的值传送给a,可以看作高级编程语言中的 a=b。
eax,是寄存器之一,用来暂存一些数据、地址、指令。在动态调试工具的右上角可以查看某寄存器当前的值
byte ptr ds:[eax],byte 单字节,ptr(pointner的缩写,可以暂且不管)ds是寄存器  [eax] 是eax寄存器中的值
那么movzx eax,byte ptr ds:[eax]就是取eax寄存器当前所存的值的第一个字节(提问:为什么是第一个字节捏),存入eax中。
在第二个方框我们可以看到,第一个字节为“1”,即假name 1234中的首位数字。
我们输入的name是以ascii码的形式读入的,转换为十六进制为31(方框2中的31即为ANSI格式的1转换为十六进制后的数字).十进制为49
2-3 计算注册码
image.png
看到方框一,imul dword ptr ds:[431750]
imul 是算数指令,做乘法。功能例子:imul eax,a 将eax中的值和a相乘,并把结果存入eax
其中,eax为第一操作数,a为第二操作数。值得注意的是,第一操作数必须为寄存器。
当只有一个操作数时,另一个乘数一般为eax中的值。
看到方框二,此时dword ptr ds:[431750]对应的值为0x29(十六进制),十进制为41
当前eax中的值为0x31,即十进制的49
故imul dword ptr ds:[431750],即为 0x31 * 0x29 ,即49x41 = 2009。
image.png
看方框一,经过两个mov 的操作,现在eax和dword ptr ds:[431750]的值已经相等,即十六进制的7D9(十进制的2009)
看到add dword ptr ds:[431750],eax
add,算术指令,加法。功能示例:add eax,a 将a和eax中的值相加,并且结果存入eax
其中eax为第一操作数,a为第二操作数。第一操作数要么指向内存,要么指向寄存器。
故,add dword ptr ds:[431750],eax 即 7D9 + 7D9 =2009+2009 = 4018
并将结果存入内存地址为431750的地方,留着备用
2-4 第一题结语
注册码的计算过程全部分析完毕。后续则是固定格式(CW-XXX-CRACKED)的组装,不做分析。
本次假name(1234)对应的注册码(CW-4018-CRACKED)
Keygen代码(C++)如下:
int main() {
        char str;
        printf("输入name的首位:");
        scanf_s("%c",&str);
        int reg = str * 41 * 2;
        printf("你滴注册码:CW-%d-CRACKED", reg);
        return 0;
 }

image.png

免费评分

参与人数 9吾爱币 +16 热心值 +9 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hanlaoshi + 1 + 1 谢谢@Thanks!
夫子点灯 + 1 热心回复!
wasdzjh + 1 + 1 str×41×2当中的41怎么来的
xlln + 1 + 1 我很赞同!
woyucheng + 1 + 1 谢谢@Thanks!
开心的一逼 + 1 + 1 我很赞同!
Lucifer_BW + 1 + 1 热心回复!
宇宙小菜鸟 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 枫MapleLCG 发表于 2022-10-8 22:59
huashengyue 发表于 2022-10-7 20:55
感谢分享。但是做为小白,有几个问题请教:1是当将样本exe文件拖入x64dbg.exe时提示用32位的。2是拖入x86db ...

1.这个调试工具就叫x64dbg,但是有64位和32位版本的。我用的也是x86,我打括号了。
2,本教程并不面向不会工具基本操作、完完全全的零基础的同学。
(1)你点运行还是只能单步跟踪的原因我并不知道
(2)搜索点击注册后,弹出的窗口的字符。
(3)选中对应的行,F2下断点
 楼主| 枫MapleLCG 发表于 2022-10-8 23:03
huashengyue 发表于 2022-10-7 22:14
这个方法,是训练小白的机器码知识吗?不如OD方便,OD只需要F9-堆栈跟踪-几步就能直接显示出注册码,不用计 ...

OD已经跟不上时代了。
x64dbg也能直接在寄存器里看到注册码
但本篇文章侧重于分析算法,就是得到注册码的过程。
目的是训练小白的阅读汇编代码的能力,不让破解或者逆向流连于依葫芦画瓢。
maqunchao 发表于 2022-10-4 23:00
3863 发表于 2022-10-4 23:12
感觉准么
haooyuan 发表于 2022-10-4 23:48
很好不错学习学习 !
小想哟 发表于 2022-10-5 02:49
学习学习
龍謹 发表于 2022-10-5 06:44
听楼主的,已经收藏了。
20213 发表于 2022-10-5 09:39
很厉害,值得学习
Satori 发表于 2022-10-5 10:36
先收藏慢慢看
wasdzjh 发表于 2022-10-5 10:38
我不明白str*41*2是什么意思?求解41怎么来的,乘以2是相当于2009+2009,那么41怎么来的。只是我的一个小问题!

点评

2-3里的方框二。 程序会把name的首位的ascii转数字和0x29相乘 也就是41。  详情 回复 发表于 2022-10-5 11:34
 楼主| 枫MapleLCG 发表于 2022-10-5 11:34
wasdzjh 发表于 2022-10-5 10:38
我不明白str*41*2是什么意思?求解41怎么来的,乘以2是相当于2009+2009,那么41怎么来的。只是我的一个小问 ...

2-3里的方框二。
程序会把name的首位的ascii转数字和0x29相乘
也就是41。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 19:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表