• 标 题:文件阅读器readbook v1.41 c (9千字)
  • 作 者:happyhackwang
  • 时 间:2001-3-11 21:01:08
  • 链 接:http://bbs.pediy.com

文件阅读器readbook v1.41 crack by happyhackwang
软件名称:文件阅读器readbook v1.41
软件功能:语音阅读文本
注册方式:name+serial
作者:余民
作者主页:http://ReadBook.126.com
作者邮箱:ReadBook@126.COM
破解者:happyhackwang
邮箱:happyhackwang@263.net
OICQ:4696993(不在线^^)
注册方式:Patch(谁想写注册机,自己写吧!算法见后)
工具:softice,w32dasm,my head,ultraedit(to write this article)
特别感谢:w32dasm作者,以及patch它的各位

反汇编以后,看到了注册失败的信息提示的字符串,向上看:
:0040A10F 3975FC                  cmp dword ptr [ebp-04], esi    ;这是关键
:0040A112 741D                    je 0040A131
......
:0040A12C 3975FC                  cmp dword ptr [ebp-04], esi    ;关键的比较
:0040A12F 7547                    jne 0040A178    ;相等则注册,不等则失败

[ebp-4]里的数是怎么来的?
:0040A09E C745F412320000          mov [ebp-0C], 00003212    ;预定义的
:0040A0A5 C745E434120000          mov [ebp-1C], 00001234    ;
:0040A0AC C745E888880000          mov [ebp-18], 00008888    ;
:0040A0B3 C745F023230000          mov [ebp-10], 00002323    ;
:0040A0BA E878D20000              call 00417337
:0040A0BF 83C410                  add esp, 00000010
:0040A0C2 85C0                    test eax, eax
:0040A0C4 7524                    jne 0040A0EA
:0040A0C6 8D45F0                  lea eax, dword ptr [ebp-10]    ;2323
:0040A0C9 50                      push eax
:0040A0CA 8D45E8                  lea eax, dword ptr [ebp-18]    ;8888
:0040A0CD 50                      push eax
:0040A0CE 8D45E4                  lea eax, dword ptr [ebp-1C]    ;1234
:0040A0D1 50                      push eax
:0040A0D2 8D45F4                  lea eax, dword ptr [ebp-0C]    ;3212
:0040A0D5 50                      push eax
* Possible StringData Ref from Data Obj ->"C:\"
:0040A0D6 6860374600              push 00463760

* Reference To: KERNEL32.GetDiskFreeSpaceA, Ord:0100h
                                  |
:0040A0DB FF15F8114500            Call dword ptr [004511F8]
:0040A0E1 8B45F0                  mov eax, dword ptr [ebp-10]    ;总簇数
:0040A0E4 0FAF45F4                imul eax, dword ptr [ebp-0C]    ;与每簇的扇区数乘
:0040A0E8 EB19                    jmp 0040A103
......
:0040A103 F7D0                    not eax
:0040A105 3145FC                  xor dword ptr [ebp-04], eax    ;这里

看看GetDiskFreeSpace API的入口参数
?lpRootPathName                00463760
(根目录)

?lpSectorsPerCluster            ebp-0C
(每簇的扇区数目的指针)

?lpBytesPerSector            ebp-1C
(每个扇区字节数的指针)

?lpNumberOfFreeClusters            ebp-18
(空闲的簇数的指针)

?lpTotalNumberOfClusters        ebp-10
(总簇数的指针)




esi的数是怎么来的?
:0040A03F E8829B0200              call 00433BC6
:0040A044 8B8548FFFFFF            mov eax, dword ptr [ebp+FFFFFF48]    ;[72F8E8]@1
:0040A04A 8B8D4CFFFFFF            mov ecx, dword ptr [ebp+FFFFFF4C]    ;[72F8EC]@2
:0040A050 8BB544FFFFFF            mov esi, dword ptr [ebp+FFFFFF44]    ;[72F8E4]@3
:0040A056 03C1                    add eax, ecx        ;
:0040A058 038550FFFFFF            add eax, dword ptr [ebp+FFFFFF50]    ;[72F8F0]@4
:0040A05E 69F631750000            imul esi, 00007531    ;
:0040A064 69C031750000            imul eax, 00007531    ;

* Possible StringData Ref from Data Obj ->"BIN_OR_TEXT"
                                  |
:0040A06A C704240C334600          mov dword ptr [esp], 0046330C
:0040A071 68B5000000              push 000000B5
:0040A076 53                      push ebx
:0040A077 2BF0                    sub esi, eax    ;这里

[72F8E4]是存放名字字符串的地方
所以@1是偏移地址的第四个字节开始的4个字节
@2              八          4
@3              零          4
@4              十二        4

例如:名字输入 crack readbook
@1就是k re
@2就是adbo
@3就是crac
@4就是ok 
名字字符不够长的补以空格(ASCII 20)



自我病毒监测功能的实现:打开RBBackup.DAT                                  |
:00417F6A FF1564124500            Call dword ptr [00451264]    ;FindCloseChangeNotification()
:00417F70 395DD4                  cmp dword ptr [ebp-2C], ebx    ;API函数
:00417F73 742D                    je 00417FA2
:00417F75 6A14                    push 00000014

* Possible StringData Ref from Data Obj ->"这里是ReadBOOK的自我修复功能"
                                  |
