石子店铺帐本(记账软件)算法分析
本帖最后由 F8LEFT 于 2014-9-18 23:33 编辑【破文标题】石子店铺帐本(记账软件)算法分析
【破文作者】F8LEFT
【破文邮箱】[email protected]
【作者主页】就快有的了
【破解工具】OllyDbg
【破解平台】WinXp32
【软件名称】石子店铺帐本
【软件大小】17.6
【来源地址】自行搜索下载
【保护方式】注册码
【软件简介】
这是一款小型店铺记帐软件。功能简单、实用!只需要您动动鼠标,敲几个数字就可以轻松完成账务的录入、查询和统计。
适用于有进销存需求的店铺记帐。
主要功能:
1、进销记录:对进销商品的数量、金额进行添加、修改、删除、查询。
2、库存余量:对同一商品在某时间段内的进货数量、销售数量以及库存量进行统计。
3、盈利情况:对同一商品在某时间段内的销售金额、进货金额以及盈利金额进行统计。
4、图表分析:对某时间段内所有商品的销售金额,按月或年以直方图或曲线图的方式直观的显示出来。
5、通讯录:可记录联系人的详尽联系方式。
----------------------------------------------
【破解声明】 仅供学习与交流之用,请不要用于商业用途。
----------------------------------------------
【破解过程】
该软件失败有MessageBoxA的错误提示,所以直接从bp MessageBoxA就可以插入了。
00410DC0 .6A FF PUSH -0x1 ;注册开始
00410DC2 .68 28784300 PUSH 石子店铺.00437828 ;SE 处理程
00410DC7 .64:A1 0000000>MOV EAX, DWORD PTR FS:
00410DCD .50 PUSH EAX
......中间省略取注册框信息的代码。
00410EBB .51 PUSH ECX ;框4
00410EBC .8B0D DC214500 MOV ECX, DWORD PTR DS:
00410EC2 .52 PUSH EDX ;框3
00410EC3 .50 PUSH EAX ;框2
00410EC4 .51 PUSH ECX ;框1
00410EC5 .8D5424 28 LEA EDX, DWORD PTR SS:
00410EC9 .68 68EC4400 PUSH 石子店铺.0044EC68 ;ASCII "%s%s%s%s"
00410ECE .52 PUSH EDX ;Buffer
00410ECF .C74424 68 010>MOV DWORD PTR SS:, 0x1
00410ED7 .E8 B22C0200 CALL <JMP.&MFC42.#CString::Format_2818> ;链接注册码
00410EDC .83C4 14 ADD ESP, 0x14
00410EDF .8D4424 1C LEA EAX, DWORD PTR SS:
00410EE3 .8BCC MOV ECX, ESP
00410EE5 .896424 20 MOV DWORD PTR SS:, ESP
00410EE9 .50 PUSH EAX ;CString Code
00410EEA .E8 AB2C0200 CALL <JMP.&MFC42.#CString::CString_535>
00410EEF .E8 ACF6FFFF CALL <石子店铺.Verify_Key> ;验证注册码的正确性
00410EF4 .83C4 04 ADD ESP, 0x4
00410EF7 .85C0 TEST EAX, EAX
00410EF9 0F84 B5010000 JE 石子店铺.004110B4 ;判断
非常典型的注册判断地址,跟进关键的call Verify_Key去看
004105A0 > 6A FF PUSH -0x1
004105A2 68 EF764300 PUSH 石子店铺.004376EF ;入口地址
004105A7|.64:A1 0000000>MOV EAX, DWORD PTR FS:
004105AD|.50 PUSH EAX
004105AE|.64:8925 00000>MOV DWORD PTR FS:, ESP
004105B5|.81EC 4C030000 SUB ESP, 0x34C
004105BB|.56 PUSH ESI
004105BC|.57 PUSH EDI
004105BD|.8D4C24 08 LEA ECX, DWORD PTR SS:
004105C1|.C78424 5C0300>MOV DWORD PTR SS:, 0x0
004105CC|.E8 33350200 CALL <JMP.&MFC42.#CString::CString_540> ;new CString
004105D1|.8D8C24 5C0100>LEA ECX, DWORD PTR SS:
004105D8|.C68424 5C0300>MOV BYTE PTR SS:, 0x1
004105E0|.E8 2B47FFFF CALL <石子店铺.C_InitBuf> ;初始化存放大数的buff(1)
004105E5|.8D8C24 B40000>LEA ECX, DWORD PTR SS:
004105EC|.C68424 5C0300>MOV BYTE PTR SS:, 0x2
004105F4|.E8 1747FFFF CALL <石子店铺.C_InitBuf> ;初始化Buffer(2)
004105F9|.8D4C24 0C LEA ECX, DWORD PTR SS:
004105FD|.C68424 5C0300>MOV BYTE PTR SS:, 0x3
00410605|.E8 0647FFFF CALL <石子店铺.C_InitBuf> ;初始化Buffer(3)
0041060A|.8D8C24 040200>LEA ECX, DWORD PTR SS:
00410611|.C68424 5C0300>MOV BYTE PTR SS:, 0x4
00410619|.E8 F246FFFF CALL <石子店铺.C_InitBuf> ;初始化Buffer(4)
0041061E|.8D8424 640300>LEA EAX, DWORD PTR SS:
00410625|.6A 0A PUSH 0xA
00410627|.50 PUSH EAX ;push Pass
00410628|.8D4C24 14 LEA ECX, DWORD PTR SS: ;存放大数的 Buffer(0)
0041062C|.C68424 640300>MOV BYTE PTR SS:, 0x5
00410634|.E8 0753FFFF CALL <石子店铺.DecToHex> ;注册码 十进制转十六进制
00410639|.68 E8EB4400 PUSH 石子店铺.0044EBE8 ;ASCII "1433"循环次数
0041063E|.8D4C24 0C LEA ECX, DWORD PTR SS:
00410642|.68 34E94400 PUSH 石子店铺.0044E934 ;ASCII "%s"
00410647|.51 PUSH ECX
00410648|.E8 41350200 CALL <JMP.&MFC42.#CString::Format_2818> ;format 1433
0041064D|.83C4 0C ADD ESP, 0xC
00410650|.8D5424 08 LEA EDX, DWORD PTR SS: ;Str 1433
00410654|.8D8C24 5C0100>LEA ECX, DWORD PTR SS: ;存放大数的 Buffer(1)
0041065B|.6A 0A PUSH 0xA
0041065D|.52 PUSH EDX
0041065E|.E8 DD52FFFF CALL <石子店铺.DecToHex> ;1433 转16进制
00410663|.68 C4EB4400 PUSH 石子店铺.0044EBC4 ;ASCII "14739049012400727199316597861741" StaticKey
00410668|.8D4424 0C LEA EAX, DWORD PTR SS:
0041066C|.68 34E94400 PUSH 石子店铺.0044E934 ;ASCII "%s"
00410671|.50 PUSH EAX
00410672|.E8 17350200 CALL <JMP.&MFC42.#CString::Format_2818>
00410677|.83C4 0C ADD ESP, 0xC
0041067A|.8D4C24 08 LEA ECX, DWORD PTR SS:
0041067E|.6A 0A PUSH 0xA
00410680|.51 PUSH ECX
00410681|.8D8C24 BC0000>LEA ECX, DWORD PTR SS: ;存放大数的 Buffer(2)
00410688|.E8 B352FFFF CALL <石子店铺.DecToHex> ;147。。。转16进制
0041068D|.8D9424 B40000>LEA EDX, DWORD PTR SS:
00410694|.8D8424 5C0100>LEA EAX, DWORD PTR SS:
0041069B|.52 PUSH EDX ;Hex(14739049012400727199316597861741)
0041069C|.8D8C24 B00200>LEA ECX, DWORD PTR SS:
004106A3|.50 PUSH EAX ;Hex(1433)
004106A4|.51 PUSH ECX ;??14
004106A5|.8D4C24 18 LEA ECX, DWORD PTR SS: ;Hex(Pass)
004106A9|.E8 0254FFFF CALL <石子店铺.End_Data> ;计算出最终结果
004106AE|.B9 2A000000 MOV ECX, 0x2A
004106B3|.8BF0 MOV ESI, EAX
004106B5|.8DBC24 040200>LEA EDI, DWORD PTR SS:
004106BC|.F3:A5 REP MOVS DWORD PTR ES:, DWORD PTR DS: ;复制数据
004106BE|.8D8C24 AC0200>LEA ECX, DWORD PTR SS:
004106C5|.E8 666D0000 CALL <石子店铺.nop>
004106CA|.8D5424 08 LEA EDX, DWORD PTR SS:
004106CE|.6A 0A PUSH 0xA
004106D0|.52 PUSH EDX
004106D1|.8D8C24 0C0200>LEA ECX, DWORD PTR SS:
004106D8|.E8 F352FFFF CALL <石子店铺.HexToDec> ;把上面计算的结果翻译为10进制字符串
004106DD|.A1 CC214500 MOV EAX, DWORD PTR DS:
004106E2|.50 PUSH EAX ; /s2 => "70799146"
004106E3|.8B4424 0C MOV EAX, DWORD PTR SS: ; |
004106E7|.50 PUSH EAX ; |s1
004106E8|.FF15 C4D64300 CALL NEAR DWORD PTR DS:[<&MSVCRT._mbscmp>] ; \与 70799146 比较 (软件编号)
004106EE|.83C4 08 ADD ESP, 0x8
004106F1|.C68424 5C0300>MOV BYTE PTR SS:, 0x4
004106F9|.85C0 TEST EAX, EAX
004106FB|.5F POP EDI
004106FC|.5E POP ESI
004106FD|.8D8C24 FC0100>LEA ECX, DWORD PTR SS:
00410704|.0F85 80000000 JNZ 石子店铺.0041078A
一层层深入,这里它进行了3个大数的初始化,分别是我输入的Pass,1433,以及 14739049012400727199316597861741。然后就进入下一轮的计算。计算得到的结果再与 70799146 进行比较,相等的话就是注册成功。
下面给出End_Data的主要计算代码:
00405B3E|> /8B4424 14 /MOV EAX, DWORD PTR SS:
00405B42|. |3BC3 |CMP EAX, EBX
00405B44|. |8B4424 18 |MOV EAX, DWORD PTR SS: ;Hex(1433) LoopTime
00405B48|. |75 08 |JNZ SHORT 石子店铺.00405B52
00405B4A|. |3BC7 |CMP EAX, EDI
00405B4C|. |0F84 29010000 |JE 石子店铺.00405C7B
00405B52|> |84C3 |TEST BL, AL ;检查LoopTime是否为奇数
00405B54|. |0F84 90000000 |JE 石子店铺.00405BEA
00405B5A|. |8D8C24 080200>|LEA ECX, DWORD PTR SS:
00405B61|. |53 |PUSH EBX
00405B62|. |51 |PUSH ECX
00405B63|. |8D4C24 18 |LEA ECX, DWORD PTR SS:
00405B67|. |E8 54F6FFFF |CALL <石子店铺.BigNum::--> ; --->LoopTime--
00405B6C|. |50 |PUSH EAX
00405B6D|. |8D4C24 14 |LEA ECX, DWORD PTR SS:
00405B71|. |E8 0AF2FFFF |CALL <石子店铺.BufCpy>
00405B76|. |8D8C24 080200>|LEA ECX, DWORD PTR SS:
00405B7D|. |E8 AE180100 |CALL <石子店铺.nop>
00405B82|. |8D9424 B80000>|LEA EDX, DWORD PTR SS:
00405B89|. |8D8424 580300>|LEA EAX, DWORD PTR SS:
00405B90|. |52 |PUSH EDX ;Hex(Pass)
00405B91|. |50 |PUSH EAX ;ResultBuf
00405B92|. |8D8C24 680100>|LEA ECX, DWORD PTR SS: ;Hex(Result)
00405B99|. |E8 42F7FFFF |CALL <石子店铺.BigNum::*> ; --->Result1 *= Pass
00405B9E|. |50 |PUSH EAX ;Hex(Result)
00405B9F|. |8D8C24 640100>|LEA ECX, DWORD PTR SS:
00405BA6|. |E8 D5F1FFFF |CALL <石子店铺.BufCpy>
00405BAB|. |8D8C24 580300>|LEA ECX, DWORD PTR SS:
00405BB2|. |E8 79180100 |CALL <石子店铺.nop>
00405BB7|. |8D8C24 A80400>|LEA ECX, DWORD PTR SS:
00405BBE|. |56 |PUSH ESI ;Hex(14739049012400727199316597861741)
00405BBF|. |51 |PUSH ECX ;ResultBuf
00405BC0|. |8D8C24 680100>|LEA ECX, DWORD PTR SS: ;Hex(Result)
00405BC7|. |E8 C4FAFFFF |CALL <石子店铺.BigNum::%> ; ---》 Result %= StaticKey
00405BCC|. |50 |PUSH EAX
00405BCD|. |8D8C24 640100>|LEA ECX, DWORD PTR SS:
00405BD4|. |E8 A7F1FFFF |CALL <石子店铺.BufCpy>
00405BD9|. |8D8C24 A80400>|LEA ECX, DWORD PTR SS:
00405BE0|. |E8 4B180100 |CALL <石子店铺.nop>
00405BE5|.^ E9 54FFFFFF |JMP 石子店铺.00405B3E
00405BEA|> |8D9424 B00200>|LEA EDX, DWORD PTR SS:
00405BF1|. |6A 02 |PUSH 0x2 ;2
00405BF3|. |52 |PUSH EDX ;ResultBuf
00405BF4|. |8D4C24 18 |LEA ECX, DWORD PTR SS: ;Hex(LoopTime)
00405BF8|. |E8 A3F9FFFF |CALL <石子店铺.BigNum::/> ; --->Loop Time /= 2
00405BFD|. |50 |PUSH EAX
00405BFE|. |8D4C24 14 |LEA ECX, DWORD PTR SS:
00405C02|. |E8 79F1FFFF |CALL <石子店铺.BufCpy>
00405C07|. |8D8C24 B00200>|LEA ECX, DWORD PTR SS:
00405C0E|. |E8 1D180100 |CALL <石子店铺.nop>
00405C13|. |8D8424 B80000>|LEA EAX, DWORD PTR SS:
00405C1A|. |8D8C24 000400>|LEA ECX, DWORD PTR SS:
00405C21|. |50 |PUSH EAX ;Hex(Pass)
00405C22|. |51 |PUSH ECX ;ResultBuf
00405C23|. |8D8C24 C00000>|LEA ECX, DWORD PTR SS: ;Hex(Pass)
00405C2A|. |E8 B1F6FFFF |CALL <石子店铺.BigNum::*> ; ---》 Pass *= Pass
00405C2F|. |50 |PUSH EAX
00405C30|. |8D8C24 BC0000>|LEA ECX, DWORD PTR SS: ;更新Pass
00405C37|. |E8 44F1FFFF |CALL <石子店铺.BufCpy>
00405C3C|. |8D8C24 000400>|LEA ECX, DWORD PTR SS:
00405C43|. |E8 E8170100 |CALL <石子店铺.nop>
00405C48|. |8D9424 500500>|LEA EDX, DWORD PTR SS:
00405C4F|. |56 |PUSH ESI ;Hex(14739049012400727199316597861741)
00405C50|. |52 |PUSH EDX
00405C51|. |8D8C24 C00000>|LEA ECX, DWORD PTR SS: ;Hes(Pass)
00405C58|. |E8 33FAFFFF |CALL <石子店铺.BigNum::%> ; ---》 Pass %= Key
00405C5D|. |50 |PUSH EAX
00405C5E|. |8D8C24 BC0000>|LEA ECX, DWORD PTR SS:
00405C65|. |E8 16F1FFFF |CALL <石子店铺.BufCpy>
00405C6A|. |8D8C24 500500>|LEA ECX, DWORD PTR SS:
00405C71|. |E8 BA170100 |CALL <石子店铺.nop>
00405C76|.^\E9 C3FEFFFF \JMP 石子店铺.00405B3E
看起来很长,实际上翻译为C代码就只有几行:BigNum StaticKey = 14739049012400727199316597861741; (奇数)
BigNum LoopTime = 1433;
BigNum Pass;
BigNum Result1 = 1;
BigNum VolumnInfo; //机器码
while (LoopTime) {
if(LoopTime % 2 != 0) { //奇数
LoopTime--;
Result *= Pass;
Result %= StaticKey; ==偶数
} else { //偶数
LoopTime /= 2;
Pass *= Pass;
Pass %= StaticKey;
}
}
if(Result == VolumnInfo)
success;
代码这样就出来了,该干啥的就干啥。破解的方法多得去了,这里就不提及了。
【破解总结】
本来想找一个软件来练练手,保持一下手感的。结果打开一看,瞬时蒙了。大家别喷,我是第一次遇到有大数运算的程序,所以一时间不知道它在干啥。有兴趣的还请来玩玩吧。
【版权声明】 本文有F8LEFT原创于PYG,转载请注明作者与出处。
不错,提醒楼主最好不要明文自己的Q EMAIL,感谢。 左岸麦田 发表于 2014-9-17 21:59
不错,提醒楼主最好不要明文自己的Q EMAIL,感谢。
哦,感谢提醒
s虽然看不懂但还是支持一下 不错支持分析 谢谢您的分析算法文章 感谢F8大婶,学习了,有时间自己实践一下{:handshake:} {:lol:},谢谢楼主分享呀。学习了呀。呵呵。 赞 ~! 赞 ~!
页:
[1]
2