首页
社区
课程
招聘
Vb的Currency数据类型的 Crackme的分析
发表于: 2005-11-10 12:34 8053

Vb的Currency数据类型的 Crackme的分析

2005-11-10 12:34
8053
华夏黑客同盟CrackMe分析.

声明:不是我的Crackme 请自行到华夏黑客同盟下载
本关CrackMe地址
http://crack.77169.com/v4/7777777777.html

第六关 VB CrackMe
输入实验码:
Name:38588913
Passwrod:19900114
弹出信息框
由于是Vb写的 所以直接
bpx  MSVBVM60.rtcMsgBox 即可
向上翻代码
知道首先要把字符串转换为整数型 所以看到代码
所以对字符串转换函数下断
0040A339    .  FF15 38104000    call dword ptr ds:[<&MSVBVM60.__vbaCyStr>]            ;  MSVBVM60.__vbaCyStr
将字符串转换为 通用型数据  (看堆叠窗口就知道)
所以我们也把 38588913 用计算器转换为16进制 24CD1F1 所以只要看到这个就知道是转换后的值了
但是这里是关键了。 当时我坐的时候 无论如何也不能够找到24CD1F1 这个值。 为什么呢?
经过我多天的研究。

从反编译这个函数中得到了启发

0040A35A    .  FF15 48104000    call dword ptr ds:[<&MSVBVM60.__vbaCyI4>]             ;  MSVBVM60.__vbaCyI4

734769E5 M>/$  55               push ebp
734769E6   |.  8BEC             mov ebp,esp
734769E8   |.  8B45 08          mov eax,[arg.1]
734769EB   |.  BA 10270000      mov edx,2710
734769F0   |.  F7EA             imul edx
734769F2   |.  5D               pop ebp
734769F3   \.  C2 0400          retn 4

也就是说任何一个值要转换为 通用型必须*0x2710 也就是十进制的10000
至于为什么我也不知道  得去问Microsoft
因此我把 24CD1F1*2710 得到
或DX和AX(字运算),
看寄存器窗口 果真如此
EAX D8C8D610
ECX 0000717D
EDX 00000059
EBX 00000000
59D8C8D610
。。当时其实我也很郁闷,

0040A33F    .  8D4D D4          lea ecx,dword ptr ss:[ebp-2C]
0040A342    .  8BF8             mov edi,eax
0040A344    .  8BDA             mov ebx,edx
把结构保存到寄存器 edi,和ebx中
0040A346    .  FF15 B0104000    call dword ptr ds:[<&MSVBVM60.__vbaFreeStr>]          ;  MSVBVM60.__vbaFreeStr
0040A34C    .  8D4D D0          lea ecx,dword ptr ss:[ebp-30]
0040A34F    .  FF15 AC104000    call dword ptr ds:[<&MSVBVM60.__vbaFreeObj>]          ;  MSVBVM60.__vbaFreeObj
0040A355    .  68 712D0100      push 12D71
0040A35A    .  FF15 48104000    call dword ptr ds:[<&MSVBVM60.__vbaCyI4>]             ;  MSVBVM60.__vbaCyI4
12D71转换到 通用型
同理12D71*2710= 2DFF0E10
0040A360    .  52               push edx
0040A361    .  50               push eax
0040A362    .  53               push ebx
0040A363    .  57               push edi (ebx edi 存的是59D8C8D610)
0040A364    .  6A 02            push 2
0040A366    .  FF15 78104000    call dword ptr ds:[<&MSVBVM60.__vbaCyMulI2>]          ;  MSVBVM60.__vbaCyMulI2
这个地方大家不要看错了 实际上只有3个push
另外两个是用在下面的,, 很容易迷惑人  不过实际上是microsoft编译器优化的地方
很容易猜到
59D8C8D610*2=B3B191AC20

0040A36C    .  52               push edx
0040A36D    .  50               push eax
0040A36E    .  FF15 28104000    call dword ptr ds:[<&MSVBVM60.__vbaCyAdd>]            ;  MSVBVM60.__vbaCyAdd

将 B3B191AC20+ 刚刚12D71*2710= 2DFF0E10
用计算器算得到结果
B3DF90BA30

用OD跟踪 确实如此:)

EAX DF90BA30
ECX B191AC20
EDX 000000B3
EBX 00000059

