【文章标题】: 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  嫖r:\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
附件中为改后的文件
方便大家对比代码