- UID
- 75402
注册时间2014-5-2
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 开心 2015-8-2 16:07 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
本帖最后由 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:[0]
- 00410DCD . 50 PUSH EAX
- ......中间省略取注册框信息的代码。
- 00410EBB . 51 PUSH ECX ; 框4
- 00410EBC . 8B0D DC214500 MOV ECX, DWORD PTR DS:[0x4521DC]
- 00410EC2 . 52 PUSH EDX ; 框3
- 00410EC3 . 50 PUSH EAX ; 框2
- 00410EC4 . 51 PUSH ECX ; 框1
- 00410EC5 . 8D5424 28 LEA EDX, DWORD PTR SS:[ESP+0x28]
- 00410EC9 . 68 68EC4400 PUSH 石子店铺.0044EC68 ; ASCII "%s%s%s%s"
- 00410ECE . 52 PUSH EDX ; Buffer
- 00410ECF . C74424 68 010>MOV DWORD PTR SS:[ESP+0x68], 0x1
- 00410ED7 . E8 B22C0200 CALL <JMP.&MFC42.#CString::Format_2818> ; 链接注册码
- 00410EDC . 83C4 14 ADD ESP, 0x14
- 00410EDF . 8D4424 1C LEA EAX, DWORD PTR SS:[ESP+0x1C]
- 00410EE3 . 8BCC MOV ECX, ESP
- 00410EE5 . 896424 20 MOV DWORD PTR SS:[ESP+0x20], 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:[0]
- 004105AD |. 50 PUSH EAX
- 004105AE |. 64:8925 00000>MOV DWORD PTR FS:[0], ESP
- 004105B5 |. 81EC 4C030000 SUB ESP, 0x34C
- 004105BB |. 56 PUSH ESI
- 004105BC |. 57 PUSH EDI
- 004105BD |. 8D4C24 08 LEA ECX, DWORD PTR SS:[ESP+0x8]
- 004105C1 |. C78424 5C0300>MOV DWORD PTR SS:[ESP+0x35C], 0x0
- 004105CC |. E8 33350200 CALL <JMP.&MFC42.#CString::CString_540> ; new CString
- 004105D1 |. 8D8C24 5C0100>LEA ECX, DWORD PTR SS:[ESP+0x15C]
- 004105D8 |. C68424 5C0300>MOV BYTE PTR SS:[ESP+0x35C], 0x1
- 004105E0 |. E8 2B47FFFF CALL <石子店铺.C_InitBuf> ; 初始化存放大数的buff(1)
- 004105E5 |. 8D8C24 B40000>LEA ECX, DWORD PTR SS:[ESP+0xB4]
- 004105EC |. C68424 5C0300>MOV BYTE PTR SS:[ESP+0x35C], 0x2
- 004105F4 |. E8 1747FFFF CALL <石子店铺.C_InitBuf> ; 初始化Buffer(2)
- 004105F9 |. 8D4C24 0C LEA ECX, DWORD PTR SS:[ESP+0xC]
- 004105FD |. C68424 5C0300>MOV BYTE PTR SS:[ESP+0x35C], 0x3
- 00410605 |. E8 0647FFFF CALL <石子店铺.C_InitBuf> ; 初始化Buffer(3)
- 0041060A |. 8D8C24 040200>LEA ECX, DWORD PTR SS:[ESP+0x204]
- 00410611 |. C68424 5C0300>MOV BYTE PTR SS:[ESP+0x35C], 0x4
- 00410619 |. E8 F246FFFF CALL <石子店铺.C_InitBuf> ; 初始化Buffer(4)
- 0041061E |. 8D8424 640300>LEA EAX, DWORD PTR SS:[ESP+0x364]
- 00410625 |. 6A 0A PUSH 0xA
- 00410627 |. 50 PUSH EAX ; push Pass
- 00410628 |. 8D4C24 14 LEA ECX, DWORD PTR SS:[ESP+0x14] ; 存放大数的 Buffer(0)
- 0041062C |. C68424 640300>MOV BYTE PTR SS:[ESP+0x364], 0x5
- 00410634 |. E8 0753FFFF CALL <石子店铺.DecToHex> ; 注册码 十进制转十六进制
- 00410639 |. 68 E8EB4400 PUSH 石子店铺.0044EBE8 ; ASCII "1433" 循环次数
- 0041063E |. 8D4C24 0C LEA ECX, DWORD PTR SS:[ESP+0xC]
- 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:[ESP+0x8] ; Str 1433
- 00410654 |. 8D8C24 5C0100>LEA ECX, DWORD PTR SS:[ESP+0x15C] ; 存放大数的 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:[ESP+0xC]
- 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:[ESP+0x8]
- 0041067E |. 6A 0A PUSH 0xA
- 00410680 |. 51 PUSH ECX
- 00410681 |. 8D8C24 BC0000>LEA ECX, DWORD PTR SS:[ESP+0xBC] ; 存放大数的 Buffer(2)
- 00410688 |. E8 B352FFFF CALL <石子店铺.DecToHex> ; 147。。。转16进制
- 0041068D |. 8D9424 B40000>LEA EDX, DWORD PTR SS:[ESP+0xB4]
- 00410694 |. 8D8424 5C0100>LEA EAX, DWORD PTR SS:[ESP+0x15C]
- 0041069B |. 52 PUSH EDX ; Hex(14739049012400727199316597861741)
- 0041069C |. 8D8C24 B00200>LEA ECX, DWORD PTR SS:[ESP+0x2B0]
- 004106A3 |. 50 PUSH EAX ; Hex(1433)
- 004106A4 |. 51 PUSH ECX ; ??14
- 004106A5 |. 8D4C24 18 LEA ECX, DWORD PTR SS:[ESP+0x18] ; 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:[ESP+0x204]
- 004106BC |. F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI] ; 复制数据
- 004106BE |. 8D8C24 AC0200>LEA ECX, DWORD PTR SS:[ESP+0x2AC]
- 004106C5 |. E8 666D0000 CALL <石子店铺.nop>
- 004106CA |. 8D5424 08 LEA EDX, DWORD PTR SS:[ESP+0x8]
- 004106CE |. 6A 0A PUSH 0xA
- 004106D0 |. 52 PUSH EDX
- 004106D1 |. 8D8C24 0C0200>LEA ECX, DWORD PTR SS:[ESP+0x20C]
- 004106D8 |. E8 F352FFFF CALL <石子店铺.HexToDec> ; 把上面计算的结果翻译为10进制字符串
- 004106DD |. A1 CC214500 MOV EAX, DWORD PTR DS:[0x4521CC]
- 004106E2 |. 50 PUSH EAX ; /s2 => "70799146"
- 004106E3 |. 8B4424 0C MOV EAX, DWORD PTR SS:[ESP+0xC] ; |
- 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:[ESP+0x35C], 0x4
- 004106F9 |. 85C0 TEST EAX, EAX
- 004106FB |. 5F POP EDI
- 004106FC |. 5E POP ESI
- 004106FD |. 8D8C24 FC0100>LEA ECX, DWORD PTR SS:[ESP+0x1FC]
- 00410704 |. 0F85 80000000 JNZ 石子店铺.0041078A
复制代码
一层层深入,这里它进行了3个大数的初始化,分别是我输入的Pass,1433,以及 14739049012400727199316597861741。然后就进入下一轮的计算。计算得到的结果再与 70799146 进行比较,相等的话就是注册成功。
下面给出End_Data的主要计算代码:
- 00405B3E |> /8B4424 14 /MOV EAX, DWORD PTR SS:[ESP+0x14]
- 00405B42 |. |3BC3 |CMP EAX, EBX
- 00405B44 |. |8B4424 18 |MOV EAX, DWORD PTR SS:[ESP+0x18] ; 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:[ESP+0x208]
- 00405B61 |. |53 |PUSH EBX
- 00405B62 |. |51 |PUSH ECX
- 00405B63 |. |8D4C24 18 |LEA ECX, DWORD PTR SS:[ESP+0x18]
- 00405B67 |. |E8 54F6FFFF |CALL <石子店铺.BigNum::--> ; ---> LoopTime--
- 00405B6C |. |50 |PUSH EAX
- 00405B6D |. |8D4C24 14 |LEA ECX, DWORD PTR SS:[ESP+0x14]
- 00405B71 |. |E8 0AF2FFFF |CALL <石子店铺.BufCpy>
- 00405B76 |. |8D8C24 080200>|LEA ECX, DWORD PTR SS:[ESP+0x208]
- 00405B7D |. |E8 AE180100 |CALL <石子店铺.nop>
- 00405B82 |. |8D9424 B80000>|LEA EDX, DWORD PTR SS:[ESP+0xB8]
- 00405B89 |. |8D8424 580300>|LEA EAX, DWORD PTR SS:[ESP+0x358]
- 00405B90 |. |52 |PUSH EDX ; Hex(Pass)
- 00405B91 |. |50 |PUSH EAX ; ResultBuf
- 00405B92 |. |8D8C24 680100>|LEA ECX, DWORD PTR SS:[ESP+0x168] ; Hex(Result)
- 00405B99 |. |E8 42F7FFFF |CALL <石子店铺.BigNum::*> ; ---> Result1 *= Pass
- 00405B9E |. |50 |PUSH EAX ; Hex(Result)
- 00405B9F |. |8D8C24 640100>|LEA ECX, DWORD PTR SS:[ESP+0x164]
- 00405BA6 |. |E8 D5F1FFFF |CALL <石子店铺.BufCpy>
- 00405BAB |. |8D8C24 580300>|LEA ECX, DWORD PTR SS:[ESP+0x358]
- 00405BB2 |. |E8 79180100 |CALL <石子店铺.nop>
- 00405BB7 |. |8D8C24 A80400>|LEA ECX, DWORD PTR SS:[ESP+0x4A8]
- 00405BBE |. |56 |PUSH ESI ; Hex(14739049012400727199316597861741)
- 00405BBF |. |51 |PUSH ECX ; ResultBuf
- 00405BC0 |. |8D8C24 680100>|LEA ECX, DWORD PTR SS:[ESP+0x168] ; Hex(Result)
- 00405BC7 |. |E8 C4FAFFFF |CALL <石子店铺.BigNum::%> ; ---》 Result %= StaticKey
- 00405BCC |. |50 |PUSH EAX
- 00405BCD |. |8D8C24 640100>|LEA ECX, DWORD PTR SS:[ESP+0x164]
- 00405BD4 |. |E8 A7F1FFFF |CALL <石子店铺.BufCpy>
- 00405BD9 |. |8D8C24 A80400>|LEA ECX, DWORD PTR SS:[ESP+0x4A8]
- 00405BE0 |. |E8 4B180100 |CALL <石子店铺.nop>
- 00405BE5 |.^ E9 54FFFFFF |JMP 石子店铺.00405B3E
- 00405BEA |> |8D9424 B00200>|LEA EDX, DWORD PTR SS:[ESP+0x2B0]
- 00405BF1 |. |6A 02 |PUSH 0x2 ; 2
- 00405BF3 |. |52 |PUSH EDX ; ResultBuf
- 00405BF4 |. |8D4C24 18 |LEA ECX, DWORD PTR SS:[ESP+0x18] ; Hex(LoopTime)
- 00405BF8 |. |E8 A3F9FFFF |CALL <石子店铺.BigNum::/> ; ---> Loop Time /= 2
- 00405BFD |. |50 |PUSH EAX
- 00405BFE |. |8D4C24 14 |LEA ECX, DWORD PTR SS:[ESP+0x14]
- 00405C02 |. |E8 79F1FFFF |CALL <石子店铺.BufCpy>
- 00405C07 |. |8D8C24 B00200>|LEA ECX, DWORD PTR SS:[ESP+0x2B0]
- 00405C0E |. |E8 1D180100 |CALL <石子店铺.nop>
- 00405C13 |. |8D8424 B80000>|LEA EAX, DWORD PTR SS:[ESP+0xB8]
- 00405C1A |. |8D8C24 000400>|LEA ECX, DWORD PTR SS:[ESP+0x400]
- 00405C21 |. |50 |PUSH EAX ; Hex(Pass)
- 00405C22 |. |51 |PUSH ECX ; ResultBuf
- 00405C23 |. |8D8C24 C00000>|LEA ECX, DWORD PTR SS:[ESP+0xC0] ; Hex(Pass)
- 00405C2A |. |E8 B1F6FFFF |CALL <石子店铺.BigNum::*> ; ---》 Pass *= Pass
- 00405C2F |. |50 |PUSH EAX
- 00405C30 |. |8D8C24 BC0000>|LEA ECX, DWORD PTR SS:[ESP+0xBC] ; 更新Pass
- 00405C37 |. |E8 44F1FFFF |CALL <石子店铺.BufCpy>
- 00405C3C |. |8D8C24 000400>|LEA ECX, DWORD PTR SS:[ESP+0x400]
- 00405C43 |. |E8 E8170100 |CALL <石子店铺.nop>
- 00405C48 |. |8D9424 500500>|LEA EDX, DWORD PTR SS:[ESP+0x550]
- 00405C4F |. |56 |PUSH ESI ; Hex(14739049012400727199316597861741)
- 00405C50 |. |52 |PUSH EDX
- 00405C51 |. |8D8C24 C00000>|LEA ECX, DWORD PTR SS:[ESP+0xC0] ; Hes(Pass)
- 00405C58 |. |E8 33FAFFFF |CALL <石子店铺.BigNum::%> ; ---》 Pass %= Key
- 00405C5D |. |50 |PUSH EAX
- 00405C5E |. |8D8C24 BC0000>|LEA ECX, DWORD PTR SS:[ESP+0xBC]
- 00405C65 |. |E8 16F1FFFF |CALL <石子店铺.BufCpy>
- 00405C6A |. |8D8C24 500500>|LEA ECX, DWORD PTR SS:[ESP+0x550]
- 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,转载请注明作者与出处。
|
评分
-
查看全部评分
|