[反汇编练习] 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,并且根据提示信息大概猜测应该表达的意思是相反的。(囧,不知哪国语言,实在看不懂作者说的啥意思。) [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;
}
重启程序,测试效果:
----------- VB和Delphi函数反汇编经验小结如下: delphi: 函数的参数大部分是放在eax和ecx中,返回值主要存在eax中。字符串和数值计算按照正常方式进行,无特殊结构。 VB: 函数大部分参数是放在eax和ecx中,返回值放在[ebp-0x34]中。字符串前两个4字节存储数据类型先关信息,第三个4字节为字符串地址。数值相加减乘除使用浮点数进行。64Bit double.
PS: 以上皆为个人经验总结,希望大牛多给点经验之谈!
BY 笨笨D幸福
|