首页
社区
课程
招聘
[原创] E书工厂 电子书 染毒后的修复原理和工具源码
发表于: 2007-8-6 01:19 11548

[原创] E书工厂 电子书 染毒后的修复原理和工具源码

2007-8-6 01:19
11548
【文章标题】: E书工厂 电子书 染毒后的修复原理和工具源码
【文章作者】: 啊CR/FTSTT
【作者主页】: Viper.68ab.com
【下载地址】: 自己搜索下载
--------------------------------------------------------------------------------
【详细过程】
  原理:
  
  E书工厂的电子书就是一个带有附加数据的程序文件,程序本身加有aspack的壳。
  
  中毒&杀毒会改变什么呢?
  
  1.文件实际长度,PE病毒要写入自己的代码通常是在文件末尾增加一段数据,杀软并没有完全清除这些数据造成文件的长度和原始文件不同,导致运行错误,电子书无法浏览。
  
  2.校验和,E书工厂 的电子书的校验和是空的,杀软或病毒自作聪明 的填充这个位置,程序引用此值时产生错误,找不到正确的书籍数据,电子书无法浏览。
  
  3.最后区段大小&总大小,这是相关联的一对,病毒加了代码需要再获得虚拟地址所以它修改程序的最后区段大小,自然也修改了总大小(也许是杀软干的,呵呵),程序引用此值时产生错误,找不到正确的书籍数据,电子书无法浏览。
  
  4.最后区段属性,这个是修改3的后遗症。应该不影响阅读的(未测)。
  
  5.OEP,病毒要执行自然要有切入点,通常是OEP,他如果改了这个杀软没有正确恢复,电子书自然不能正常运行了。
  
  
  修复方案
  
  1.根据电子书的特征串 “ADAEBOOK”判断结尾,去除垃圾数据
  
  2.清空校验和
  
  3.aspack加壳的最后区段的相关值是固定的,直接恢复
  
  4.同3
  
  5.杀软目前做的比较好,暂不考虑。
  
  
  恢复方法
  
  二十一世纪还要手工恢复吗?
  
  不!
  
  
  以下为Masm 的源程序,功能是自动完成修复,支持E书工厂的 1.4和1.5两个版本
  
  
  部分代码有注释希望大家能看懂,附件为编译好的程序。
  
  
  
  
;电子书修复工具 For E书工厂(EbookWorkShop) 1.4/1.5
;版本0.3
;源码开放,欢迎修改

;啊Cr/FTSTT


;感谢 陈余,老鬼,SKMS/FTSTT,bwin/FTSTT ,你
.586
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
include windows.inc

includelib user32.lib
includelib kernel32.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD


.data
Number DD 0 ;参数数量
Curren DD 0 ;当前的参数序号
FileSign DD 0 ;文件系统标志
NeedFix DD 0 ;文件是否需要修复
FileDateBegin DD 0 ;数据开始
FileSize DD 0 ;数据大小
hehe db 'FTSTT',0
FixedSign db '.已修复.exe',0 ;修复文件标志
noteCaption db '提示',0
noteText db '本程序使用命令行操作! 可以将需修复的电子书文件拖拽到本程序图标开始修复. 支持多文件同时拖拽,程序会自动识别同时修复.',0
Version DD 0 ;1.4 Or 1.5


.data?
FileName db 4096 dup (?)
hInstance HINSTANCE ?
CommandLine LPSTR ?

.code
include _Cmdline.asm ;这个文件来自罗云彬的例子
; ---------------------------------------------------------------------------


start:
invoke GetModuleHandle, NULL
mov hInstance,eax


;----------------获得目标文件------------------------


invoke _argc ;调用获得参数子程序

mov Number,eax ;保存参数数量
cmp eax,1 ;判断是否有参数
je Note
mov eax,1
Cycle0: invoke _argv,eax,addr FileName,sizeof FileName

mov Curren,eax


;----------------读取文件内容------------------------


lea eax,FileName ;参数装入eax
INVOKE CreateFile, eax ,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov FileSign,eax
INVOKE GetFileSize, EAX, NULL
mov FileSize,eax
cmp eax,180*1024 ;检查文件是否大于180k
jl Cycle
INVOKE VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE
mov FileDateBegin,eax
INVOKE _lread, FileSign,eax,FileSize


;----------------修复文件内容------------------------


mov eax,FileDateBegin
mov esi,FileSize
add eax,esi
mov edi,eax
AAAA: dec eax
dec esi
je Cycle ;文件不支持则跳走
cmp dword ptr [eax],45414441h
jnz AAAA
cmp dword ptr [eax+4],4B4F4F42h
jnz AAAA
cmp dword ptr [eax+8], 0
jnz AAAA
cmp dword ptr [eax+0Bh], 0
jnz AAAA

add eax,0Fh
cmp eax,edi
je AAAB
mov NeedFix,1 ;设置需要修复标志位
AAAB: mov edi,FileDateBegin
sub eax,edi
mov FileSize,eax


;文件大小处理完毕,继续处理校验和


mov eax,FileDateBegin
cmp dword ptr [eax+158h], 0
je V14
mov dword ptr [eax+158h], 0 ;校验和清零
mov NeedFix,1 ;设置需要修复标志位


;校验和处理结束,继续处理最后区段大小

