首页 电脑 电脑学堂 查看内容

挑战捆绑文件扫描器的一种方法

2005-3-17 06:04 999 0

摘要: 作者:HEART 来源:天天安全网  自从也不知道谁写的一个捆绑文件查看器后,文件合并器的生命就。。。。。了~   上次看见mjbinder和蔬菜合并器不会被捆绑文件查看器查出来,一直...
关键词: contents 文件 资源 iSize pData integer 时候 PChar var 运行

作者:HEART 来源:天天安全网  自从也不知道谁写的一个捆绑文件查看器后,文件合并器的生命就。。。。。了~   上次看见mjbinder和蔬菜合并器不会被捆绑文件查看器查出来,一直就郁闷。(不知道原理当然郁闷了)的确查不出来但是用PEID扫描可以发现有附加数据。但是大家写程序的时候都用过资源吧,文件保存在资源里是不会被合并文件查看器发现的。所以把文件放到资源中就可以实现不被查和提取(呵呵~不是杀哦~)。   但是资源都是程序搞的时候自己作个资源脚本,编译的时候直接编译进去的,所以现在要作不被查的合并器都是手工实现。。。用资源方式保存EXE等文件在stub里面。运行stub的时候把文件释放出来,然后再用ShellExecute关联运行。但是每次这样搞人都挂了。翻翻MSDN发现一条函数:UpdateResource   作过汉化软件的朋友都知道这个函数干吗用的,就是更新资源用的。现在大家都明白了吧,就是用这个函数更新资源(写过汉化软件的朋友都知道)。   不过后来发现,那个什么来着木马克星捆绑文件查看器,可以查出有3个文件头(我是合并记事本+计算器的)~大问题呀,赶紧解决。修改一下,把资源加密后再存放成资源,具体代码: procedure bindfiles;varf1: File;contents: PChar;NumRead: integer;iSize: integer;i: integer;hBeg: DWORD;beginAssignFile(f1,od1.FileName);//打开文件(就是你要合并的文件--这里是指资源)Reset(f1, 1);//准备写入iSize := FileSize(f1);//返回文件大小GetMem(contents, iSize);//申请一个足够大的空间BlockRead(f1, contents^, iSize, NumRead);//开始写入contents变量CloseFile(f1);//关闭文件//下面开始加密contents变量了~for i := 0 to iSize dobeginif (Ord((contents+i)^) = 255) thenbegin(contents+i)^ := Chr(1);endelse if Ord((contents+i)^) = 0 thenbegin(contents+i)^ := Chr(0);endelsebegin(contents+i)^ := Chr(Ord((contents+i)^) + 1);end;end;//加密完毕~开始更新资源hBeg := BeginUpdateResource(PChar(ExtractFilePath(ParamStr(0)) + 'stub.exe'), FALSE);//打开找到需要更新的主宿文件(就是我们需要的stub.exe)if (hBeg = 0) then Exit;//没有找到就退出UpdateResource(hBeg, 'RT_RCDATA','DNA1', 1033, contents, iSize);//起个名字叫DNA1~语言是1033~存放在RT_RCDATA里面EndUpdateResource(hBeg,FALSE);//更新资源完毕~FreeMem(contents);//释放contents~end;   没了,聪明的你一定能看懂。有个半成品,大家去http://Anskya.ys168.com下载Blue seed binder 0.1(暂时只是测试版本,有很多BUG)。合并的时候请把合并器解压到一个文件夹里再运行(也是BUG~555~过几天学校稳定下来再改改)。   stub运行的时候先载入资源再解密然后存到硬盘上~运行。 stub code: procedure resfree(s:pchar;var x:pchar);var hand : THandle;var hRes : THandle;var iSize : integer;var pData : PChar;var pCont : PChar;var iWrote : integer;var f1 : file;var i : integer;begin//寻找指定的资源hand := FindResource(HInstance, s, 'RT_RCDATA');if (hand = 0) then Exit;hRes := LoadResource(HInstance, hand);if (hRes = 0) then Exit;iSize := SizeofResource(0, hand);if (iSize = 0) then Exit;pCont := LockResource(hRes);GetMem(pData, iSize);//解密过程~for i := 0 to iSize dobegin(pData+i)^ := (pCont+i)^;end;for i := 0 to iSize dobeginif Ord((pData+i)^) = 1 thenbegin(pData+i)^ := Chr(255);endelse if Ord((pData+i)^) = 0 thenbegin(pData+i)^ := Chr(0);endelsebegin(pData+i)^ := Chr(Ord((pCont+i)^) - 1);end;end;//解密完毕~开始写入硬盘~AssignFile(f1, PChar(x));Rewrite(f1, 1);BlockWrite(f1, pData^, iSize, iWrote);CloseFile(f1);FreeMem(pData);end;   如何?这样就可以把资源还原保存出来了。不过这样只是其中的一个方法。小弟在此抛砖引玉了,如果大家有什么好的方法也共享出来哦~呵呵~
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部