吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12503|回复: 18
收起左侧

[原创] [反汇编练习] 160个CrackMe之009

  [复制链接]
44018723 发表于 2014-6-17 21:34

[反汇编练习] 160个CrackMe之009.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY  密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第9个Andrénalin.2,保存下来。运行程序,程序界面如下:


2.png

3、思路分析和破解流程:

看到上面的界面是不是感到很亲切?!!标准的信息框,老办法就可以搞定(暂停,然后Ctrl+K查看堆栈,哈哈!)。不过,保险起见,我们先用PEID查看下加壳情况:Microsoft Visual Basic 5.0 / 6.0,纯粹的VB程序,绝对良心啊!(PS:作者是良心了,但是VB反汇编跟踪算法绝对不良心啊!大坑啊!)

好了,正式开始:

1、将exe拖到OD中,直接运行。在exe中输入伪码,Name: bbdxf, Key:123321。点击【OK】按钮,弹出错误对话框。

2、不理会弹出的错误对话框,回到OD,点击【暂停】按钮(F12),点击【K】按钮(Ctrl+K)。


3、根据堆栈信息,一下就找到了信息框函数rtcMsgBox,选中,右键->Show call。

1.PNG

4、在反汇编窗口跟随的Call位置向上查看,发现很近的地方直接就有两处rtcMsgBox,并且根据提示信息大概猜测应该表达的意思是相反的。(囧,不知哪国语言,实在看不懂作者说的啥意思。)

