[反汇编练习] 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,保存下来。运行程序,程序界面如下:

 

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。

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

  1. 004022C8 . 66:85DB test bx,bx
  2. 004022CB . 0F84 C0000000 je 00402391 ; // 关键跳转,爆破NOP填充
  3. 004022D1 . FF15 74414000 call dword ptr ds:[<&MSVBVM50.#534>] ; msvbvm50.rtcBeep
  4. 004022D7 . 8B1D 98414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>] ; msvbvm50.__vbaVarDup
  5. 004022DD . B9 04000280 mov ecx,0x80020004
  6. 004022E2 . 898D 6CFFFFFF mov dword ptr ss:[ebp-0x94],ecx
  7. 004022E8 . B8 0A000000 mov eax,0xA
  8. 004022ED . 898D 7CFFFFFF mov dword ptr ss:[ebp-0x84],ecx
  9. 004022F3 . 8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
  10. 004022F9 . 8D4D 84 lea ecx,dword ptr ss:[ebp-0x7C]
  11. 004022FC . 8985 64FFFFFF mov dword ptr ss:[ebp-0x9C],eax
  12. 00402302 . 8985 74FFFFFF mov dword ptr ss:[ebp-0x8C],eax
  13. 00402308 . C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401CA8 ; RiCHTiG !
  14. 00402312 . C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8
  15. 0040231C . FFD3 call ebx ; <&MSVBVM50.__vbaVarDup>
  16. 0040231E . 8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
  17. 00402324 . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C]
  18. 00402327 . C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401C3C
  19. 00402331 . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
  20. 0040233B . FFD3 call ebx
  21. 0040233D . 8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]
  22. 00402343 . 8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]
  23. 00402349 . 52 push edx
  24. 0040234A . 8D4D 84 lea ecx,dword ptr ss:[ebp-0x7C]
  25. 0040234D . 50 push eax
  26. 0040234E . 51 push ecx
  27. 0040234F . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
  28. 00402352 . 6A 30 push 0x30
  29. 00402354 . 52 push edx
  30. 00402355 . FF15 28414000 call dword ptr ds:[<&MSVBVM50.#595>] ; msvbvm50.rtcMsgBox
  31. 0040235B . 8D95 14FFFFFF lea edx,dword ptr ss:[ebp-0xEC]
  32. 00402361 . 8D4D AC lea ecx,dword ptr ss:[ebp-0x54]
  33. 00402364 . 8985 1CFFFFFF mov dword ptr ss:[ebp-0xE4],eax
  34. 0040236A . C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],0x3
  35. 00402374 . FFD6 call esi
  36. 00402376 . 8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]
  37. 0040237C . 8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
  38. 00402382 . 50 push eax
  39. 00402383 . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C]
  40. 00402386 . 51 push ecx
  41. 00402387 . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C]
  42. 0040238A . 52 push edx
  43. 0040238B . 50 push eax
  44. 0040238C . E9 B5000000 jmp 00402446
  45. 00402391 > 8B1D 98414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>] ; msvbvm50.__vbaVarDup
  46. 00402397 . B9 04000280 mov ecx,0x80020004
  47. 0040239C . 898D 6CFFFFFF mov dword ptr ss:[ebp-0x94],ecx
  48. 004023A2 . B8 0A000000 mov eax,0xA
  49. 004023A7 . 898D 7CFFFFFF mov dword ptr ss:[ebp-0x84],ecx
  50. 004023AD . 8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
  51. 004023B3 . 8D4D 84 lea ecx,dword ptr ss:[ebp-0x7C]
  52. 004023B6 . 8985 64FFFFFF mov dword ptr ss:[ebp-0x9C],eax
  53. 004023BC . 8985 74FFFFFF mov dword ptr ss:[ebp-0x8C],eax
  54. 004023C2 . C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401D9C ; LEiDER Falsch !
  55. 004023CC . C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8
  56. 004023D6 . FFD3 call ebx ; <&MSVBVM50.__vbaVarDup>
  57. 004023D8 . 8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
  58. 004023DE . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C]
  59. 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
  60. 004023EB . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
  61. 004023F5 . FFD3 call ebx
  62. 004023F7 . 8D8D 64FFFFFF lea ecx,dword ptr ss:[ebp-0x9C]
  63. 004023FD . 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
  64. 00402403 . 51 push ecx
  65. 00402404 . 8D45 84 lea eax,dword ptr ss:[ebp-0x7C]
  66. 00402407 . 52 push edx
  67. 00402408 . 50 push eax
  68. 00402409 . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C]
  69. 0040240C . 6A 10 push 0x10
  70. 0040240E . 51 push ecx
  71. 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和寄存器状态,幸运地将整个流程分析了下来,分析后的代码如下:

  1. 0040209C . 68 A0000000 push 0xA0
  2. 004020A1 . 68 201C4000 push 00401C20
  3. 004020A6 . 53 push ebx
  4. 004020A7 . 50 push eax
  5. 004020A8 . FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaHresultCheckOb>; msvbvm50.__vbaHresultCheckObj
  6. 004020AE > 8B45 A8 mov eax,dword ptr ss:[ebp-0x58] ; // eax=bbdxf
  7. 004020B1 . 8975 A8 mov dword ptr ss:[ebp-0x58],esi
  8. 004020B4 . 8B35 FC404000 mov esi,dword ptr ds:[<&MSVBVM50.__vbaVarMove>] ; msvbvm50.__vbaVarMove
  9. 004020BA . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
  10. 004020BD . 8D4D BC lea ecx,dword ptr ss:[ebp-0x44]
  11. 004020C0 . 8945 9C mov dword ptr ss:[ebp-0x64],eax
  12. 004020C3 . C745 94 08000>mov dword ptr ss:[ebp-0x6C],0x8
  13. 004020CA . FFD6 call esi ; <&MSVBVM50.__vbaVarMove>
  14. 004020CC . 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]
  15. 004020CF . FF15 B4414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeObj>] ; msvbvm50.__vbaFreeObj
  16. 004020D5 . B8 01000000 mov eax,0x1
  17. 004020DA . 8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]
  18. 004020E0 . 8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
  19. 004020E6 . 8985 4CFFFFFF mov dword ptr ss:[ebp-0xB4],eax
  20. 004020EC . 8D55 BC lea edx,dword ptr ss:[ebp-0x44]
  21. 004020EF . 51 push ecx ; 0
  22. 004020F0 . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C]
  23. 004020F3 . BB 02000000 mov ebx,0x2
  24. 004020F8 . 52 push edx ; // bbdxf
  25. 004020F9 . 50 push eax ; // bbdxf
  26. 004020FA . 899D 54FFFFFF mov dword ptr ss:[ebp-0xAC],ebx
  27. 00402100 . 899D 44FFFFFF mov dword ptr ss:[ebp-0xBC],ebx
  28. 00402106 . FF15 18414000 call dword ptr ds:[<&MSVBVM50.__vbaLenVar>] ; msvbvm50.__vbaLenVar
  29. 0040210C . 8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC] ; |
  30. 00402112 . 50 push eax ; |Arg5
  31. 00402113 . 8D95 E8FEFFFF lea edx,dword ptr ss:[ebp-0x118] ; |// eax=5
  32. 00402119 . 51 push ecx ; |Arg4
  33. 0040211A . 8D85 F8FEFFFF lea eax,dword ptr ss:[ebp-0x108] ; |// ecx=1
  34. 00402120 . 52 push edx ; |Arg3
  35. 00402121 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24] ; |
  36. 00402124 . 50 push eax ; |Arg2
  37. 00402125 . 51 push ecx ; |Arg1
  38. 00402126 . FF15 20414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForInit>] ; \__vbaVarForInit
  39. 0040212C . 8B3D 04414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaFreeVarList>; msvbvm50.__vbaFreeVarList
  40. 00402132 > 85C0 test eax,eax ; // eax是否循环的标志
  41. 00402134 . 0F84 9C000000 je 004021D6
  42. 0040213A . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
  43. 0040213D . 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
  44. 00402140 . 52 push edx
  45. 00402141 . 50 push eax ; 1++
  46. 00402142 . C745 9C 01000>mov dword ptr ss:[ebp-0x64],0x1
  47. 00402149 . 895D 94 mov dword ptr ss:[ebp-0x6C],ebx
  48. 0040214C . FF15 90414000 call dword ptr ds:[<&MSVBVM50.__vbaI4Var>] ; msvbvm50.__vbaI4Var
  49. 00402152 . 8D4D BC lea ecx,dword ptr ss:[ebp-0x44] ; |// eax=当前的index
  50. 00402155 . 50 push eax ; |Arg3 // 1++
  51. 00402156 . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C] ; |
  52. 00402159 . 51 push ecx ; |Arg2 // bbdxf
  53. 0040215A . 52 push edx ; |Arg1 // 1
  54. 0040215B . FF15 38414000 call dword ptr ds:[<&MSVBVM50.#632>] ; \rtcMidCharVar
  55. 00402161 . 8D45 84 lea eax,dword ptr ss:[ebp-0x7C] ; // eax=b // 第一个字符
  56. 00402164 . 8D4D A8 lea ecx,dword ptr ss:[ebp-0x58]
  57. 00402167 . 50 push eax ; /Arg2
  58. 00402168 . 51 push ecx ; |Arg1
  59. 00402169 . FF15 70414000 call dword ptr ds:[<&MSVBVM50.__vbaStrVarVal>] ; \__vbaStrVarVal
  60. 0040216F . 50 push eax ; /Arg1
  61. 00402170 . FF15 0C414000 call dword ptr ds:[<&MSVBVM50.#516>] ; \rtcAnsiValueBstr
  62. 00402176 . 66:8985 4CFFF>mov word ptr ss:[ebp-0xB4],ax ; // 将字符b转换为ASCII码整数
  63. 0040217D . 8D55 CC lea edx,dword ptr ss:[ebp-0x34] ; // edx=0+62+xx+xx...
  64. 00402180 . 8D85 44FFFFFF lea eax,dword ptr ss:[ebp-0xBC] ; // eax=b=0x62
  65. 00402186 . 52 push edx ; /Arg3
  66. 00402187 . 8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C] ; |// ecx=3
  67. 0040218D . 50 push eax ; |Arg2
  68. 0040218E . 51 push ecx ; |Arg1
  69. 0040218F . 899D 44FFFFFF mov dword ptr ss:[ebp-0xBC],ebx ; |
  70. 00402195 . FF15 94414000 call dword ptr ds:[<&MSVBVM50.__vbaVarAdd>] ; \__vbaVarAdd
  71. 0040219B . 8BD0 mov edx,eax
  72. 0040219D . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
  73. 004021A0 . FFD6 call esi ; // 赋值Mov
  74. 004021A2 . 8D4D A8 lea ecx,dword ptr ss:[ebp-0x58]
  75. 004021A5 . FF15 B8414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>] ; msvbvm50.__vbaFreeStr
  76. 004021AB . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C]
  77. 004021AE . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C]
  78. 004021B1 . 52 push edx
  79. 004021B2 . 50 push eax
  80. 004021B3 . 53 push ebx
  81. 004021B4 . FFD7 call edi
  82. 004021B6 . 83C4 0C add esp,0xC
  83. 004021B9 . 8D8D E8FEFFFF lea ecx,dword ptr ss:[ebp-0x118]
  84. 004021BF . 8D95 F8FEFFFF lea edx,dword ptr ss:[ebp-0x108]
  85. 004021C5 . 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
  86. 004021C8 . 51 push ecx ; /Arg3
  87. 004021C9 . 52 push edx ; |Arg2
  88. 004021CA . 50 push eax ; |Arg1
  89. 004021CB . FF15 AC414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForNext>] ; \msvbvm50.__vbaVarForNext // 类似于for循环
  90. 004021D1 .^ E9 5CFFFFFF jmp 00402132
  91. 004021D6 > 8D4D CC lea ecx,dword ptr ss:[ebp-0x34] ; // 循环结束,跳到这里
  92. 004021D9 . 8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
  93. 004021DF . 51 push ecx ; /Arg3 // Name的每个字符ASCII码值相加的结果,0x206=518
  94. 004021E0 . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C] ; |
  95. 004021E3 . 52 push edx ; |Arg2 //1 / 1234567890
  96. 004021E4 . 50 push eax ; |Arg1 // 1
  97. 004021E5 . C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],0x499602D2 ; |// 十进制1234567890
  98. 004021EF . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x3 ; |// 修改了[ebp-0xac]的数据类型,相当于edx指针的值
  99. 004021F9 . FF15 5C414000 call dword ptr ds:[<&MSVBVM50.__vbaVarMul>] ; \msvbvm50.__vbaVarMul // 两个变量相乘
  100. 004021FF . 8BD0 mov edx,eax ; // 结果存在[ebp-0x34]
  101. 00402201 . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34] ; // 206
  102. 00402204 . FFD6 call esi
  103. 00402206 . 8B1D A0414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaMidStmtVar>>; msvbvm50.__vbaMidStmtVar
  104. 0040220C . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
  105. 0040220F . 51 push ecx ; // ecx=639506167020.0 //64bit double,试出来的
  106. 00402210 . 6A 04 push 0x4 ; // 插入的位置
  107. 00402212 . 8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
  108. 00402218 . 6A 01 push 0x1
  109. 0040221A . 52 push edx
  110. 0040221B . C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401C34 ; -
  111. 00402225 . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
  112. 0040222F . FFD3 call ebx ; <&MSVBVM50.__vbaMidStmtVar>
  113. 00402231 . 8D45 CC lea eax,dword ptr ss:[ebp-0x34] ; // eax=639-06167020
  114. 00402234 . 8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC] ; // ecx=-
  115. 0040223A . 50 push eax
  116. 0040223B . 6A 09 push 0x9 ; // 插入的位置
  117. 0040223D . 6A 01 push 0x1
  118. 0040223F . 51 push ecx
  119. 00402240 . C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401C34 ; -
  120. 0040224A . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
  121. 00402254 . FFD3 call ebx
  122. 00402256 . 8B45 08 mov eax,dword ptr ss:[ebp+0x8] ; // [ebp-0x34] = 639-0616-020
  123. 00402259 . 50 push eax
  124. 0040225A . 8B10 mov edx,dword ptr ds:[eax]
  125. 0040225C . FF92 04030000 call dword ptr ds:[edx+0x304]
  126. 00402262 . 50 push eax
  127. 00402263 . 8D45 A4 lea eax,dword ptr ss:[ebp-0x5C]
  128. 00402266 . 50 push eax
  129. 00402267 . FF15 24414000 call dword ptr ds:[<&MSVBVM50.__vbaObjSet>] ; msvbvm50.__vbaObjSet
  130. 0040226D . 8BD8 mov ebx,eax
  131. 0040226F . 8D55 A8 lea edx,dword ptr ss:[ebp-0x58]
  132. 00402272 . 52 push edx
  133. 00402273 . 53 push ebx
  134. 00402274 . 8B0B mov ecx,dword ptr ds:[ebx]
  135. 00402276 . FF91 A0000000 call dword ptr ds:[ecx+0xA0]
  136. 0040227C . 85C0 test eax,eax
  137. 0040227E . 7D 12 jge short 00402292
  138. 00402280 . 68 A0000000 push 0xA0
  139. 00402285 . 68 201C4000 push 00401C20
  140. 0040228A . 53 push ebx
  141. 0040228B . 50 push eax
  142. 0040228C . FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaHresultCheckOb>; msvbvm50.__vbaHresultCheckObj
  143. 00402292 > 8B45 A8 mov eax,dword ptr ss:[ebp-0x58]
  144. 00402295 . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
  145. 00402298 . 8945 9C mov dword ptr ss:[ebp-0x64],eax
  146. 0040229B . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C]
  147. 0040229E . 50 push eax ; /Arg2 // 123321,key
  148. 0040229F . 51 push ecx ; |Arg1 // 639-0616-020
  149. 004022A0 . C745 A8 00000>mov dword ptr ss:[ebp-0x58],0x0 ; |
  150. 004022A7 . C745 94 08800>mov dword ptr ss:[ebp-0x6C],0x8008 ; |
  151. 004022AE . FF15 48414000 call dword ptr ds:[<&MSVBVM50.__vbaVarTstEq>] ; \msvbvm50.__vbaVarTstEq //比较两个变量值是否相等,参数是eax和ecx
  152. 004022B4 . 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]
  153. 004022B7 . 8BD8 mov ebx,eax
  154. 004022B9 . FF15 B4414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeObj>] ; msvbvm50.__vbaFreeObj
  155. 004022BF . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C]
  156. 004022C2 . FF15 00414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeVar>] ; msvbvm50.__vbaFreeVar
  157. 004022C8 . 66:85DB test bx,bx
  158. 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注册机如下:

  1. #include "stdafx.h"
  2. #include "iostream"
  3.  
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. char Name[100] = {0};//"bbdxf";
  7. char key[100] = {0};
  8. int nCode = 0;
  9. printf("Input your Name:");
  10. gets_s(Name,100);
  11. if ( strlen(Name) > 0 )
  12. {
  13. for( int i=0;i<strlen(Name);i++ )
  14. {
  15. nCode += Name[i];
  16. }
  17. long double dNum = 1234567890; // 注意数据类型,VB中是64bit的float
  18. dNum *= nCode;
  19. sprintf(key,"%.0llf",dNum);
  20. key[4-1] = '-';
  21. key[9-1] = '-';
  22. printf("Key: %s\r\n",key);
  23. }else{
  24. printf("input error!\r\n");
  25. }
  26. system("pause");
  27. return 0;
  28. }