:00417F77 68B0594600              push 004659B0

* Possible StringData Ref from Data Obj ->"    ReadBook察觉到自身有改变,如果不是文件损坏"
                                        ->"的就是让病毒感染了!
    一般说来,硬盘很少损*"
                                        ->"担绻腞eadBook是安装在硬盘上的,那么
极大"
                                        ->"的可能是您的计算机中存在病毒。
"
                                        ->"  解决办法是使用杀毒软件对计算机进行检查。但*"
                                        ->"捎诩扑慊《久刻於*
有新的种类出现,请您一定要"
                                        ->"注意您的杀毒软件的版本(出版时间),确定
您使*"
                                        ->"玫氖亲钚掳姹镜模ㄉ倍救砑陌姹靖轮芷谝话闶羌"
                                        ->"甘欤*
    ReadBOOK具有自我修复功*"
                                  |
:00417F7C 6894574600              push 00465794
:00417F81 53                      push ebx

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:00417F82 FF1530164500            Call dword ptr [00451630]
:00417F88 83F806                  cmp eax, 00000006
:00417F8B 0F850D010000            jne 0041809E
:00417F91 E81AEFFFFF              call 00416EB0
:00417F96 53                      push ebx

* Reference To: USER32.PostQuitMessage, Ord:01E0h
                                  |
:00417F97 FF15F0144500            Call dword ptr [004514F0]
:00417F9D E9FC000000              jmp 0041809E

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417EC6(C), :00417F73(C)
|
:00417FA2 6A10                    push 00000010

* Possible StringData Ref from Data Obj ->"这里是ReadBOOK的病毒监测功能"
                                  |
:00417FA4 6874574600              push 00465774

* Possible StringData Ref from Data Obj ->"    ReadBook察觉到自身有改变,如果不是文件损坏"
                                        ->"的就是让病毒感染了!
    一般说来,硬盘很少损*"
                                        ->"担绻腞eadBook是安装在硬盘上的,那么
极大"
                                        ->"的可能是您的计算机中存在病毒。
"
                                        ->"  解决办法是使用杀毒软件对计算机进行检查。但*"
                                        ->"捎诩扑慊《久刻於*
有新的种类出现,请您一定要"
                                        ->"注意您的杀毒软件的版本(出版时间),确定
您使*"
                                        ->"玫氖亲钚掳姹镜模ㄉ倍救砑陌姹靖轮芷谝话闶羌"
                                        ->"甘欤*
    由于ReadBOOK的损坏严重*"
                                  |
:00417FA9 6888554600              push 00465588
:00417FAE 53                      push ebx

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:00417FAF FF1530164500            Call dword ptr [00451630]
:00417FB5 E9E4000000              jmp 0041809E


如何绕过去呢?
向上看到,在这里设断点
:00417D96 E87AF5FFFF              call 00417315    ;API GetPrivateProfileStringA
......
:00417DA7 E8E45A0100              call 0042D890
:00417DAC 83C418                  add esp, 00000018
:00417DAF 85C0                    test eax, eax
:00417DB1 0F84F9020000            je 004180B0

追进00417D96
:00417315 FF3580754B00            push dword ptr [004B7580]    ;readbook.ini
:0041731B FF742414                push [esp+14]            ;10
:0041731F FF742414                push [esp+14]            ;03
:00417323 6850844600              push 00468450            ;
:00417328 FF742418                push [esp+18]            ;verify
:0041732C FF742418                push [esp+18]            ;file

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:013Ah
                                  |
:00417330 FF1568134500            Call dword ptr [00451368]

GetPrivateProfileStringA的入口参数:
?lpAppName                esp+18        
初始化文件中section字符串
?lpKeyName                esp+18        
要得到的key的字符串
?lpDefault                00468450    
缺省字符串
?lpReturnedString            esp+14        
接收缓冲区
?nSize                    esp+14        
长度
?lpFileName                004B7580    
初始化文件名

追进00417DA7
:0042D8B0 8A06                    mov al, byte ptr [esi]    ;预定义的字符串"No"
:0042D8B2 46                      inc esi
:0042D8B3 8A27                    mov ah, byte ptr [edi]    ;ini中得到的字符串
:0042D8B5 47                      inc edi
:0042D8B6 38C4                    cmp ah, al
:0042D8B8 74F2                    je 0042D8AC

在readbook.ini中添加
[File]
Verify=No
就可以绕过检验程序是否更改,当然也可以Patch
这在程序中 视图->配置->控制->防病毒校验 可以设置

总结:
Patch
00417DB1 0F84F9020000            je 004180B0        ;patch病毒自检
        E9FA02000090         jmp 4180B0

0040A112 741D                    je 0040A131        ;patch注册失败
        EB1D             jmp 40A131

另外,readbook v1.42与1.41大同小异,不另行说明,Patch如下:
:0040A160 3975F8                  cmp dword ptr [ebp-08], esi
:0040A163 741D                    je 0040A182(A163)
          EB1DS

:00417E53 E818620100              call 0042E070
:00417E58 83C418                  add esp, 00000018
:00417E5B 85C0                    test eax, eax
:00417E5D 0F84F9020000            je 0041815C(17E5D)
          E9FA02000090


*********************************世间本无事,庸人自扰耳************************************