• 标 题:中华奇书
  • 作 者:yesky1
  • 时 间: 2003年11月04日 10:10
  • 链 接:http://bbs.pediy.com

这个是eBook Edit Pro编译的电子书,upx壳,脱壳后会发现文件大小小了不少,why,它把电子书的内容附加到文件尾了。好像fly以前搞过一个类似的软件,也是电子书把内容附加到文件末尾。

运行脱壳后的文件会有提示:“这本电子书包含一个错误的讯号。这个应用程序将被终止。序号0”
这就给我们指明了前进的方向,winhex中打开文件查找
在文件偏移9AA90处找到,即RVA 49AA90。
调出IDA来到RVA 49AA90处,双击DATA XREF找到这里


UPX1:0049A967                 call    dword ptr [edx] ; 建一TFileStream,返回文件大小?
UPX1:0049A969                 mov     edxeax
UPX1:0049A96B                 sub     edx, 10h        ; -10
UPX1:0049A96E                 xor     ecxecx
UPX1:0049A970                 mov     eaxebx
UPX1:0049A972                 mov     edi, [eax]
UPX1:0049A974                 call    dword ptr [edi+14h] ; 文件指针 指向文件大小-16字节
UPX1:0049A977                 lea     edx, [ebp+var_10]
UPX1:0049A97A                 mov     ecx, 10h
UPX1:0049A97F                 mov     eaxebx
UPX1:0049A981                 mov     edi, [eax]
UPX1:0049A983                 call    dword ptr [edi+0Ch] ; ReadFile 取文件最后16字节
UPX1:0049A986                 mov     edi, [ebp+var_4]
UPX1:0049A989                 cmp     edi, 1397h      ; 文件最后一个DWORD应该为0x1397
UPX1:0049A98F                 jz      short loc_49A9D1 ; 必须跳哦
UPX1:0049A991                 push    0
UPX1:0049A993                 lea     ecx, [ebp+var_18]
UPX1:0049A996                 xor     edxedx
UPX1:0049A998                 mov     eaxedi
UPX1:0049A99A                 call    sub_408A30
UPX1:0049A99F                 mov     ecx, [ebp+var_18]
UPX1:0049A9A2                 lea     eax, [ebp+var_14] ; 显示错误信息
UPX1:0049A9A5                 mov     edx, offset dword_49AA90 ; "这本电子书包含一个错误的讯号。这个应用程序将被终止。" <===== 找到这里
UPX1:0049A9AA                 call    @System@@LStrCat3$qqrv ; System::__linkproc__ LStrCat3(void)
UPX1:0049A9AF                 mov     eax, [ebp+var_14]
UPX1:0049A9B2                 mov     cxds:word_49AAE4
UPX1:0049A9B9                 mov     dl, 1
UPX1:0049A9BB                 call    

@Dialogs@MessageDlg$qqrx17System@AnsiString19Dialogs@TMsgDlgType47System@_Set$t18Dialogs@TMsgDlgBtn

$iuc$0$iuc$10_i ; Dialogs::MessageDlg

(System::AnsiString,Dialogs::TMsgDlgType,System::Set<Dialogs::TMsgDlgBtn,(uchar)0,(uchar)10>,int)
UPX1:0049A9C0                 mov     eaxds:dword_4A02AC
UPX1:0049A9C5                 mov     eax, [eax]
UPX1:0049A9C7                 call    @Forms@TApplication@Terminate$qqrv ; 

Forms::TApplication::Terminate(void)
UPX1:0049A9CC                 jmp     loc_49AA5D
UPX1:0049A9D1 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
UPX1:0049A9D1 
UPX1:0049A9D1 loc_49A9D1:                             ; CODE XREF: sub_49A940+4Fj
UPX1:0049A9D1                 mov     eaxebx
UPX1:0049A9D3                 mov     edx, [eax]
UPX1:0049A9D5                 call    dword ptr [edx] ; 新建一TFileStream
UPX1:0049A9D7                 mov     edieax        ; 返回文件大小
UPX1:0049A9D9                 sub     edi, [ebp+var_10] ; 文件尾16字节内容:22F4 0B00 7B14 AE47 E17A 0A40 9713 0000 
UPX1:0049A9D9                                         ; 
UPX1:0049A9D9                                         ; 这里22F4 0B00 即0BF422h即为附加文件大小
UPX1:0049A9D9                                         ; 9713 0000 为校验信息?
UPX1:0049A9DC                 mov     [esi+344h], edi
UPX1:0049A9E2                 xor     ecxecx
UPX1:0049A9E4                 mov     edxedi
UPX1:0049A9E6                 mov     eaxebx
UPX1:0049A9E8                 mov     edi, [eax]
UPX1:0049A9EA                 call    dword ptr [edi+14h] ; SetFilePointer文件指针 指向取附加文件尾向上0BF422h处
UPX1:0049A9ED                 mov     edxebx
UPX1:0049A9EF                 mov     eaxesi
UPX1:0049A9F1                 call    sub_49AD64  ; 读取并处理电子书内容
...


是不是一目了然啊。
文件尾最后一个DWORD是校验信息,倒数第四个DWORD是附加的文件大小。
于是用 WinHex 打开原程序,Alt+G来到文件尾向上偏移0BF422h的地方。从这里复制到文件尾再insert到脱壳后的文件尾,保存,运行一下,正常了 。

下面就是你的工作了,这种电子书的保护都是比较弱的,前一阵子看过一个软件 合同大师 是用ebook workshop做的,下一个ebook workshop一看,注册机都给你做好了,只要你找到密钥,跟了一下,密钥在内存中还是明文。