重启程序,测试效果:

 

-----------

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

delphi:

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

VB:

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

 

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

 

BY  笨笨D幸福

[反汇编练习] 160个CrackMe之009的更多相关文章

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

    [反汇编练习] 160个CrackMe之010. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

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

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. mysql federated engine

    mysql)) -> engine=federated -> connection='mysql://root@localhost:3306/t1/t';

  2. html——a标签添加点击事件,火狐浏览器直接显示0

    一.问题描述 给一个a标签添加了点击事件,页面直接给了0如下图 二.问题解决 后台调试模式下,发现也进了后台方法,也返回了页面. 于是想到先把页面里大部分内容去掉,去掉所有js,查看是否是部分代码有问 ...

  3. [bzoj 3031] 理科男

    题意 给定一个进制分数 求是否是循环小数,且求出循环节长度 题解 暴力 il int find(int p){ int head=last[p%mod]; while(head&&pr ...

  4. 如何在winform DataGridView控件的DataGridViewButtonColumn按钮列中禁用按钮

    原文:http://msdn.microsoft.com/en-us/library/ms171619(v=vs.85).ASPX public class DataGridViewDisableBu ...

  5. DllImport的具体用法

    现在是更深入地进行探讨的时候了.在对托管代码进行 P/Invoke 调用时,DllImportAttribute 类型扮演着重要的角色.DllImportAttribute 的主要作用是给 CLR 指 ...

  6. 如何防止通过IP地址访问Tomcat管理页面

    方法:建议修改webapps下面的原始文件夹的名称,比如加一个后缀: 当需要用管理页面的时候,可以将含有manager的文件夹的后缀去掉即可 manager和host-manager共2个文件夹

  7. C# get set方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 【PHPsocket编程专题(实战篇②)】兼容 Curl/Socket/Stream 的 HTTP 操作类[转]

    <?php /************************************************************ * 描述:HTTP操作类 * 作者:heiyeluren ...

  9. LR_问题_运行场景时提示scripts you are running in invalid

    问题描述 脚本在virtual user generator中运行正常. 在Controller中运行场景时报错: the target you defined cannot be reached. ...

  10. Hibernate逍遥游记-第8章 映射组成关系(<component>、<parent>)

    一. 1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...