[Asm] 纯文本查看 复制代码
004022C8   .  66:85DB       test bx,bx
004022CB   .  0F84 C0000000 je 00402391                                       ;  // 关键跳转,爆破NOP填充
004022D1   .  FF15 74414000 call dword ptr ds:[<&MSVBVM50.#534>]              ;  msvbvm50.rtcBeep
004022D7   .  8B1D 98414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>]    ;  msvbvm50.__vbaVarDup
004022DD   .  B9 04000280   mov ecx,0x80020004
004022E2   .  898D 6CFFFFFF mov dword ptr ss:[ebp-0x94],ecx
004022E8   .  B8 0A000000   mov eax,0xA
004022ED   .  898D 7CFFFFFF mov dword ptr ss:[ebp-0x84],ecx
004022F3   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
004022F9   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
004022FC   .  8985 64FFFFFF mov dword ptr ss:[ebp-0x9C],eax
00402302   .  8985 74FFFFFF mov dword ptr ss:[ebp-0x8C],eax
00402308   .  C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401CA8              ;  RiCHTiG !
00402312   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8
0040231C   .  FFD3          call ebx                                          ;  <&MSVBVM50.__vbaVarDup>
0040231E   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
00402324   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
00402327   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401C3C
00402331   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
0040233B   .  FFD3          call ebx
0040233D   .  8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]
00402343   .  8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]
00402349   .  52            push edx
0040234A   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
0040234D   .  50            push eax
0040234E   .  51            push ecx
0040234F   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
00402352   .  6A 30         push 0x30
00402354   .  52            push edx
00402355   .  FF15 28414000 call dword ptr ds:[<&MSVBVM50.#595>]              ;  msvbvm50.rtcMsgBox
0040235B   .  8D95 14FFFFFF lea edx,dword ptr ss:[ebp-0xEC]
00402361   .  8D4D AC       lea ecx,dword ptr ss:[ebp-0x54]
00402364   .  8985 1CFFFFFF mov dword ptr ss:[ebp-0xE4],eax
0040236A   .  C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],0x3
00402374   .  FFD6          call esi
00402376   .  8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]
0040237C   .  8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
00402382   .  50            push eax
00402383   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
00402386   .  51            push ecx
00402387   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
0040238A   .  52            push edx
0040238B   .  50            push eax
0040238C   .  E9 B5000000   jmp 00402446
00402391   >  8B1D 98414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>]    ;  msvbvm50.__vbaVarDup
00402397   .  B9 04000280   mov ecx,0x80020004
0040239C   .  898D 6CFFFFFF mov dword ptr ss:[ebp-0x94],ecx
004023A2   .  B8 0A000000   mov eax,0xA
004023A7   .  898D 7CFFFFFF mov dword ptr ss:[ebp-0x84],ecx
004023AD   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
004023B3   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
004023B6   .  8985 64FFFFFF mov dword ptr ss:[ebp-0x9C],eax
004023BC   .  8985 74FFFFFF mov dword ptr ss:[ebp-0x8C],eax
004023C2   .  C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401D9C              ;  LEiDER Falsch !
004023CC   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8
004023D6   .  FFD3          call ebx                                          ;  <&MSVBVM50.__vbaVarDup>
004023D8   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
004023DE   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
004023E1   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401CC0              ;  Leider Falsch!   Nochmal veruschen ! Wenn Du es nicht schaffen solltest, schreib mir !  [email]Andrenalin@gmx.net[/email]
004023EB   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
004023F5   .  FFD3          call ebx
004023F7   .  8D8D 64FFFFFF lea ecx,dword ptr ss:[ebp-0x9C]
004023FD   .  8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
00402403   .  51            push ecx
00402404   .  8D45 84       lea eax,dword ptr ss:[ebp-0x7C]
00402407   .  52            push edx
00402408   .  50            push eax
00402409   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
0040240C   .  6A 10         push 0x10
0040240E   .  51            push ecx
0040240F   .  FF15 28414000 call dword ptr ds:[<&MSVBVM50.#595>]              ;  msvbvm50.rtcMsgBox

5、继续向上查看代码,最近的地方就有一个JE跳转,选中这个跳转,根据OD显示的提示,猜测这个JE语句就是成功和失败的关键跳。我们可以尝试一下。选中je 00402391,鼠标右键->Binary->Fill with nops,F9运行程序。

回到exe程序,再次点击【ok】按钮,哈哈,爆破成功了!


4、注册机探索:

关键的JE跳转我们已经找到了,相信关键的CALL肯定夜离我们不远,我们继续向上查找,发现代码大部分是在调用VB的函数,由于本人对于VB底层函数接触很少(是基本就没接触过),所以参考一些前辈们的经验(http://www.cnblogs.com/bbdxf/p/3780187.html),通过F8单步查看每个函数的push和寄存器状态,幸运地将整个流程分析了下来,分析后的代码如下:

[Asm] 纯文本查看 复制代码
0040209C   .  68 A0000000   push 0xA0
004020A1   .  68 201C4000   push 00401C20
004020A6   .  53            push ebx
004020A7   .  50            push eax
004020A8   .  FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaHresultCheckOb>;  msvbvm50.__vbaHresultCheckObj
004020AE   >  8B45 A8       mov eax,dword ptr ss:[ebp-0x58]                   ;  // eax=bbdxf
004020B1   .  8975 A8       mov dword ptr ss:[ebp-0x58],esi
004020B4   .  8B35 FC404000 mov esi,dword ptr ds:[<&MSVBVM50.__vbaVarMove>]   ;  msvbvm50.__vbaVarMove
004020BA   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
004020BD   .  8D4D BC       lea ecx,dword ptr ss:[ebp-0x44]
004020C0   .  8945 9C       mov dword ptr ss:[ebp-0x64],eax
004020C3   .  C745 94 08000>mov dword ptr ss:[ebp-0x6C],0x8
004020CA   .  FFD6          call esi                                          ;  <&MSVBVM50.__vbaVarMove>
004020CC   .  8D4D A4       lea ecx,dword ptr ss:[ebp-0x5C]
004020CF   .  FF15 B4414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeObj>]      ;  msvbvm50.__vbaFreeObj
004020D5   .  B8 01000000   mov eax,0x1
004020DA   .  8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]
004020E0   .  8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
004020E6   .  8985 4CFFFFFF mov dword ptr ss:[ebp-0xB4],eax
004020EC   .  8D55 BC       lea edx,dword ptr ss:[ebp-0x44]
004020EF   .  51            push ecx                                          ;  0
004020F0   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
004020F3   .  BB 02000000   mov ebx,0x2
004020F8   .  52            push edx                                          ;  // bbdxf
004020F9   .  50            push eax                                          ;  // bbdxf
004020FA   .  899D 54FFFFFF mov dword ptr ss:[ebp-0xAC],ebx
00402100   .  899D 44FFFFFF mov dword ptr ss:[ebp-0xBC],ebx
00402106   .  FF15 18414000 call dword ptr ds:[<&MSVBVM50.__vbaLenVar>]       ;  msvbvm50.__vbaLenVar
0040210C   .  8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC]                   ; |
00402112   .  50            push eax                                          ; |Arg5
00402113   .  8D95 E8FEFFFF lea edx,dword ptr ss:[ebp-0x118]                  ; |// eax=5
00402119   .  51            push ecx                                          ; |Arg4
0040211A   .  8D85 F8FEFFFF lea eax,dword ptr ss:[ebp-0x108]                  ; |// ecx=1
00402120   .  52            push edx                                          ; |Arg3
00402121   .  8D4D DC       lea ecx,dword ptr ss:[ebp-0x24]                   ; |
00402124   .  50            push eax                                          ; |Arg2
00402125   .  51            push ecx                                          ; |Arg1
00402126   .  FF15 20414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForInit>]   ; \__vbaVarForInit
0040212C   .  8B3D 04414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaFreeVarList>;  msvbvm50.__vbaFreeVarList
00402132   >  85C0          test eax,eax                                      ;  // eax是否循环的标志
00402134   .  0F84 9C000000 je 004021D6
0040213A   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
0040213D   .  8D45 DC       lea eax,dword ptr ss:[ebp-0x24]
00402140   .  52            push edx
00402141   .  50            push eax                                          ;  1++
00402142   .  C745 9C 01000>mov dword ptr ss:[ebp-0x64],0x1
00402149   .  895D 94       mov dword ptr ss:[ebp-0x6C],ebx
0040214C   .  FF15 90414000 call dword ptr ds:[<&MSVBVM50.__vbaI4Var>]        ;  msvbvm50.__vbaI4Var
00402152   .  8D4D BC       lea ecx,dword ptr ss:[ebp-0x44]                   ; |// eax=当前的index
00402155   .  50            push eax                                          ; |Arg3 // 1++
00402156   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]                   ; |
00402159   .  51            push ecx                                          ; |Arg2 // bbdxf
0040215A   .  52            push edx                                          ; |Arg1 // 1
0040215B   .  FF15 38414000 call dword ptr ds:[<&MSVBVM50.#632>]              ; \rtcMidCharVar
00402161   .  8D45 84       lea eax,dword ptr ss:[ebp-0x7C]                   ;  // eax=b // 第一个字符
00402164   .  8D4D A8       lea ecx,dword ptr ss:[ebp-0x58]
00402167   .  50            push eax                                          ; /Arg2
00402168   .  51            push ecx                                          ; |Arg1
00402169   .  FF15 70414000 call dword ptr ds:[<&MSVBVM50.__vbaStrVarVal>]    ; \__vbaStrVarVal
0040216F   .  50            push eax                                          ; /Arg1
00402170   .  FF15 0C414000 call dword ptr ds:[<&MSVBVM50.#516>]              ; \rtcAnsiValueBstr
00402176   .  66:8985 4CFFF>mov word ptr ss:[ebp-0xB4],ax                     ;  // 将字符b转换为ASCII码整数
0040217D   .  8D55 CC       lea edx,dword ptr ss:[ebp-0x34]                   ;  // edx=0+62+xx+xx...
00402180   .  8D85 44FFFFFF lea eax,dword ptr ss:[ebp-0xBC]                   ;  // eax=b=0x62
00402186   .  52            push edx                                          ; /Arg3
00402187   .  8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]                   ; |// ecx=3
0040218D   .  50            push eax                                          ; |Arg2
0040218E   .  51            push ecx                                          ; |Arg1
0040218F   .  899D 44FFFFFF mov dword ptr ss:[ebp-0xBC],ebx                   ; |
00402195   .  FF15 94414000 call dword ptr ds:[<&MSVBVM50.__vbaVarAdd>]       ; \__vbaVarAdd
0040219B   .  8BD0          mov edx,eax
0040219D   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
004021A0   .  FFD6          call esi                                          ;  // 赋值Mov
004021A2   .  8D4D A8       lea ecx,dword ptr ss:[ebp-0x58]
004021A5   .  FF15 B8414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>]      ;  msvbvm50.__vbaFreeStr
004021AB   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
004021AE   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
004021B1   .  52            push edx
004021B2   .  50            push eax
004021B3   .  53            push ebx
004021B4   .  FFD7          call edi
004021B6   .  83C4 0C       add esp,0xC
004021B9   .  8D8D E8FEFFFF lea ecx,dword ptr ss:[ebp-0x118]
004021BF   .  8D95 F8FEFFFF lea edx,dword ptr ss:[ebp-0x108]
004021C5   .  8D45 DC       lea eax,dword ptr ss:[ebp-0x24]
004021C8   .  51            push ecx                                          ; /Arg3
004021C9   .  52            push edx                                          ; |Arg2
004021CA   .  50            push eax                                          ; |Arg1
004021CB   .  FF15 AC414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForNext>]   ; \msvbvm50.__vbaVarForNext  // 类似于for循环
004021D1   .^ E9 5CFFFFFF   jmp 00402132
004021D6   >  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]                   ;  // 循环结束,跳到这里
004021D9   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
004021DF   .  51            push ecx                                          ; /Arg3 // Name的每个字符ASCII码值相加的结果,0x206=518
004021E0   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]                   ; |
004021E3   .  52            push edx                                          ; |Arg2 //1 / 1234567890
004021E4   .  50            push eax                                          ; |Arg1 // 1
004021E5   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],0x499602D2            ; |// 十进制1234567890
004021EF   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x3                   ; |// 修改了[ebp-0xac]的数据类型,相当于edx指针的值
004021F9   .  FF15 5C414000 call dword ptr ds:[<&MSVBVM50.__vbaVarMul>]       ; \msvbvm50.__vbaVarMul  // 两个变量相乘
004021FF   .  8BD0          mov edx,eax                                       ;  // 结果存在[ebp-0x34]
00402201   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]                   ;  // 206
00402204   .  FFD6          call esi
00402206   .  8B1D A0414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaMidStmtVar>>;  msvbvm50.__vbaMidStmtVar
0040220C   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
0040220F   .  51            push ecx                                          ;  // ecx=639506167020.0 //64bit double,试出来的
00402210   .  6A 04         push 0x4                                          ;  // 插入的位置
00402212   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
00402218   .  6A 01         push 0x1
0040221A   .  52            push edx
0040221B   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401C34              ;  -
00402225   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
0040222F   .  FFD3          call ebx                                          ;  <&MSVBVM50.__vbaMidStmtVar>
00402231   .  8D45 CC       lea eax,dword ptr ss:[ebp-0x34]                   ;  // eax=639-06167020
00402234   .  8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]                   ;  // ecx=-
0040223A   .  50            push eax
0040223B   .  6A 09         push 0x9                                          ;  // 插入的位置
0040223D   .  6A 01         push 0x1
0040223F   .  51            push ecx
00402240   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401C34              ;  -
0040224A   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
00402254   .  FFD3          call ebx
00402256   .  8B45 08       mov eax,dword ptr ss:[ebp+0x8]                    ;  // [ebp-0x34] = 639-0616-020
00402259   .  50            push eax
0040225A   .  8B10          mov edx,dword ptr ds:[eax]
0040225C   .  FF92 04030000 call dword ptr ds:[edx+0x304]
00402262   .  50            push eax
00402263   .  8D45 A4       lea eax,dword ptr ss:[ebp-0x5C]
00402266   .  50            push eax
00402267   .  FF15 24414000 call dword ptr ds:[<&MSVBVM50.__vbaObjSet>]       ;  msvbvm50.__vbaObjSet
0040226D   .  8BD8          mov ebx,eax
0040226F   .  8D55 A8       lea edx,dword ptr ss:[ebp-0x58]
00402272   .  52            push edx
00402273   .  53            push ebx
00402274   .  8B0B          mov ecx,dword ptr ds:[ebx]
00402276   .  FF91 A0000000 call dword ptr ds:[ecx+0xA0]
0040227C   .  85C0          test eax,eax
0040227E   .  7D 12         jge short 00402292
00402280   .  68 A0000000   push 0xA0
00402285   .  68 201C4000   push 00401C20
0040228A   .  53            push ebx
0040228B   .  50            push eax
0040228C   .  FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaHresultCheckOb>;  msvbvm50.__vbaHresultCheckObj
00402292   >  8B45 A8       mov eax,dword ptr ss:[ebp-0x58]
00402295   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
00402298   .  8945 9C       mov dword ptr ss:[ebp-0x64],eax
0040229B   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
0040229E   .  50            push eax                                          ; /Arg2 // 123321,key
0040229F   .  51            push ecx                                          ; |Arg1 // 639-0616-020
004022A0   .  C745 A8 00000>mov dword ptr ss:[ebp-0x58],0x0                   ; |
004022A7   .  C745 94 08800>mov dword ptr ss:[ebp-0x6C],0x8008                ; |
004022AE   .  FF15 48414000 call dword ptr ds:[<&MSVBVM50.__vbaVarTstEq>]     ; \msvbvm50.__vbaVarTstEq //比较两个变量值是否相等,参数是eax和ecx
004022B4   .  8D4D A4       lea ecx,dword ptr ss:[ebp-0x5C]
004022B7   .  8BD8          mov ebx,eax
004022B9   .  FF15 B4414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeObj>]      ;  msvbvm50.__vbaFreeObj
004022BF   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
004022C2   .  FF15 00414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeVar>]      ;  msvbvm50.__vbaFreeVar
004022C8   .  66:85DB       test bx,bx
004022CB   .  0F84 C0000000 je 00402391                                       ;  // 关键跳转,爆破NOP填充

