FoxMail 本地密码破解(提取) ,逆向分析与实现

    Foxmail是一款用来收发邮件的软件,如果忘记了保存的密码,或者访问口令,就需要

用逆向的方法,找到Foxmail保存密码和访问口令的方法,并设法提取。

    一般来说软件保存密码不是放文件里,就是存注册表。启动ProcMon,过滤Foxmail的

文件操作,然后创建一个新的账户,设置好用户名和密码后,点击确定。从文件过滤中

发现可疑的文件读写操作:

\Accounts\Account.cfg
\Accounts\Account.rec0

    猜测就是保存用户名和密码的文件。

PEID扫描Foxmail发现是Delphi写的,从窗口函数入手会更快一些。直接GetWindowTextA/W

下条件断点,输入密码“666666”,就断下了,然后数据密码设置硬件访问断点,跟踪一会儿就

可以找到加密函数了。分析发现就是和一个固定字符串做异或加密,然后在前面添加字符串

“password”作为标记。 知道了这些就可以轻松提取密码了。

   下面给出异或加密的算法:

char * EncAlg(char * src,bool encrypt)
{
	unsigned char data[]=
	{
		0x7E, 0x46, 0x40, 0x37, 0x25, 0x6D, 0x24, 0x7E
	};
	int x=0;
	for(int i=0;i<sizeof(data);i++)
	{
		x+=data[i];
	}
	x %=255;		//计算固定值

	char *ret = (char*)VirtualAlloc(0,strlen(src)/2,MEM_COMMIT,PAGE_READWRITE);
	//char * ret=(char*)malloc(strlen(src)/2);

	memset(ret,0,strlen(src));
	char t0 [3]={0};
	memcpy(t0,src,2);
	int p1= IntFromHexStr(t0);

#ifdef DEBUG 
	printf("p1= %d \n",p1);
#endif 
	int v35 = p1 ^ x;
	int v36=0;
	int index=2;		//从0开始算,第二个字符开始解密
	int i=0;
	do{
		if(v36 >= sizeof(data))
			v36 = 1;
		else
			++v36;
		memcpy(t0,src+index,2);
#ifdef DEBUG
		printf("dec = %02X \n",IntFromHexStr(t0));
#endif
		ret[i]= IntFromHexStr(t0) ^ data[v36-1];
#ifdef DEBUG
		printf("char =  %02X \n",ret[i]);
#endif
		int tmp=ret[i]&0xff;
		if(tmp > v35)
			tmp-=v35;
		else
			tmp=tmp+0xff-v35;
		ret[i]=(unsigned char)tmp;
		index+=2;
		v35=IntFromHexStr(t0);
		++i;
	}while(strlen(src) > index);
#ifdef DEBUG
	printf("dec = %s\n",ret);
#endif
	return ret;
}

     搜索“幻数”,提取加密后的密码:


char * SearchHead(File * file, char * magic)
{
	//char magic[]="Password";
	char *p=file->dat;
	int cur=0;
	char * ret =0;
	while(cur < (file->fSizeLow-sizeof(magic)))
	{
		if(!memcmp(magic, p + cur,sizeof(magic)))		//找到幻数
		{
#ifdef DEBUG 

			getchar();
			printf("%08X\n",p+cur + sizeof(magic) + 4);
#endif
			int len = *(int*)(p+cur + strlen(magic) + 4);		//获取字符串长度 

			
#ifdef DEBUG
			printf("key len = %d\n",len);
#endif
			ret = (char*)VirtualAlloc(NULL,len+1,MEM_COMMIT,PAGE_READWRITE);
			if(GetLastError() != ERROR_SUCCESS)
				return 0;
			//ret= (char*)malloc(len+1);
			memset(ret,0,len+1);
			memcpy(ret,p+cur+strlen(magic)+8,len);
			return ret;
		}
		cur++;
	}
	return ret;

}

void AnaFile(TCHAR * fileName)
{
	File * file=new File(fileName,false);
	if(!file->success)
	{
		printf("can not open file : %s\n",fileName);
		return ;
	}

	char NameMagic[] = "Account";
	char *name = SearchHead(file,NameMagic);
	if(name !=NULL )
	{
		printf("Account Name : %s\n",name);
	}

	char AccountMagic[]="Password";

	char * accountPwd = SearchHead(file,AccountMagic);
	if(accountPwd != NULL)
	{
#ifdef DEBUG 
		printf("user password is %s\n",accountPwd);
#endif
		printf("password is : %s\n",EncAlg(accountPwd,FALSE));
	}

	char AccessMagic[] ="NodePass";
	char * accessPwd = SearchHead(file,AccessMagic);
	if(accessPwd != NULL)
	{
#ifdef DEBUG 
		printf("Access password is %s\n",accessPwd);
#endif
		printf("access password is : %s\n",EncAlg(accessPwd,FALSE));
	}

}

    写在末尾,事后我在网上搜了下,早已经有人写出提取工具了,不过如果不放心别人

写的工具,可以自己实现,不是更“安全”吗?

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值