华夏黑客同盟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++;
}
我的是不是要简单一点呢?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!