这个是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 edx, eax
UPX1:0049A96B sub edx, 10h ; -10
UPX1:0049A96E xor ecx, ecx
UPX1:0049A970 mov eax, ebx
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 eax, ebx
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 edx, edx
UPX1:0049A998 mov eax, edi
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 cx, ds: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 eax, ds: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 eax, ebx
UPX1:0049A9D3 mov edx, [eax]
UPX1:0049A9D5 call dword ptr [edx] ; 新建一TFileStream
UPX1:0049A9D7 mov edi, eax ; 返回文件大小
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 ecx, ecx
UPX1:0049A9E4 mov edx, edi
UPX1:0049A9E6 mov eax, ebx
UPX1:0049A9E8 mov edi, [eax]
UPX1:0049A9EA call dword ptr [edi+14h] ; SetFilePointer文件指针 指向取附加文件尾向上0BF422h处
UPX1:0049A9ED mov edx, ebx
UPX1:0049A9EF mov eax, esi
UPX1:0049A9F1 call sub_49AD64 ; 读取并处理电子书内容
...
是不是一目了然啊。
文件尾最后一个DWORD是校验信息,倒数第四个DWORD是附加的文件大小。
于是用 WinHex 打开原程序,Alt+G来到文件尾向上偏移0BF422h的地方。从这里复制到文件尾再insert到脱壳后的文件尾,保存,运行一下,正常了 。
下面就是你的工作了,这种电子书的保护都是比较弱的,前一阵子看过一个软件 合同大师 是用ebook workshop做的,下一个ebook workshop一看,注册机都给你做好了,只要你找到密钥,跟了一下,密钥在内存中还是明文。