0040A374    .  8BDA             mov ebx,edx
0040A376    .  8B16             mov edx,dword ptr ds:[esi]
0040A378    .  56               push esi
0040A379    .  8BF8             mov edi,eax
0040A37B    .  FF92 FC020000    call dword ptr ds:[edx+2FC]
0040A381    .  50               push eax
0040A382    .  8D45 D0          lea eax,dword ptr ss:[ebp-30]
0040A385    .  50               push eax
0040A386    .  FF15 24104000    call dword ptr ds:[<&MSVBVM60.__vbaObjSet>]           ;  MSVBVM60.__vbaObjSet
0040A38C    .  8BF0             mov esi,eax
0040A38E    .  8D55 D4          lea edx,dword ptr ss:[ebp-2C]
0040A391    .  52               push edx
0040A392    .  56               push esi
0040A393    .  8B0E             mov ecx,dword ptr ds:[esi]
0040A395    .  FF91 A0000000    call dword ptr ds:[ecx+A0]
0040A39B    .  85C0             test eax,eax
0040A39D    .  DBE2             fclex
0040A39F    .  7D 12            jge short 6c.0040A3B3
0040A3A1    .  68 A0000000      push 0A0
0040A3A6    .  68 589A4000      push 6c.00409A58
0040A3AB    .  56               push esi
0040A3AC    .  50               push eax
0040A3AD    .  FF15 1C104000    call dword ptr ds:[<&MSVBVM60.__vbaHresultCheckObj>]  ;  MSVBVM60.__vbaHresultCheckObj
0040A3B3    >  8B45 D4          mov eax,dword ptr ss:[ebp-2C]
一直单步到这里了  看到 “19900114” 出现在了寄存器窗口
0040A3B6    .  50               push eax
0040A3B7    .  FF15 38104000    call dword ptr ds:[<&MSVBVM60.__vbaCyStr>]            ;  MSVBVM60.__vbaCyStr
毫无疑问又是一个转换。:)
老办法先用计算器将 19900114转化到16进制
在*2710
=2E55646B20
单步跟踪以下
证明了我们的结论
0040A3BD    .  8D4D D4          lea ecx,dword ptr ss:[ebp-2C]
0040A3C0    .  8BF0             mov esi,eax  老办法 低位位送esi
0040A3C2    .  8955 DC          mov dword ptr ss:[ebp-24],edx 可能是寄存器不够了 所以 高位edx 送dword ptr ss:[ebp-24],
0040A3C5    .  FF15 B0104000    call dword ptr ds:[<&MSVBVM60.__vbaFreeStr>]          ;  MSVBVM60.__vbaFreeStr
0040A3CB    .  8D4D D0          lea ecx,dword ptr ss:[ebp-30]
0040A3CE    .  FF15 AC104000    call dword ptr ds:[<&MSVBVM60.__vbaFreeObj>]          ;  MSVBVM60.__vbaFreeObj
0040A3D4    .  3BFE             cmp edi,esi
0040A3D6    .  75 7D            jnz short 6c.0040A455   关键跳转爆破点阿
比较不等 就弹出错误信息框了
0040A3D8    .  3B5D DC          cmp ebx,dword ptr ss:[ebp-24]
比较不等 就弹出错误信息框了
0040A3DB    .  75 78            jnz short 6c.0040A455关键跳转 爆破点阿
0040A3DD    .  8B35 94104000    mov esi,dword ptr ds:[<&MSVBVM60.__vbaVarDup>]        ;  MSVBVM60.__vbaVarDup
0040A3E3    .  B9 04000280      mov ecx,80020004
0040A3E8    .  894D 98          mov dword ptr ss:[ebp-68],ecx
0040A3EB    .  B8 0A000000      mov eax,0A
0040A3F0    .  894D A8          mov dword ptr ss:[ebp-58],ecx
0040A3F3    .  BF 08000000      mov edi,8
0040A3F8    .  8D95 70FFFFFF    lea edx,dword ptr ss:[ebp-90]
0040A3FE    .  8D4D B0          lea ecx,dword ptr ss:[ebp-50]
0040A401    .  8945 90          mov dword ptr ss:[ebp-70],eax
0040A404    .  8945 A0          mov dword ptr ss:[ebp-60],eax
0040A407    .  C785 78FFFFFF 80>mov dword ptr ss:[ebp-88],6c.00409A80
0040A411    .  89BD 70FFFFFF    mov dword ptr ss:[ebp-90],edi
0040A417    .  FFD6             call esi                                              ;  <&MSVBVM60.__vbaVarDup>
0040A419    .  8D55 80          lea edx,dword ptr ss:[ebp-80]
0040A41C    .  8D4D C0          lea ecx,dword ptr ss:[ebp-40]
0040A41F    .  C745 88 6C9A4000 mov dword ptr ss:[ebp-78],6c.00409A6C
0040A426    .  897D 80          mov dword ptr ss:[ebp-80],edi
0040A429    .  FFD6             call esi                                              ;  <&MSVBVM60.__vbaVarDup>
0040A42B    .  8D4D 90          lea ecx,dword ptr ss:[ebp-70]
0040A42E    .  8D55 A0          lea edx,dword ptr ss:[ebp-60]
0040A431    .  51               push ecx
0040A432    .  8D45 B0          lea eax,dword ptr ss:[ebp-50]
0040A435    .  52               push edx
0040A436    .  50               push eax
0040A437    .  8D4D C0          lea ecx,dword ptr ss:[ebp-40]
0040A43A    .  6A 00            push 0
0040A43C    .  51               push ecx
0040A43D    .  FF15 2C104000    call dword ptr ds:[<&MSVBVM60.#595>]                  ;  MSVBVM60.rtcMsgBox
0040A443    .  8D55 90          lea edx,dword ptr ss:[ebp-70]
0040A446    .  8D45 A0          lea eax,dword ptr ss:[ebp-60]
0040A449    .  52               push edx
0040A44A    .  8D4D B0          lea ecx,dword ptr ss:[ebp-50]
0040A44D    .  50               push eax
0040A44E    .  8D55 C0          lea edx,dword ptr ss:[ebp-40]
0040A451    .  51               push ecx
0040A452    .  52               push edx
0040A453    .  EB 76            jmp short 6c.0040A4CB
0040A455    >  8B35 94104000    mov esi,dword ptr ds:[<&MSVBVM60.__vbaVarDup>]        ;  MSVBVM60.__vbaVarDup
0040A45B    .  B9 04000280      mov ecx,80020004
0040A460    .  894D 98          mov dword ptr ss:[ebp-68],ecx
0040A463    .  B8 0A000000      mov eax,0A
0040A468    .  894D A8          mov dword ptr ss:[ebp-58],ecx
0040A46B    .  BF 08000000      mov edi,8
0040A470    .  8D95 70FFFFFF    lea edx,dword ptr ss:[ebp-90]
0040A476    .  8D4D B0          lea ecx,dword ptr ss:[ebp-50]
0040A479    .  8945 90          mov dword ptr ss:[ebp-70],eax
0040A47C    .  8945 A0          mov dword ptr ss:[ebp-60],eax
0040A47F    .  C785 78FFFFFF B0>mov dword ptr ss:[ebp-88],6c.00409AB0
0040A489    .  89BD 70FFFFFF    mov dword ptr ss:[ebp-90],edi
0040A48F    .  FFD6             call esi                                              ;  <&MSVBVM60.__vbaVarDup>
0040A491    .  8D55 80          lea edx,dword ptr ss:[ebp-80]
0040A494    .  8D4D C0          lea ecx,dword ptr ss:[ebp-40]
0040A497    .  C745 88 909A4000 mov dword ptr ss:[ebp-78],6c.00409A90
0040A49E    .  897D 80          mov dword ptr ss:[ebp-80],edi
0040A4A1    .  FFD6             call esi                                              ;  <&MSVBVM60.__vbaVarDup>
0040A4A3    .  8D45 90          lea eax,dword ptr ss:[ebp-70]
0040A4A6    .  8D4D A0          lea ecx,dword ptr ss:[ebp-60]
0040A4A9    .  50               push eax
0040A4AA    .  8D55 B0          lea edx,dword ptr ss:[ebp-50]
0040A4AD    .  51               push ecx
0040A4AE    .  52               push edx
0040A4AF    .  8D45 C0          lea eax,dword ptr ss:[ebp-40]
0040A4B2    .  6A 00            push 0
0040A4B4    .  50               push eax
0040A4B5    .  FF15 2C104000    call dword ptr ds:[<&MSVBVM60.#595>]                  ;  MSVBVM60.rtcMsgBox

所以给予这个原理注册及并不难 我也看了其他他们写的 比较复杂 好要穷举。主要就是没有把CurrentCy数据类型 ,,:)
注册机如下
.版本 2

.子程序 运算, 文本型
.参数 Name, 文本型
.局部变量 Namea, 长整数型

' 常量 77169
Namea = 到整数 (Name)
.如果真 (Namea = 0)
    信息框 (“错误!请输入一个整数!”, 0, )
    返回 (“”)
.如果真结束
Namea = Namea × 10000
Namea = Namea × 2
Namea = Namea + 77169 × 10000
Namea = Namea ÷ 10000
返回 (到文本 (Namea))
确实很简单就使了:)
可用的注册码:
19900114
39877397
通关密码:
38588913
注册码77254995

