2009年6月11日星期四

“绿坝”软件的进一步发现

这应该是一些我发现了而别人没有发现的东西。
1、服务Mpsvcc.exe有 -removejh 的参数,用这个参数运行就会自删除服务和自动停止;hnceng.exe有类似的 -remove 参数。这两个服务被中止后,“绿坝”就立即形同虚设(至少最重要的关键词过滤没用了)。
2、会尝试往所有进程都注入个InjLib32.dll,但是在其进行文字过滤时(被文字过滤的程序还会进一步注入Handler.dll、HncengPS.dll和Sentenceobj.dll),对进程名是有要求的(如notepad.exe会被注入,而改名为np.exe就不会)。而那个Handler.dll似乎还有Hook API保护文件、注册表项和键值的能力。
3、图像过滤功能是检测IE缓存中的图像,经常突然无法使用,而且对.png的图片根本就不会过问。
4、负责弹出那个 此信息不良 的模块叫做poppo.dll。
5、和我之前想的不同,其实那个winsock LSP dbfilter.dll 有分析HTTP请求,监视某个黑名单中的url并关闭连接的功能。但是它并不会通过分析URL后继续抓包分析关键词,因此在IDS角度看仍然非常简单,没有某第2层那样的能力。
6、其日志文件的“加密”方法是把每个字符的值加1。。。
7、hnc关键词分析过滤组件和winsock lsp URL过滤组件之间是独立的。
8、xnet2、mpsvcc在启动时会自动试图恢复Winsock LSP组件,但是xnet2却不能恢复mpsvcc和hnceng,在后两个服务被删除/卸载的状态下,xnet2会干脆报错退出。
9、xdaemon和xnet2构成双进程保护。

我认为,要完美卸载这个版本的绿坝,需要知道其自身文件列表。我的Thinstall快照可以拿来参考。第一步是把mpsvcc和hnceng用自带
参数卸载掉,然后结束xdaemon/xnet2,然后把已经注入的DLL之外的文件全部删除,删除各注册表项,恢复Winsock LSP表,那几个剩下的DLL,重启后删除就没问题了。

update 6.15:有人告诉了我绿坝.dat文件解密的方法(一种一个字节变成两个字节的算法,具体看程序),因此自己写了一段小程序。
/*绿坝.dat加密文件解密程序*/
#include
#include
typedef struct gd16word{
unsigned char lo;
unsigned char hi;
}gd16wrd;
char decgd16(gd16wrd a)
{unsigned int r1,r2,r3;
r1=a.lo<<4;
r2=a.hi&15;
r1=r1|r2;
r1=~r1;
r3=~r1^(char)r1;
r3=r3&51;
r2=r1^r3;
return (char)r2;}

main(int argc, char* argv[]){
char ofn[300];
char c;
int d,i;
gd16wrd buf;
FILE *fi,*fo;
printf("GreenDam 3.713 .dat decoder by yksoft1\n");
if(argc<2)
{
printf("Usage: gd16d inputfile, [output file]\r\n");
return;
}
if ((fi = fopen(argv[1], "rb")) ==NULL){
printf("Error opening input file %s\n",argv[1]);
exit(1); }
if(argc==2)
{strcpy(ofn,argv[1]);
i=strlen(ofn)-1;
while(i>0&&ofn[i]!='.')
i--;
ofn[i]='\0';
strcat(ofn,".txt");
}
else strcpy(ofn, argv[2]);
if ((fo = fopen(ofn,"wb")) ==NULL){
printf("Error opening file for output!\n");
exit(1); }
while(fread(&buf,sizeof(gd16wrd),1,fi))
{
c=decgd16(buf);
if(c!=22)/*回车换行0D 0A在原文件实际上就是回车换行符,解密后成为16*/
fprintf(fo,"%c",c);
else fprintf(fo,"\r\n");
}
fclose(fo);
fclose(fi);
printf("Completed decrypting %s to %s",argv[1],ofn);
}

没有评论:

发表评论