书香门第 V1.23 Build 1638
软件大小: 665 KB软件语言: 简体中文软件类别: 国产软件 / 共享版 / 电子阅读应用平台: Win9x/NT/2000/XP界面预览: 加入时间: 2003-03-13 08:28:43下载次数: 7419推荐等级:
联 系 人: [email protected] 开 发 商: http://www.gentle-breeze.com
软件介绍: 《书香门第》是一款适合于真正读书迷的电子小说、文本阅读软件,它外表并不花哨,但对于长时间、大量阅读的读书迷,却最舒适、体贴、细致,因为它具有十二个鲜明特点:1. 多达27种各种质感的窗口背景、页面背景可供选择,总共超过700种背景组合,为读书迷提供最高舒适度和最大程度的视力保护。2. 强大、智能化的自动排版功能,并可以随意设定字体大小、颜色、行距、标题行。3. 极其高速的排版速度:目前主流机器上排版速度超过一万页/秒,所以通常你根本无法感觉到排版过程。4. 高速的DirectDraw图形引擎,翻页寻迹流畅自如。5.附带的html转换、合成工具能够迅速依次将一批html文件转换且合并为一个大的文本文件,方便阅读。6.宽广的平台适用性:从486/win95到最新P4/XP都能从容应对。7.体贴的左手键操作,使你从此摆脱长期右手操作鼠标、键盘带来的疲劳。8.与页面字数成正比的自动翻页间隔,自然优于呆板的固定翻页间隔。9.可以选择使用窗口模式(寻迹方便)或全屏幕模式(阅读效果更好)。10.全书遍历/测试功能,保护你的计算机,节约能源。11.搜索功能方便读者在书中查找。12. 具有强于word和IE的汉字乱码纠错功能。
【作者声明】:本人是个初学者,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教! 本人感谢软件作者,请见谅了.【破解工具】:0llydbg v1.09cn W32Dasm8.93黄金版
————————————————————————————————— 【过 程】:
W32Dasm8.93黄金版反汇编,查找关键提示。
0040373C E81A6C0100 call 0041A35B:00403741 83F818 cmp eax, 00000018 ====>注册码是否24位
:00403744 0F85C0000000 jne 0040380A :0040374A A1280E4500 mov eax, dword ptr [00450E28]:0040374F 83F804 cmp eax, 00000004 ====>E-mail不能少于4位
:00403752 0F8CB2000000 jl 0040380A
:00403758 8364241000 and dword ptr [esp+10], 00000000:0040375D EB05 jmp 00403764
* Reference To: USER32.SendMessageA, Ord:0214h |:004037B0 FF15F4444200 Call dword ptr [004244F4]:004037B6 80BEC000000000 cmp byte ptr [esi+000000C0], 00:004037BD 742F je 004037EE
* Possible StringData Ref from Data Obj ->" 祝贺你 你已经成为了《书香门第》注册用户!" :004037BF 6898C64200 push 0042C698
以下是用0llydbg v1.09cn跟踪的:填e_mail : [email protected] 试验码 : 789456123012345678901234
00403712 PUSH EDI00403713 MOV EDI, zbook.00452268 ; ASCII [email protected]"00403718 LEA EBP, DWORD PTR DS:[ESI+13C]0040371E PUSH 2000403720 PUSH EDI ; EDI=00452268 ,ASCII [email protected]"00403721 MOV ECX, EBP00403723 CALL zbook.0041A35B00403728 LEA EBX, DWORD PTR DS:[ESI+100]0040372E PUSH 2000403730 PUSH zbook.00451A48 ; ASCII 789456123012345678901234"00403735 MOV ECX, EBX00403737 MOV DWORD PTR DS:[450E28], EAX0040373C CALL zbook.0041A35B00403741 CMP EAX, 1800403744 JNZ zbook.0040380A0040374A MOV EAX, DWORD PTR DS:[450E28]0040374F CMP EAX, 400403752 JL zbook.0040380A00403758 AND DWORD PTR SS:[ESP+10], 00040375D JMP SHORT zbook.004037640040375F MOV EAX, DWORD PTR DS:[450E28]00403764 PUSH EAX ; EAX=E00403765 IMUL EAX, DWORD PTR SS:[ESP+14] ; EAX=EAX*SS:[12F454]=E*0=0||EAX*SS:[12F454]=E*01=E0040376A ADD EAX, zbook.00451A68 ; ASCII [email protected]@163.com.......0040376F PUSH EDI ; EDI=00452268 ,ASCII [email protected]"00403770 PUSH EAX ; EAX=00451A7600403771 CALL zbook.004083E0 ; 把e_mail传送到451A68开始的地址中一共40h组00403776 ESP, 0C00403779 INC DWORD PTR SS:[ESP+10] ; SS:[12F454]=0 ++0040377D CMP DWORD PTR SS:[ESP+10], 40 ; SS:[12F454]=1 ++00403782 JL SHORT zbook.0040375F ; 把e_mail传送到451A68开始的地址中一共40h组连接起来00403784 MOV EDI, zbook.00451248 ; ASCII 789456123012345678901234"00403789 PUSH 200040378B PUSH zbook.00451A48 ; ASCII 789456123012345678901234"00403790 PUSH EDI00403791 CALL zbook.004083E000403796 ADD EDI, 2000403799 ADD ESP, 0C0040379C CMP EDI, zbook.00451A48 ; ASCII 789456123012345678901234"004037A2 JL SHORT zbook.00403789 ; 把试验码传送到451248-451A48开始的内存中004037A4 XOR EDI, EDI004037A6 PUSH EDI ; /lParam => 0004037A7 PUSH EDI ; |wParam => 0004037A8 PUSH 1501 ; |Message = MSG(1501)004037AD PUSH DWORD PTR DS:[ESI+1C] ; ||hWnd = B025C 004037B0 CALL DWORD PTR DS:[] ; \这个api是转移到计算注册码地址的call004037B6 CMP BYTE PTR DS:[ESI+C0], 0 ; DS:[ESI+C0]=DS:[12FAF4]注册标记004037BD JE SHORT zbook.004037EE ; 这里跳到错误的提示框004037BF PUSH zbook.0042C698 ; 到这里就成功004037C4 MOV DWORD PTR DS:[452A68], EDI004037CA CALL zbook.00405666
//因为上面的跳转是通过API的方式,所以太难找到核心
=============================================================================
CALL DWORD PTR DS:[] ; \这个api是转移到计算注册码地址的call||77DF1D07 CALL DWORD PTR SS:[EBP+8]|CALL DWORD PTR SS:[EBP+8]|
00403860 MOV EBP, ESP00403862 SUB ESP, 10000403868 PUSH ESI00403869 PUSH 200040386B CALL zbook.004088FB00403870 PUSH 4000403872 MOV ESI, zbook.0045114800403877 CDQ00403878 POP ECX ; ECX=4000403879 IDIV ECX ; EAX=13CA IDIV ECX=40 ==>EAX=4F EDX=A0040387B SHL EDX, 5 ; EDX=A SHL 5=1400040387E ADD EDX, zbook.00451248 ; EDX=EDX+451248( ASCII 789456123012345678901234")=00403884 PUSH EDX ; EDX=zbook.00451388,ASCII 789456123012345678901234")00403885 PUSH ESI ; //经过上面的漫长的转折终于来到试验码的地址00403886 CALL zbook.004083E0 ; 00451148 EAX=1A7 EDX=39004038B2 LEA EAX, [LOCAL.64]004038B8 IMUL EDX, DWORD PTR DS:[450E28] ; EDX=EDX*DS:[450E28]=39*0E=31E004038BF ADD EDX, zbook.00451A68 ; ASCII [email protected]@163.com004038C5 PUSH EDX ; zbook.00451D86004038C6 PUSH EAX ; //用上面的方法取计算的参数从451D86处做基数004038C7 CALL zbook.004083E0004038CC PUSH 0C004038CE PUSH ESI ; ESI=00451148 ,ASCII 789456123012345678901234")004038CF PUSH zbook.004510C8 ; ASCII 骧溻滗怃纩祧"004038D4 CALL zbook.004083E0 ; 取试验码的前12位==>004510C8004038D9 PUSH 0C004038DB PUSH zbook.00451154004038E0 PUSH zbook.00451048004038E5 CALL zbook.004083E0 ; 取试验码的后12位==>00451048004038EA MOV EAX, DWORD PTR DS:[450E28]; EAX=E004038EF AND BYTE PTR DS:[451054], 0004038F6 AND BYTE PTR DS:[4510D4], 0004038FD ADD ESP, 2400403900 XOR EDX, EDX00403902 TEST EAX, EAX00403904 JLE SHORT zbook.0040393400403906 PUSH EBX00403907 PUSH EDI00403908 LEA EBX, DWORD PTR DS:[EAX-1] ; EBX=E-1=D0040390B /LEA EDI, DWORD PTR SS:[EBP+EDX-100] ; EDI00451145 (03 05 04 04 05 03 06 02 07 01 08 00)
00403A04 PUSH ESI00403A05 PUSH EBP00403A06 PUSH EBX00403A07 CALL zbook.004083E0
; 把前12位倒置后==>00451148 (00 08 01 07 02 06 03 05 04 04 05 03)
00403A0C ADD ESP, 2400403A0F XOR EBX, EBX00403A11 TEST ESI, ESI
****************************************************************第一次计算的总结: 1.计算的参数是一个固定值C2.这段计算是C MOD 9 的值设M 然后用8-M得到值设N,再把C++继续3.取得到的数组的后12位与前12位值倒置后的数组连接成24位的数组4.得到一组值==>00451148, N=00 08 01 07 02 06 03 05 04 04 05 03 03 05 04 04 05 03 06 02 07 01 08 00 5.就是说上面的数组是固定的.
004039DA AND BYTE PTR DS:[ESI*2+451148], 0004039E2 PUSH EBX004039E3 PUSH EBP004039E4 LEA EDI, DWORD PTR DS:[ESI+451148]004039EA PUSH ESI ; ESI=0C004039EB MOV EBP, zbook.00450F48004039F0 PUSH EDI ; zbook.00451154004039F1 PUSH EBP004039F2 CALL zbook.004083E0 ; 把后12位==>00450F48 (00 08 01 07 02 06 03 05 04 04 05 03)004039F7 MOV EBX, zbook.00451148004039FC PUSH ESI004039FD PUSH EBX004039FE PUSH EDI004039FF CALL zbook.004083E0 ; 把前12位==>00451145 (03 05 04 04 05 03 06 02 07 01 08 00)00403A04 PUSH ESI00403A05 PUSH EBP00403A06 PUSH EBX00403A07 CALL zbook.004083E0 ; 把前12位倒置后==>00451148 (00 08 01 07 02 06 03 05 04 04 05 03)00403A0C ADD ESP, 2400403A0F XOR EBX, EBX00403A11 TEST ESI, ESI00403A13 JLE SHORT zbook.00403A66 //第二次的关键计算:00403A15 /MOV AL, BL00403A17 |MOV CL, BYTE PTR DS:[EBX+4510C8] ; CL 00450F4800403A8D PUSH ESI00403A8E PUSH zbook.00451048 ; 连接后的后12位==>00450F4800403A93 PUSH EDI00403A94 CALL zbook.004083E0 ; 连接后的前12位==>00450F5400403A99 ADD ESP, 3000403A9C XOR EAX, EAX00403A9E TEST ESI, ESI00403AA0 POP EBP00403AA1 POP EBX00403AA2 JLE SHORT zbook.00403AC000403AA4 /MOV CL, BYTE PTR DS:[EAX*2+450F49] ; CLDS:[4511C8]=E600403ABE \JL SHORT zbook.00403AA4 //循环取值00403AC0 AND BYTE PTR DS:[ESI+4511C8], 0
; 004511C8