整个算法的内容其实不是很复杂,但是VB内部的函数参数传递和返回值传递很【奇葩】,甚至,VB的加减乘除都不能按照C/CPP以及汇编等常理来理解,导致这块算法浪费了大量的时间在分析VB函数及其输入输出方面。还有在VB中,文本是使用Unicode存储,并且每个变量(无论整数,浮点数还是文本),前两个4字节表示数据类型信息,第三个4字节开始才存储数据。所以调试时,必须手动使用dd eax等方式查看每个变量的具体内容


算法概述:

在VB中,使用了 __vbaVarForInit,__vbaFreeVarList,__vbaVarForNext 三个函数完成了一个For循环(参看上面的汇编代码),再循环中,每一次通过rtcMidCharVar取出一个字符,然后使用 rtcAnsiValueBstr 将字符转换为ANSII码值,最后将每个字符的ANSII码值通过 __vbaVarAdd 函数相加。


然后,将结果通过 __vbaVarMul 与 1234567890 想乘,得到的64位浮点型结果转换为整数字符串,通过 __vbaMidStmtVar 将第4个和第9个字符使用字符【-】替代,所得字符串就是最后的Key。

C/CPP注册机如下:

[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include "iostream"
 
int _tmain(int argc, _TCHAR* argv[])
{
    char Name[100] = {0};//"bbdxf";
    char key[100] = {0};
    int nCode = 0;
    printf("Input your Name:");
    gets_s(Name,100);
    if ( strlen(Name) > 0 )
    {
        for( int i=0;i<strlen(Name);i++ )
        {
            nCode += Name[i];
        }
        long double dNum = 1234567890; // 注意数据类型,VB中是64bit的float
        dNum *= nCode;
        sprintf(key,"%.0llf",dNum);
        key[4-1] = '-';
        key[9-1] = '-';
        printf("Key: %s\r\n",key);
    }else{
        printf("input error!\r\n");
    }
    system("pause");
    return 0;
}

重启程序,测试效果:


3.png

-----------

VB和Delphi函数反汇编经验小结如下:

delphi:
函数的参数大部分是放在eax和ecx中,返回值主要存在eax中。字符串和数值计算按照正常方式进行,无特殊结构。
VB:
函数大部分参数是放在eax和ecx中,返回值放在[ebp-0x34]中。字符串前两个4字节存储数据类型先关信息,第三个4字节为字符串地址。数值相加减乘除使用浮点数进行。64Bit double.

PS: 以上皆为个人经验总结,希望大牛多给点经验之谈!

BY  笨笨D幸福

点评

不用重启也可以验证的  发表于 2016-11-5 09:43

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
fishinfire + 1 + 1 谢谢@Thanks!
瓜子吧3 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

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

 楼主| 44018723 发表于 2014-6-17 21:46
小楠 发表于 2014-6-17 21:37
这个肯定是大神注册小号来欺负我们这种真小号的!!

亲,你看看我的注册时间,没比你早多长时间。哎,你只是没看到我为了写一篇帖子准备了多长时间。为了写这一系列帖子,我去年就开始准备了!
小楠 发表于 2014-6-17 21:37
这个肯定是大神注册小号来欺负我们这种真小号的!!
shuguang 发表于 2014-7-15 20:51
看了加密与解密,这个算法终于搞清楚了,只是这个里面的函数参数位置都要加8。有的还有点搞不清楚。
瓜子吧3 发表于 2014-6-17 21:38
牛逼呀~就是没视频,有些问题看下视频就会了~
头像被屏蔽
dingqingyong 发表于 2014-6-17 21:42
提示: 作者被禁止或删除 内容自动屏蔽
从哭泣中醒来 发表于 2014-6-17 23:25
这么快就9了,等0点我来加分,加油
keyrratuff 发表于 2014-6-21 14:50
永远支持你!@~
shuguang 发表于 2014-6-30 21:13
本帖最后由 shuguang 于 2014-6-30 21:43 编辑

太难了。看那些函数就头痛
dych1688 发表于 2014-7-1 21:45
加油,我先往前赶赶,抓紧看看了
dych1688 发表于 2014-7-6 21:46
和上一个一样,破解很easy、
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-17 15:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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