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