首页
社区
课程
招聘
[原创]逆向Becky! Internet Mail version 2 密码加密算法
发表于: 2011-1-13 17:45 6546

[原创]逆向Becky! Internet Mail version 2 密码加密算法

2011-1-13 17:45
6546

【文章标题】:逆向Becky! Internet Mail version 2 密码加密算法
【文章作者】: crosoli
【作者邮箱】: crosoli@126.com
【软件名称】: Becky! Internet Mail
【下载地址】: 自己搜索下载
【编写语言】: VC6.0
【软件介绍】: 邮件收取工具
【作者声明】: 出于学习的目的
--------------------------------------------------------------------------------
【详细过程】
1,上个月买了本段刚老师的加密解密3,看完了第5章(只能下班的时间看),总感觉作者很了解我. 这本书太适合我了.
2.分析过程.
1,首先打开Becky! Internet Mail,配置好自己的邮件信息.

2,然后OD载入 B2.exe, F9运行后,右键点击邮件->属性,然后修改密码,此时对 GetWindowTextA下断点. 会发现配件的所有信息都会读入到内存.让发现密码明文读取到内存后,然后数据窗口跟随,找到密码的明文,并对它下内存断点.并移除先前的GetWindowTextA断点.
F9运行后程序来到:

0051A8C5  |.  85DB          TEST EBX,EBX
0051A8C7  |.  75 3A         JNZ SHORT B2.0051A903
0051A8C9  |.  8B86 B8000000 MOV EAX,DWORD PTR DS:[ESI+B8]            ;   新密码
0051A8CF  |.  8BAF B8000000 MOV EBP,DWORD PTR DS:[EDI+B8]            ;   老密码
0051A8D5  |>  8A55 00       /MOV DL,BYTE PTR SS:[EBP]                ;  取老密码一位
0051A8D8  |.  8ACA          |MOV CL,DL
0051A8DA  |.  3A10          |CMP DL,BYTE PTR DS:[EAX]                ;  取新密码一位
0051A8DC  |.  75 1C         |JNZ SHORT B2.0051A8FA                   ;  密码不相同跳转
0051A8DE  |.  84C9          |TEST CL,CL
0051A8E0  |.  74 14         |JE SHORT B2.0051A8F6
0051A8E2  |.  8A55 01       |MOV DL,BYTE PTR SS:[EBP+1]              ;  继续比较
0051A8E5  |.  8ACA          |MOV CL,DL
0051A8E7  |.  3A50 01       |CMP DL,BYTE PTR DS:[EAX+1]
0051A8EA  |.  75 0E         |JNZ SHORT B2.0051A8FA
0051A8EC  |.  83C5 02       |ADD EBP,2
0051A8EF  |.  83C0 02       |ADD EAX,2
0051A8F2  |.  84C9          |TEST CL,CL
0051A8F4  |.^ 75 DF         \JNZ SHORT B2.0051A8D5
0051A8F6  |>  33C0          XOR EAX,EAX
0051A8F8  |.  EB 05         JMP SHORT B2.0051A8FF
0051A8FA  |>  1BC0          SBB EAX,EAX                              ;  
0051A8FC  |.  83D8 FF       SBB EAX,-1
0051A8FF  |>  85C0          TEST EAX,EAX
0051A901  |.  74 5F         JE SHORT B2.0051A962                     ; 原密码和新密码相同时候跳过不写入
0051A903  |>  8DAE B8000000 LEA EBP,DWORD PTR DS:[ESI+B8]
0051A909  |.  8D8F B8000000 LEA ECX,DWORD PTR DS:[EDI+B8]
0051A90F  |.  55            PUSH EBP
0051A910  |.  E8 22280800   CALL B2.0059D137
0051A915  |.  8B6D 00       MOV EBP,DWORD PTR SS:[EBP]
0051A918  |.  A1 38685F00   MOV EAX,DWORD PTR DS:[5F6838]
0051A91D  |.  55            PUSH EBP
0051A91E  |.  68 00100000   PUSH 1000
0051A923  |.  8D4C24 24     LEA ECX,DWORD PTR SS:[ESP+24]
0051A927  |.  894424 24     MOV DWORD PTR SS:[ESP+24],EAX
0051A92B  |.  E8 FE2A0800   CALL B2.0059D42E
0051A930  |.  50            PUSH EAX
0051A931  |.  E8 4A00F7FF   CALL B2.0048A980                        ;对新密码进行加密处理。
0051A936  |.  6A FF         PUSH -1
0051A938  |.  8D4C24 20     LEA ECX,DWORD PTR SS:[ESP+20]
0051A93C  |.  E8 3C2B0800   CALL B2.0059D47D
0051A941  |.  8B0E          MOV ECX,DWORD PTR DS:[ESI]
0051A943  |.  8B5424 1C     MOV EDX,DWORD PTR SS:[ESP+1C]
0051A947  |.  51            PUSH ECX                                 ; /FileName
0051A948  |.  52            PUSH EDX                                 ; |String
0051A949  |.  68 B8B35E00   PUSH B2.005EB3B8                         ; |Key = "PassWd"
0051A94E  |.  68 E4E15E00   PUSH B2.005EE1E4                         ; |Section = "Account"
0051A953  |.  FF15 64225C00 CALL DWORD PTR DS:[<&KERNEL32.WritePriva>; \WritePrivateProfileStringA    把加密后的新密码写入配置文件的"PassWd"字段

下面来分析0048A980 这个函数
0051A931  |.  E8 4A00F7FF   CALL B2.0048A980                        ;对新密码进行加密处理。

0048A980  /$  B8 00800000   MOV EAX,8000
0048A985  |.  E8 268F0F00   CALL B2.005838B0
0048A98A  |.  8B8424 088000>MOV EAX,DWORD PTR SS:[ESP+8008]          ;EAX新密码
0048A991  |.  56            PUSH ESI
0048A992  |.  8038 00       CMP BYTE PTR DS:[EAX],0                  ;判断新密码是不是为空
0048A995  |.  75 14         JNZ SHORT B2.0048A9AB
0048A997  |.  8B8424 088000>MOV EAX,DWORD PTR SS:[ESP+8008]
0048A99E  |.  5E            POP ESI
0048A99F  |.  C600 00       MOV BYTE PTR DS:[EAX],0
0048A9A2  |.  81C4 00800000 ADD ESP,8000
0048A9A8  |.  C2 0800       RETN 8
0048A9AB  |>  8D4C24 04     LEA ECX,DWORD PTR SS:[ESP+4]
0048A9AF  |.  50            PUSH EAX                                 ; /Arg2
0048A9B0  |.  51            PUSH ECX                                 ; |Arg1
0048A9B1  |.  E8 8AF5FFFF   CALL B2.00489F40                         ; \B2.00489F40      第一次对新密码进行00489F40加密处理
0048A9B6  |.  8D5424 04     LEA EDX,DWORD PTR SS:[ESP+4]
0048A9BA  |.  8BB424 088000>MOV ESI,DWORD PTR SS:[ESP+8008]
0048A9C1  |.  52            PUSH EDX                                 ; /Arg2
0048A9C2  |.  56            PUSH ESI                                 ; |Arg1
0048A9C3  |.  E8 78F5FFFF   CALL B2.00489F40                         ; \B2.00489F40      2次加密
0048A9C8  |.  8A06          MOV AL,BYTE PTR DS:[ESI]
0048A9CA  |.  84C0          TEST AL,AL
0048A9CC  |.  74 0C         JE SHORT B2.0048A9DA
0048A9CE  |>  34 02         /XOR AL,2                                ;把2次加密码后的结果和2进行xor
0048A9D0  |.  8806          |MOV BYTE PTR DS:[ESI],AL
0048A9D2  |.  8A46 01       |MOV AL,BYTE PTR DS:[ESI+1]
0048A9D5  |.  46            |INC ESI
0048A9D6  |.  84C0          |TEST AL,AL
0048A9D8  |.^ 75 F4         \JNZ SHORT B2.0048A9CE                   ;循环xor
0048A9DA  |>  5E            POP ESI
0048A9DB  |.  81C4 00800000 ADD ESP,8000
0048A9E1  \.  C2 0800       RETN 8

下面来分析00489F40这个加密函数
00489F40  /$  83EC 0C       SUB ESP,0C
00489F43  |.  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
00489F47  |.  53            PUSH EBX
00489F48  |.  57            PUSH EDI
00489F49  |.  8B7C24 1C     MOV EDI,DWORD PTR SS:[ESP+1C]
00489F4D  |.  32DB          XOR BL,BL
00489F4F  |.  894424 08     MOV DWORD PTR SS:[ESP+8],EAX
00489F53  |.  8A0F          MOV CL,BYTE PTR DS:[EDI]
00489F55  |.  3ACB          CMP CL,BL
00489F57  |.  0F84 CF000000 JE B2.0048A02C
00489F5D  |.  55            PUSH EBP
00489F5E  |.  56            PUSH ESI
00489F5F  |>  47            /INC EDI
00489F60  |.  884C24 14     |MOV BYTE PTR SS:[ESP+14],CL            ;base64加密。
00489F64  |.  885C24 16     |MOV BYTE PTR SS:[ESP+16],BL
00489F68  |.  885C24 15     |MOV BYTE PTR SS:[ESP+15],BL
00489F6C  |.  8A0F          |MOV CL,BYTE PTR DS:[EDI]
00489F6E  |.  BE 01000000   |MOV ESI,1
00489F73  |.  3ACB          |CMP CL,BL
00489F75  |.  74 1A         |JE SHORT B2.00489F91
..
..
...
....

由于篇幅的文件就不对BASE64进行分析了。
其实00489F40 就是一个BASE64的加密。

综上所述  他的密码的保存方式就是 2次BASE64后xor2.

附上Becky!的密码破解代码;

break mail.rar


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 206
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
没有人阅读.
2011-1-13 22:04
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
看过,加油,期待你更好的文章。
2011-1-14 12:52
0
雪    币: 206
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
哪看到过呢????   有一篇是破解注册的..
2011-1-15 11:18
0
雪    币: 2307
活跃值: (1018)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
感谢楼主好文章,算法还没研究透
00426602      8BC3          MOV EAX,EBX ----------> xor eax,eax (爆破)
http://www.rimarts.jp/downloads/B2/bk25604.zip


找到了,杯具
http://bbs.pediy.com/showthread.php?t=52492&highlight=Becky+Internet+Mail
2011-1-15 12:52
0
雪    币: 206
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
那是破解注册的..

这是破密码的
2011-1-15 14:40
0
雪    币: 2307
活跃值: (1018)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
我知道,程序更新了,可注册算法还是没更新

/* Becky! Ver.2 keygen */

#include <stdio.h>
#include <stdlib.h>

int RangedRand( int range_min, int range_max )
{
srand((unsigned)time(NULL));
int u = (double)rand() / (RAND_MAX + 1)
* (range_max - range_min)
+ range_min;
return u;
}

void main()
{
printf("%.2d%.2d-3437-G%.3d",
RangedRand(0,99),
RangedRand(0,12),
RangedRand(0,999));
getchar();
}

2011-1-15 18:07
0
雪    币: 206
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8


这是密码加密啊 不是注册啊
2011-1-15 22:39
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持下,加油。。。
2011-1-18 15:42
0
游客
登录 | 注册 方可回帖
返回
//