;判断版本(开始谢的时候都不一样,最后调试的时候很多都一样了(浪费了大量的调试时间),懒得改了*_*)


V14: cmp dword ptr [eax+128h], 0A9001h ;根据Ep判断版本[1.4]
jne V15
mov Version,14
jmp AAAC
V15: cmp dword ptr [eax+128h], 0C7001h ;根据Ep判断版本[1.5]
jne Cycle
mov Version,15 ;其实ep也应该是一个需要修复的项目,但还没遇到这类情况,暂且用着


;虚拟大小

AAAC: cmp Version,14
jne AAAC15

cmp dword ptr [eax+368h], 1000h ;aspack最后一个区段虚拟大小应该多大?
je AAAD
mov esi,dword ptr [eax+368h]
sub esi,1000 ;保存最后区段大小变化(没用到)
mov dword ptr [eax+368h], 1000h ;aspack最后一个区段虚拟大小应该1000h
mov NeedFix,1 ;设置需要修复标志位
jmp AAAD

AAAC15:
cmp dword ptr [eax+368h], 1000h ;aspack最后一个区段虚拟大小应该多大?
je AAAD
mov esi,dword ptr [eax+368h]
sub esi,1000 ;保存最后区段大小变化(没用到)
mov dword ptr [eax+368h], 1000h ;aspack最后一个区段虚拟大小应该1000h
mov NeedFix,1


;实际大小
AAAD: cmp Version,14
jne AAAD15

cmp dword ptr [eax+370h], 0 ;aspack最后一个区段实际大小应该多大?
je AAAE
mov dword ptr [eax+370h], 0 ;aspack最后一个区段实际大小应该0
mov NeedFix,1 ;设置需要修复标志位
jmp AAAE

AAAD15:
cmp dword ptr [eax+370h], 0 ;aspack最后一个区段实际大小应该多大?
je AAAE
mov dword ptr [eax+370h], 0 ;aspack最后一个区段实际大小应该0
mov NeedFix,1 ;设置需要修复标志位


;特征值

AAAE: cmp Version,14
jne AAAE15

cmp dword ptr [eax+384h], 0C0000040h ;aspack最后一个区段读写标志应该是?
je AAAF
mov dword ptr [eax+384h], 0C0000040h ;

mov NeedFix,1 ;设置需要修复标志位
jmp AAAF
AAAE15:
cmp dword ptr [eax+384h], 0C0000040h ;aspack最后一个区段读写标志应该是?
je AAAF
mov dword ptr [eax+384h], 0C0000040h ;
mov NeedFix,1 ;设置需要修复标志位


;区段大小结束,继续处理总大小


AAAF: cmp Version,14
jne AAAF15

cmp dword ptr [eax+150h],0AC000h
je Write0
mov dword ptr [eax+150h],0AC000h
mov NeedFix,1 ;设置需要修复标志位
jmp Write0

AAAF15:
cmp dword ptr [eax+150h],0CA000h
je Write0
mov dword ptr [eax+150h],0CA000h
mov NeedFix,1 ;设置需要修复标志位


;其他问题陆续填补,凑合用着先:-)

;----------------文件内容修复完毕--------------------

;输出修复后的文件

Write0: cmp NeedFix,1
jne Cycle

invoke _argv,Curren,addr FileName,sizeof FileName

lea eax,FileName

INVOKE lstrcat,eax,addr FixedSign

INVOKE _lcreat,addr FileName,0

mov esi,eax
INVOKE _lwrite,eax,FileDateBegin,FileSize

INVOKE _lclose,esi




Cycle: ;循环

mov eax,Curren
cmp eax,Number
je Exit
inc eax
mov Curren,eax
mov NeedFix,0
jmp Cycle0

Note: invoke MessageBox,NULL,offset noteText,offset noteCaption,MB_OK
Exit: invoke ExitProcess,eax
end start
  
  
  
--------------------------------------------------------------------------------

                                                       2007年08月06日 1:17:50

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼上的附件这里下载 源码和编译好的程序
上传的附件:
2007-8-6 01:21
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
好,先顶起来再慢慢看
2007-8-6 15:21
0
雪    币: 589
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持   

好,先顶起来再慢慢看
2007-8-6 18:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我都忘了顶了
真系不好意思啊
顶上去了  虽然看的有点糊涂
2007-8-6 19:00
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
6
学习下。源码应该很多人喜欢。
2007-8-6 23:21
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
7
支持开源!!!!!!!!
2007-8-7 01:28
0
雪    币: 3356
活跃值: (2992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
俺来支持一下
2007-8-11 13:51
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
强人。学习了。
2007-8-11 21:03
0
雪    币: 201
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看不懂。也支持下。。。好像很牛
2007-8-12 00:23
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
罗大那本书看来流传的已经很广泛了…
2007-8-12 20:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
虽然看不懂,但是也支持
2007-8-13 22:11
0
雪    币: 236
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
说得很有道理。

32位汇编我不太懂。
2007-8-14 09:16
0
雪    币: 236
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
说得很有道理。

但,32位汇编我不太懂。
2007-8-14 09:16
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
15
支持一群老虎!
学习下Win32ASM!
2007-8-14 09:33
0
游客
登录 | 注册 方可回帖
返回
//