论坛: 编程破解 标题: [转帖]PE+DIY打造电子书反编译工具系列2 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
作者:啊cr
【文章标题】: 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


地主 发表时间: 07-07-07 09:42

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号