zoukankan      html  css  js  c++  java
  • [反汇编练习] 160个CrackMe之009

    [反汇编练习] 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不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

    wps_clip_image-142827

     

    2、程序分析:

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

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

    2

    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)。

    1

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

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

    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 !  Andrenalin@gmx.net
    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和寄存器状态,幸运地将整个流程分析了下来,分析后的代码如下:

    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>]              ; 
    tcMidCharVar
    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>]              ; 
    tcAnsiValueBstr
    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注册机如下:

    #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
    ",key);
    	}else{
    		printf("input error!
    ");
    	}
    	system("pause");
    	return 0;
    }

    重启程序,测试效果:

    3

     

    -----------

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

    delphi:

    函数的参数大部分是放在eax和ecx中,返回值主要存在eax中。字符串和数值计算按照正常方式进行,无特殊结构。

    VB:

    函数大部分参数是放在eax和ecx中,返回值放在[ebp-0x34]中。字符串前两个4字节存储数据类型先关信息,第三个4字节为字符串地址。数值相加减乘除使用浮点数进行。64Bit double.

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

    BY  笨笨D幸福

  • 相关阅读:
    构建之法阅读笔记02
    学习进度条
    构建之法阅读笔记01
    c++ 与C的区别
    c++ 菜单动态效果
    c++ 方框中绘制菜单代码
    c++ 绘制方框
    c++ 条件编译
    c++ 预处理和多重替换
    c++ 文件共享打开
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3793519.html
Copyright © 2011-2022 走看看