【文章标题】: PE+DIY 打造电子书反编译工具 系列2
【文章作者】: 啊CR/FTSTT
【作者主页】: Viper.68ab.com
【软件名称】: ebookedit 3.31
【下载地址】: 自己搜索下载
--------------------------------------------------------------------------------
【详细过程】
unebookedit 提供对ebookedit反编译的支持但是不支持ebookedit 3.31版本。
遂有此文。
相对于上一篇中的Activ E-Book 4.22 ,ebookedit3.31要复杂,原因是ebookedit软件较Activ E-Book 4.22完善并不生成临时文件,所以就需要我们添加相关的函数并在适当的时机将文件数据输出。
1.
首先将白鼠拽出来。
安装ebookedit3.31并使用资源编辑软件将eBookEdit.exe中的sfxexe资源保存为0.exe;
用peid 查看0.exe
UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo
用upx -d 脱之。 白鼠在这里了。
2.
分析先给白鼠动什么手术。
经过对软件的了解,发现这个版本不会生成临时文件,使用peid的PE2HTML输出个网页,分析后发现没有文件输出相关的函数,所以需要加输入函数,要写自己的代码,也得加个区段。
3.
先开刀,做什么看看再说。
用 LordPE 的 PE编辑器 载入脱壳后的文件,点击 区段 按钮,打开 区段表 对话框,在右键菜单中选择 增加区段头 。
在新加的 .NewSec 区段上单击右键选择 编辑区段头 弹出 编辑区段头 对话框,按自己的喜好把 名称改掉(显得有个性),我改为 FTSTT。
将虚拟大小改为10000,实际大小改为10000。这是十六进制数。 标志无需改动。点击确定。
把 CODE 段的 标志 改为可读可写可执行。
退出 LordPE 用C32Asm打开编辑后的程序,在文件尾部添加 65536 (0x10000) 大小的数据,保存。
用 LordPE 的重建pe 重建编辑后的文件 【设置中 只选 验证pe有效性】
再次用 LordPE 的 PE编辑器 载入文件,点击 目录 按钮,打开 目录表 对话框。
用pE编辑器打开程序,点击 【目录】 ,点击 导入表 后的【...】按钮,在上栏中点击右键选择【添加导入表】,在DLl 后面的 文本框中填【kernel32.dll】,选中【检查函数是否存在】在API 后面的 文本框中填【_lcreat】,点击后面的加号。
循环添加kernel32.dll 中的四个函数
kernel32._lcreat 用于创建文件
kernel32._lwrite 用于写入文件
kernel32._lclose 用于结束文件
kernel32.CreateDirectoryA 用于创建目录(原来用的CMD命令 效率不高所以改了)
保存完毕。
4.
开始精细的手术
OD载入,这个sfx要和数据连在一起才能显示书籍内容,可是如果调试sfx本身附加的数据会给随时保存修改带来麻烦,(文件被占用)。也给完成后的应用带来麻烦。
所以修改一下文件调用方案。
下断点 BP CreateFileA
第一处就是对电子书文件的调用
然后返回这里
00408CE6 8BC7 MOV EAX,EDI
00408CE8 E8 4BB9FFFF CALL 0_unpack.00404638
00408CED 50 PUSH EAX
00408CEE E8 75DAFFFF CALL <JMP.&KERNEL32.CreateFileA>
00408CF3 5F POP EDI 返回这里
00408CF4 5E POP ESI
00408CF5 5B POP EBX
修改到跳转到新代码
Alt+M 查看区段FTSTT的虚拟地址004C8000(我之前修改了资源所以是8000)
00408CED PUSH EAX JMP 004C8010
新代码
004C8009 90 NOP
004C800A 90 NOP
004C800B 90 NOP
004C800C 90 NOP
004C800D 90 NOP
004C800E 90 NOP
004C800F 90 NOP
004C8010 8B70 FC MOV ESI,DWORD PTR DS:[EAX-4] ; 获得程序路径长度
004C8013 83C6 02 ADD ESI,2 ; 加上两个引号的长度 (有其他方法)
004C8016 FF15 F0214A00 CALL DWORD PTR DS:[<&KERNEL32.GetCommand>; 获得命令行
004C801C 03C6 ADD EAX,ESI
004C801E 40 INC EAX ; 前往参数位置
004C801F 8038 20 CMP BYTE PTR DS:[EAX],20
004C8022 ^74 FA JE SHORT 0.004C801E ; 去引号前的空格
004C8024 8038 22 CMP BYTE PTR DS:[EAX],22
004C8027 ^74 F5 JE SHORT 0.004C801E ; 去引号
004C8029 8078 FF 00 CMP BYTE PTR DS:[EAX-1],0
004C802D 74 2F JE SHORT 0.004C805E ; 判断是否有参数 for OD
004C802F 66:8378 FF 20 CMP WORD PTR DS:[EAX-1],20
004C8034 90 NOP ; 没参数自动调用默认文件
004C8035 74 27 JE SHORT 0.004C805E ; 判断是否有参数 for 正常运行时
004C8037 8BF0 MOV ESI,EAX
004C8039 40 INC EAX
004C803A 8038 00 CMP BYTE PTR DS:[EAX],0
004C803D ^75 FA JNZ SHORT 0.004C8039
004C803F 48 DEC EAX
004C8040 8038 22 CMP BYTE PTR DS:[EAX],22
004C8043 ^74 FA JE SHORT 0.004C803F
004C8045 8038 20 CMP BYTE PTR DS:[EAX],20
004C8048 ^74 F5 JE SHORT 0.004C803F
004C804A C640 01 00 MOV BYTE PTR DS:[EAX+1],0 ; 上面的代码取出命令行尾部的引号
004C804E 56 PUSH ESI ; 调用参数中的文件
004C804F FF15 A8234A00 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; kernel32.CreateFileA
004C8055 83F8 FF CMP EAX,-1
004C8058 -0F85 950CF4FF JNZ 0.00408CF3
004C805E BE B0804C00 MOV ESI,0.004C80B0 ; ASCII "C:\FTSTT\book.exe"
004C8063 56 PUSH ESI ; 调用默认文件
004C8064 FF15 A8234A00 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; kernel32.CreateFileA
004C806A 83F8 FF CMP EAX,-1
004C806D -0F85 800CF4FF JNZ 0.00408CF3
004C8073 61 POPAD
004C8074 6A 40 PUSH 40
004C8076 68 CF804C00 PUSH 0.004C80CF ; 没有文件时的提示信息
004C807B 68 EF804C00 PUSH 0.004C80EF
004C8080 6A 00 PUSH 0
004C8082 FF15 24224A00 CALL DWORD PTR DS:[<&user32.MessageBoxA>>; USER32.MessageBoxA
004C8088 FF15 00224A00 CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; kernel32.ExitProcess
004C808E 0000 ADD BYTE PTR DS:[EAX],AL
004C8090 0000 ADD BYTE PTR DS:[EAX],AL
004C8092 0000 ADD BYTE PTR DS:[EAX],AL
字符串
004C80B0 ; ASCII "C:\FTSTT\book.exe"
004C80CF 文件不存在或无法访问.
004C80EF C4 E3 BF C9 D2 D4 BD AB 你可以将
004C80F7 65 62 6F 6F 6B 65 64 69 ebookedi
004C80FF 74 33 2E 33 31 B1 E0 D2 t3.31编
004C8107 EB B5 C4 B5 E7 D7 D3 CA 氲牡缱邮
004C810F E9 CD CF D7 A7 B5 BD B1 橥献У奖
004C8117 BE B3 CC D0 F2 B5 C4 CD 境绦虻耐
004C811F BC B1 EA C9 CF A3 BB 0D 急晟希?
004C8127 0A BB F2 D5 DF BD AB B5 .或者将
004C812F E7 D7 D3 CA E9 B1 A3 B4 缱邮楸4
004C8137 E6 CE AA 43 3A 5C 46 54 嫖狢:\FT
004C813F 53 54 54 5C 62 6F 6F 6B STT\book
004C8147 2E 65 78 65 A3 BB 0D 0A .exe;..
004C814F BB F2 D5 DF A3 AC BF C9 或者,可
004C8157 CA B9 D3 C3 C3 FC C1 EE 使用命令
004C815F D0 D0 20 C0 FD C8 E7 A1 行 例如
004C8167 BE 22 B1 BE B3 CC D0 F2 ?本程序
004C816F C3 FB A3 A8 B0 FC BA AC 名(包含
004C8177 C2 B7 BE B6 A3 A9 22 20 路径)"
004C817F 22 43 3A 5C 46 54 53 54 "C:\FTST
004C8187 54 5C 62 6F 6F 6B 2E 65 T\book.e
004C818F 78 65 22 A1 BF A1 A3 0D xe"】。.
004C8197 0A B7 B4 B1 E0 D2 EB BA .反编译
004C819F F3 B5 C4 CE C4 BC FE BB 蟮奈募
004C81A7 E1 B1 BB B1 A3 B4 E6 D4 岜槐4嬖
004C81AF DA 43 3A 5C 46 54 53 54 贑:\FTST
004C81B7 54 5C 20 C4 BF C2 BC CF T\ 目录
004C81BF C2 A1 A3 0D 0A B0 A1 43 隆?.啊C
004C81C7 52 2F 46 54 53 54 54 00 R/FTSTT.
完成以上代码后,就可以将电子书拖拽到程序图标上完成载入,也可以使用命令行。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
调试时发现的一个ebookedit的一个特性 即可以使用 页面超链接调用程序的功能,
比如
0049B311 8B80 08030000 MOV EAX,DWORD PTR DS:[EAX+308]
0049B317 8B18 MOV EBX,DWORD PTR DS:[EAX]
0049B319 FF53 40 CALL DWORD PTR DS:[EBX+40]
0049B31C E9 73010000 JMP 0.0049B494
0049B321 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0049B324 BA F8B54900 MOV EDX,0.0049B5F8 ; ASCII "SEARCH"
0049B329 E8 5692F6FF CALL 0.00404584
0049B32E 75 1D JNZ SHORT 0_unpack.0049B34D
0049B330 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0049B333 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8]
0049B336 66:C700 FFFF MOV WORD PTR DS:[EAX],0FFFF
0049B33B 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0049B33E 8B40 F4 MOV EAX,DWORD PTR DS:[EAX-C]
0049B341 33D2 XOR EDX,EDX
判断超链接是否是“SEARCH”,如果是就弹出搜索对话框。这就给DIY带来了方便。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DIY 电子书反编译工具的有两个关键,一是输出数据,二是遍历所有文件,才能反编译全部的文件。
正好用上面的代码,因为不是所有的电子书都为用户提供搜索功能。
0049B31C E9 73010000 JMP 0.0049B494
0049B321 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0049B324 BA F8B54900 MOV EDX,0.0049B5F8 ; ASCII "SEARCH"
0049B329 E8 5692F6FF CALL 0.00404584
0049B32E -E9 ADCE0200 JMP 0.004C81E0 ; 修改这里跳走,弹出搜索对话框
0049B333 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8]
0049B336 66:C700 FFFF MOV WORD PTR DS:[EAX],0FFFF
0049B33B 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0049B33E 8B40 F4 MOV EAX,DWORD PTR DS:[EAX-C]
0049B341 33D2 XOR EDX,EDX
004C81E0 C705 2EB34900 75>MOV DWORD PTR DS:[49B32E],458B1D75 ; 恢复0049B32E的代码 为了正常浏览电子书
004C81EA C605 32B34900 08 MOV BYTE PTR DS:[49B332],8
004C81F1 -E9 3A31FDFF JMP 0.0049B330 ; 弹出搜索对话框
添加判断 让搜索可以正常
00494D43 65:61 POPAD ; 多余的前缀
00494D45 72 63 JB SHORT 0_unpack.00494DAA
00494D47 68 00008BC0 PUSH C08B0000
00494D4C -E9 BF340300 JMP 004C8210
00494D51 90 NOP
00494D52 53 PUSH EBX
00494D53 56 PUSH ESI
004C820E 0000 ADD BYTE PTR DS:[EAX],AL
004C8210 83FA 00 CMP EDX,0 ; edx 是搜索的字符串
004C8213 74 0E JE SHORT 0.004C8223 ; 比较有没有字符串
004C8215 813A 46545354 CMP DWORD PTR DS:[EDX],54535446
004C821B 75 06 JNZ SHORT 0.004C8223 ; 比较字符串 和 “FTSTT”
004C821D 807A 04 54 CMP BYTE PTR DS:[EDX+4],54
004C8221 74 1D JE SHORT 0.004C8240 ; 符合条件跳
004C8223 55 PUSH EBP ; 恢复代码
004C8224 8BEC MOV EBP,ESP
004C8226 83C4 DC ADD ESP,-24 ; 返回原代码
004C8229 -E9 24CBFCFF JMP 0.00494D52
004C822E 0000 ADD BYTE PTR DS:[EAX],AL
004C8230 0000 ADD BYTE PTR DS:[EAX],AL
004C8232 0000 ADD BYTE PTR DS:[EAX],AL
004C8234 0000 ADD BYTE PTR DS:[EAX],AL
004C8236 0000 ADD BYTE PTR DS:[EAX],AL
004C8238 0000 ADD BYTE PTR DS:[EAX],AL
004C823A 0000 ADD BYTE PTR DS:[EAX],AL
004C823C 0000 ADD BYTE PTR DS:[EAX],AL
004C823E 0000 ADD BYTE PTR DS:[EAX],AL
004C8240 C705 EA434900 E9>MOV DWORD PTR DS:[4943EA],33F11E9 ; smc 修改程序代码 将文件输出
004C824A C605 EE434900 00 MOV BYTE PTR DS:[4943EE],0
004C8251 C705 00444900 E9>MOV DWORD PTR DS:[494400],33F2BE9
004C825B C605 04444900 00 MOV BYTE PTR DS:[494404],0
004C8262 C705 074F4900 E9>MOV DWORD PTR DS:[494F07],33695E9
004C826C 66:C705 0B4F4900>MOV WORD PTR DS:[494F0B],9000
004C8275 ^EB A7 JMP SHORT 0.004C821E
004C8277 90 NOP
004C8278 0000 ADD BYTE PTR DS:[EAX],AL
004C827A 0000 ADD BYTE PTR DS:[EAX],AL
004C827C 0000 ADD BYTE PTR DS:[EAX],AL
保存文件名的地址备用
004C8300 891D FA824C00 MOV DWORD PTR DS:[4C82FA],EBX
004C8306 8B5D E8 MOV EBX,DWORD PTR SS:[EBP-18]
004C8309 8BD3 MOV EDX,EBX
004C830B -E9 DFC0FCFF JMP 0.004943EF
004C8310 0000 ADD BYTE PTR DS:[EAX],AL
004C8312 0000 ADD BYTE PTR DS:[EAX],AL
004C8314 0000 ADD BYTE PTR DS:[EAX],AL
004C8316 0000 ADD BYTE PTR DS:[EAX],AL
004C8318 0000 ADD BYTE PTR DS:[EAX],AL
004C831A 0000 ADD BYTE PTR DS:[EAX],AL
保存寄存器
004C8328 0000 ADD BYTE PTR DS:[EAX],AL
004C832A 0000 ADD BYTE PTR DS:[EAX],AL
004C832C 0000 ADD BYTE PTR DS:[EAX],AL
004C832E 0000 ADD BYTE PTR DS:[EAX],AL
004C8330 892D 58834C00 MOV DWORD PTR DS:[4C8358],EBP
004C8336 BD 58834C00 MOV EBP,0.004C8358
004C833B 8945 04 MOV DWORD PTR SS:[EBP+4],EAX
004C833E 894D 08 MOV DWORD PTR SS:[EBP+8],ECX
004C8341 8955 0C MOV DWORD PTR SS:[EBP+C],EDX
004C8344 895D 10 MOV DWORD PTR SS:[EBP+10],EBX
004C8347 8965 14 MOV DWORD PTR SS:[EBP+14],ESP
004C834A 8975 18 MOV DWORD PTR SS:[EBP+18],ESI
004C834D 897D 1C MOV DWORD PTR SS:[EBP+1C],EDI
004C8350 EB 2F JMP SHORT 0.004C8381
004C8352 0000 ADD BYTE PTR DS:[EAX],AL
004C8354 0000 ADD BYTE PTR DS:[EAX],AL
004C8356 0000 ADD BYTE PTR DS:[EAX],AL
004C8358 0000 ADD BYTE PTR DS:[EAX],AL
链接文件名和输出目录
字符串
004C83E1 ; ASCII "C:\FTSTT\Un-Ebook\"
004C8381 8B1D FA824C00 MOV EBX,DWORD PTR DS:[4C82FA]
004C8387 8B33 MOV ESI,DWORD PTR DS:[EBX]
004C8389 8935 7A834C00 MOV DWORD PTR DS:[4C837A],ESI
004C838F C705 7B834C00 00>MOV DWORD PTR DS:[4C837B],0
004C8399 8B35 7A834C00 MOV ESI,DWORD PTR DS:[4C837A]
004C839F B8 F2834C00 MOV EAX,0.004C83F2
004C83A4 43 INC EBX
004C83A5 40 INC EAX
004C83A6 8B0B MOV ECX,DWORD PTR DS:[EBX]
004C83A8 8908 MOV DWORD PTR DS:[EAX],ECX
004C83AA 4E DEC ESI
004C83AB 83FE 00 CMP ESI,0
004C83AE ^75 F4 JNZ SHORT 0.004C83A4
004C83B0 C640 01 00 MOV BYTE PTR DS:[EAX+1],0
004C83B4 E9 47010000 JMP 0.004C8500
004C83B9 0000 ADD BYTE PTR DS:[EAX],AL
004C83BB 0000 ADD BYTE PTR DS:[EAX],AL
004C83BD 0000 ADD BYTE PTR DS:[EAX],AL
004C83BF 0000 ADD BYTE PTR DS:[EAX],AL
创建目录和文件 回恢复寄存器并返回程序正常指令
004C84FD 0000 ADD BYTE PTR DS:[EAX],AL
004C84FF 90 NOP
004C8500 B8 E1834C00 MOV EAX,0.004C83E1 ; ASCII "C:\FTSTT\Un-Ebook\"
004C8505 40 INC EAX
004C8506 8038 00 CMP BYTE PTR DS:[EAX],0
004C8509 74 1E JE SHORT 0.004C8529
004C850B 8038 5C CMP BYTE PTR DS:[EAX],5C
004C850E ^75 F5 JNZ SHORT 0.004C8505
004C8510 C600 00 MOV BYTE PTR DS:[EAX],0
004C8513 8BF8 MOV EDI,EAX
004C8515 6A 00 PUSH 0
004C8517 68 E1834C00 PUSH 0.004C83E1 ; ASCII "C:\FTSTT\Un-Ebook\"
004C851C FF15 3E804D00 CALL DWORD PTR DS:[<&kernel32.CreateDire>; kernel32.CreateDirectoryA
004C8522 8BC7 MOV EAX,EDI
004C8524 C600 5C MOV BYTE PTR DS:[EAX],5C
004C8527 ^EB DC JMP SHORT 0.004C8505
004C8529 6A 00 PUSH 0
004C852B BE E1834C00 MOV ESI,0.004C83E1 ; ASCII "C:\FTSTT\Un-Ebook\"
004C8530 56 PUSH ESI
004C8531 FF15 42804D00 CALL DWORD PTR DS:[<&kernel32._lcreat>] ; kernel32._lcreat
004C8537 8BF0 MOV ESI,EAX
004C8539 FF35 5C834C00 PUSH DWORD PTR DS:[4C835C]
004C853F FF35 64834C00 PUSH DWORD PTR DS:[4C8364]
004C8545 56 PUSH ESI
004C8546 FF15 46804D00 CALL DWORD PTR DS:[<&kernel32._lwrite>] ; kernel32._lwrite
004C854C 56 PUSH ESI
004C854D FF15 4A804D00 CALL DWORD PTR DS:[<&kernel32._lclose>] ; kernel32._lclose
004C8553 BD 58834C00 MOV EBP,0.004C8358
004C8558 8B45 04 MOV EAX,DWORD PTR SS:[EBP+4]
004C855B 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004C855E 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
004C8561 8B5D 10 MOV EBX,DWORD PTR SS:[EBP+10]
004C8564 8B65 14 MOV ESP,DWORD PTR SS:[EBP+14]
004C8567 8B75 18 MOV ESI,DWORD PTR SS:[EBP+18]
004C856A 8B7D 1C MOV EDI,DWORD PTR SS:[EBP+1C]
004C856D 8B2D 58834C00 MOV EBP,DWORD PTR DS:[4C8358]
004C8573 8BD3 MOV EDX,EBX
004C8575 8BC8 MOV ECX,EAX
004C8577 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004C857A -E9 88BEFCFF JMP 0.00494407
004C857F 0000 ADD BYTE PTR DS:[EAX],AL
004C8581 0000 ADD BYTE PTR DS:[EAX],AL
004C8583 0000 ADD BYTE PTR DS:[EAX],AL
004C8585 0000 ADD BYTE PTR DS:[EAX],AL
004C8587 0000 ADD BYTE PTR DS:[EAX],AL
004C8589 0000 ADD BYTE PTR DS:[EAX],AL
所有文件释放完成后恢复刚才SMC的代码
004C85D1 90 NOP
004C85D2 90 NOP
004C85D3 90 NOP
004C85D4 90 NOP
004C85D5 -0F85 F5C7FCFF JNZ 0.00494DD0
004C85DB C705 EA434900 8B>MOV DWORD PTR DS:[4943EA],8BE85D8B
004C85E5 C605 EE434900 D3 MOV BYTE PTR DS:[4943EE],0D3
004C85EC C705 00444900 8B>MOV DWORD PTR DS:[494400],C88BD38B
004C85F6 C705 04444900 8B>MOV DWORD PTR DS:[494404],E8F8458B
004C8600 C705 074F4900 0F>MOV DWORD PTR DS:[494F07],FEC3850F
004C860A 66:C705 0B4F4900>MOV WORD PTR DS:[494F0B],0FFFF
004C8613 -E9 F5C8FCFF JMP 0.00494F0D
004C8618 90 NOP
004C8619 0000 ADD BYTE PTR DS:[EAX],AL
004C861B 0000 ADD BYTE PTR DS:[EAX],AL
004C861D 0000 ADD BYTE PTR DS:[EAX],AL
说明 SMC的代码共修改三处
第一处 保存文件名的地址备用
004943E2 . E8 91B8FFFF CALL 0.0048FC78
004943E7 . 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
004943EA >-E9 113F0300 JMP 0.004C8300
004943EF . B9 00001000 MOV ECX,100000
004943F4 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
第二处 保存寄存器,然后开始我们的代码,这里寄存器中包含数位置和数据大小
004943FC . 85C0 TEST EAX,EAX
004943FE . 74 0E JE SHORT 0.0049440E
00494400 .-E9 2B3F0300 JMP 0.004C8330
00494405 ? 45 INC EBP
00494406 ? F8 CLC
00494407 . E8 C081F8FF CALL 0.0041C5CC
第三处 判断搜索是否完毕,完毕就恢复指令
00494F00 . 8B08 MOV ECX,DWORD PTR DS:[EAX]
00494F02 . FF51 38 CALL DWORD PTR DS:[ECX+38]
00494F05 > 43 INC EBX
00494F06 . 4E DEC ESI
00494F07 .-E9 95360300 JMP 0.004C85A1
00494F0C ? 90 NOP
00494F0D > 33C0 XOR EAX,EAX
00494F0F . 5A POP EDX
00494F10 . 59 POP ECX
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
上面就是修改好的代码,下面说明一下关键地址的获得
关键,找到文件数据(大小)和文件名的地址。
OD载入后 打开书籍(程序运行)后 在 od中搜索所有参考字符串 并全部下断点。也可以试着直接在.0048FCD0 ASCII "1.1.3" 下断点(几个电子书软件都是差不多。好像和IE的内核有关)。
——此部分可行是因为电子书的链接一般有前缀 比如 ada***——
——此部分可以使用数据流相关的函数 比如申请空间的函数,但没有字符串断点简单直接——
点击一个页面链接,断下,F8,F7,很快就找到了处理 文件名 的代码
注意寄存器,英文名可以直接看到(建议使用英文链接名的电子书)
004943CA 33D2 XOR EDX,EDX
004943CC 55 PUSH EBP
004943CD 68 36444900 PUSH 0_unpack.00494436
004943D2 64:FF32 PUSH DWORD PTR FS:[EDX]
004943D5 64:8922 MOV DWORD PTR FS:[EDX],ESP
004943D8 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
004943DB B2 01 MOV DL,1
004943DD A1 FCF94800 MOV EAX,DWORD PTR DS:[48F9FC]
004943E2 E8 91B8FFFF CALL 0_unpack.0048FC78
004943E7 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
004943EA 8B5D E8 MOV EBX,DWORD PTR SS:[EBP-18]
004943ED 8BD3 MOV EDX,EBX
004943EF B9 00001000 MOV ECX,100000
004943F4 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004943F7 8B30 MOV ESI,DWORD PTR DS:[EAX]
然后F8
很快就是处理数据的代码(电子书好像都是这样,分析超链接,获得文件名,解压数据 webexe有点不同)
注意寄存器
经过
004943F9 FF56 0C CALL DWORD PTR DS:[ESI+C]
数据出现了
以上找关键点的方法适用于80%的电子书(我测试了5个软件 只有一个不大一样,纯一家之言)
两额外的修改
未注册版本提示,很容易找到
00499E8C . 8B90 4C030000 MOV EDX,DWORD PTR DS:[EAX+34C]
00499E92 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00499E95 . 8B80 48030000 MOV EAX,DWORD PTR DS:[EAX+348]
00499E9B . E8 58E2FFFF CALL 0.004980F8 ; 这里可获得电子书制作者的注册名和注册码(危险!)
00499EA0 . 84C0 TEST AL,AL
00499EA2 . EB 45 JMP SHORT 0.00499EE9 ; 跳过未注册版本生成的提示
00499EA4 . 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00499EA7 . B2 01 MOV DL,1
00499EA9 . A1 EC6A4900 MOV EAX,DWORD PTR DS:[496AEC]
00499EAE . E8 1967FDFF CALL 0.004705CC
00499EB3 . 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
00499EB6 . 33C0 XOR EAX,EAX
00499EB8 . 55 PUSH EBP
00499EB9 . 68 E29E4900 PUSH 0.00499EE2
解除密码保护,通过BP regopenkey 跟踪获得
0049C17D 8D40 00 LEA EAX,DWORD PTR DS:[EAX]
0049C180 53 PUSH EBX
0049C181 8BD8 MOV EBX,EAX
0049C183 C683 75030000 00 MOV BYTE PTR DS:[EBX+375],0
0049C18A EB 5C JMP SHORT 0_unpack.0049C1E8 ; 解除密码保护
0049C18C 8B15 1C034A00 MOV EDX,DWORD PTR DS:[4A031C] ; 0.004A1D68
0049C192 A1 D4004A00 MOV EAX,DWORD PTR DS:[4A00D4]
0049C197 E8 3CCBFFFF CALL 0_unpack.00498CD8
0049C19C 8A8B 7C030000 MOV CL,BYTE PTR DS:[EBX+37C]
表述可能有些不清楚,下面是对原代码的修改 可以对照程序跟以下,就很容易理解了。
Patches
地址 大小 状态 旧 新 注释
00408CED 6. 激活 PUSH EAX JMP 004C8010
00494D4C 6. 激活 PUSH EBP JMP 004C8210
00499EA2 2. 激活 JNZ SHORT 0_unpack.00499EE9 JMP SHORT 0_unpack.00499EE9
0049B32E 5. 激活 JNZ SHORT 0_unpack.0049B34D JMP 004C81E0
0049B76C 2. 激活 JNZ SHORT 0_unpack.0049B7EA JMP SHORT 0_unpack.0049B7EA
0049C183 9. 激活 CMP BYTE PTR DS:[EBX+375],0 MOV BYTE PTR DS:[EBX+375],0
--------------------------------------------------------------------------------
【经验总结】
上次预告的ebookedit本身的一个技巧就是 超链接可以使用关键字调用程序功能。
代码是5月写的,所以现在有点忘了。表述不是很清晰,希望大家谅解,下一篇教程 是关于 ebookworshop的(由于相关
工具支持新版的反编译,所以文章只谈界面风格的输出),敬请期待。
预告:简单的读取内存中的ini配置文件,创建文件夹时过滤非法字符,移动文件,删除目录。
感谢看到这里。
--------------------------------------------------------------------------------
2007年06月27日 16:00:00
原版下载
http://www.hanzify.org/index.php?Go=Show::List&ID=4170
附件中为改后的文件
方便大家对比代码
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!