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))
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));
}
}
写在末尾,事后我在网上搜了下,早已经有人写出提取工具了,不过如果不放心别人
写的工具,可以自己实现,不是更“安全”吗?