首页
社区
课程
招聘
[原创]再来一枚KeygenMe
发表于: 2013-5-16 12:51 10016

[原创]再来一枚KeygenMe

2013-5-16 12:51
10016

今天找到了这样一个程序,拿到OD里初看觉得太简单了,关键的汇编代码就那么几十行,就当是练手吧。后来分析了一阵子发现里面另有玄机,看似短短的几十行汇编代码,里面却有几个地方,稍不留神,就无法写出完整的注册机。
闲话就不多说了,直接进入主题吧。
这是一个控制台的程序,所用的编程语言我也没见到过,既然无法从API上下断,也无法从入口点下手,那就查找字符串吧。。经过一小步,就找到了这个关键代码处,由于代码比较少,我就详细的解释下,有不对的地方,恳请各位大大多多指教。

00401478  |> /837D E0 09    /CMP DWORD PTR SS:[EBP-20],9             ;  判断是否大于9
0040147C  |. |77 26         |JA SHORT Keygen_#.004014A4              ;  大于则跳转
0040147E  |. |89E8          |MOV EAX,EBP
00401480  |. |0345 E0       |ADD EAX,DWORD PTR SS:[EBP-20]           ;  基址加上偏移
00401483  |. |83E8 08       |SUB EAX,8                               ;  减8定位到字符串
00401486  |. |0FB600        |MOVZX EAX,BYTE PTR DS:[EAX]             ;  依次取字符串的各个字符
00401489  |. |8845 EF       |MOV BYTE PTR SS:[EBP-11],AL             ;  将取到的字符存入变量,记为变量a
0040148C  |. |0FBE55 EF     |MOVSX EDX,BYTE PTR SS:[EBP-11]          ;  将变量a的值传给edx
00401490  |. |8D45 F0       |LEA EAX,DWORD PTR SS:[EBP-10]           ;  eax=ebp-0x10,即让eax指向这个地址
00401493  |. |0110          |ADD DWORD PTR DS:[EAX],EDX              ;  eax所指向的变量b,加上edx的值
00401495  |. |8B55 F0       |MOV EDX,DWORD PTR SS:[EBP-10]           ;  将b的值传给edx
00401498  |. |8D45 E8       |LEA EAX,DWORD PTR SS:[EBP-18]           ;  eax=ebp-0x18,即让eax指向这个地址
0040149B  |. |0110          |ADD DWORD PTR DS:[EAX],EDX              ;  将eax指向的变量c,加上edx的值
0040149D  |. |8D45 E0       |LEA EAX,DWORD PTR SS:[EBP-20]           ;  eax=ebp-0x20,即让eax指向变量i
004014A0  |. |FF00          |INC DWORD PTR DS:[EAX]                  ;  变量i加1,为下一轮循环做准备
004014A2  |.^\EB D4         \JMP SHORT Keygen_#.00401478


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (12)
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持一下~good job
2013-5-16 12:59
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
3
呵呵,纯属练手。。
2013-5-16 13:41
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
虽不晓,但觉吊,~~ 楼主肯定是个高人,膜拜!
2013-5-16 13:50
0
雪    币: 6879
活跃值: (1379)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学-习-了
2013-5-16 13:51
0
雪    币: 21
活跃值: (216)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
有点问题吧,当用户名少于8个的时候,楼主的结果就出现问题了。

我也初学,花了挺多时间的,但也只大概看了下。

他定义时部分大概是这样的 int tmp; char name[4];int key;

然后他分别将name 、tmp都初始化为0了.也许tmp压根就是name的一部分,换个方式就是char name[8];int key;只是编译器翻译过来这样赋值而已。

这问题就来了,循环10次,但字符串只有8位,另外两位哪里来呢,我往上面看了下,没有见到前面4字节有初始化的信息。

由此我总结那是内存垃圾数据,是没有初始化的数据。

不过那段空间是怎么来的呢?

我怀疑那是在char name[8],前面还有个变量,例如int a;只是没有初始化。或者本来就是char name[12],只是初始化了前面8个字节。

如果真的是垃圾数据,那么低于9个字符(有一位'/0')的结果都是不可预测的。

起码我用epluguo尝试过,key错了,当然还得说下我的环境,我的是win7环境下,而我看到那你说的补充的两个字节是0x78,0xFF。

我用LZ给的thankyou尝试过,结果正确,这是8个字符,加上'\0'是9个字符,我觉得应该是偶然吧,因为我们附带的两个字节中后面的那个都是0xFF.

不知有没有说错,初学者一个,有说错的还望斧正
2013-5-17 13:45
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=epluguo;1178327]有点问题吧,当用户名少于8个的时候,楼主的结果就出现问题了。

我也初学,花了挺多时间的,但也只大概看了下。

他定义时部分大概是这样的 int tmp; char name[4];int key;

然后他分别将name 、tmp都初始化为0了.也许tmp压根就是name的一部分,换个方式就是ch...[/QUOTE]

嗯,刚我也重新看过了,确实第9位的数据在不同电脑上有变化,是垃圾数据。多谢提出来。那现在这个程序要加一个限定条件了,注册名不能低于8位,呵呵。。
2013-5-17 14:40
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最近很多精华啊,支持了..
2013-5-17 15:29
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
膜拜学习ing
2013-5-18 13:23
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不懂什么意思!!!
2013-5-18 14:58
0
雪    币: 1585
活跃值: (192)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
顶!支持原创
2013-5-20 15:20
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了,谢谢。
2013-5-22 20:11
0
雪    币: 12038
活跃值: (18892)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
来看一看啊,学习一下
2013-5-22 20:34
0
游客
登录 | 注册 方可回帖
返回