886::)今天期中考试晚了 休息 所以就写了:)哈

别人的算法:)
第6关 NAME:38588913 KEY:77254995
    NAME:616521 KEY:1310211
算法: int user=38588913;
int flag=77169, n=0;
unsigned long pass=0;
unsigned long ll1=unsigned long((user*10000) % 4294967296);
ll1=unsigned long((ll1*2)% 4294967296) ;
unsigned long ll2=unsigned long((flag*10000) % 4294967296);
unsigned long ll3=ll1+ll2;
while(n<10000)
{ if((ll3+n*4294967296)%10000==0)
    {   pass=unsigned long((ll3+n*4294967296)/10000);
      break;
    }
  n++;
}
我的是不是要简单一点呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
2
支持的说!!!
2005-11-10 19:54
0
雪    币: 1264
活跃值: (612)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主易语言学的不错。
2005-11-10 20:51
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
4
怎么就没有人看呢?
2005-11-11 08:29
0
雪    币: 47147
活跃值: (20470)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 foxabu 发布
怎么就没有人看呢?


将你的CrackMe也放份上来,这样大家可实战操作一下。
2005-11-11 09:00
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
6
不是我的Crackme
2005-11-11 17:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵有点意思
2005-11-12 00:01
0
游客
登录 | 注册 方可回帖
返回
//