技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 981|回复: 4
收起左侧

新版飞信聊天记录逆向分析全过程

[复制链接]

4

主题

10

帖子

199

积分

用户组: 小·技术宅

UID
89
精华
1
威望
13 点
宅币
94 个
贡献
64 次
宅之契约
0 份
在线时间
7 小时
注册时间
2014-2-26
发表于 2016-5-6 14:27:46 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
自学逆向有段时间了,今天来一帖!

直接进入正题:

安装飞信,登录飞信,制造一点聊天记录。
在 C:\Users\%用户名%\Documents\Fetion\"飞信号" 路径下发现了一个文件 V5_History.dat (可以在飞信设置里面点击打开历史记录文件位置直接过去)
看名称就知道啦,飞信数据库文件就是这货。
UE打开观察此文件,一看就知道肯定经过加密的。不做多的解释
1.png
打开飞信主目录,观察飞信目录中的dll。
看dll名称,猜测消息记录处理的dll,飞信主目录内发现目录 Data\History,目录中有个History.dll,猜测这货是处理历史记录的dll
于是打开OD,OD打开Fetion.exe,ALT+E 跟随History.dll,大概喵了几眼,然后CTRL+N查看模块中的名称,
发现一个_FhOpenDB,看名称就知道这是干嘛的了,根据OD显示,此函数出自Fhlib.dll,于是用 eXeScope 查看此dll的导入导出信息
在导入信息中发现导入了ADVAIP.DLL(非常重要!!!!),此DLL是Windows自带的加密算法库,于是打开 IDA Pro,准备开始分心Fhlib.dll.
在Import表里面发现了 CryptCreateHash、CryptHashData、CryptDeriveKey、CryptDestroyHash等很显眼的函数!!
感觉告诉我,这就是解码部分,
于是逆向了这部分代码,完成过后用OD跟踪,确定这几个函数的可变参数内容,哈哈,最重要的生产hash和key的密钥居然是飞信号,立刻打开VS写代码,
一举成功,成功将V5_History.dat解码,用UE打开观察解码后的文件,我艹!!文件签名好熟悉,这不是我常用的 sqlite3 么?而sqlite3是个轻量级小型开源数据库。
接着用数据库可视化查看工具查看数据库内容,聊天记录一览无遗。破解成功。
附上代码!!!
[C++] 纯文本查看 复制代码
* - 将解密的数据库文件放入系统临时目录
*/
int IS_FetionV5History::DeCryptFetionDB()
{
HCRYPTPROV hProv = NULL; 
HCRYPTHASH hHash = NULL; 
LPCTSTR lpszPwd = (LPCTSTR)szFetionNum;//密码,飞信号
HCRYPTKEY hKey = NULL; 

CryptAcquireContext(&hProv, 0, "Microsoft Enhanced Cryptographic Provider v1.0", 1, 0xF0000000);
CryptCreateHash(hProv,0x8004,0,0,&hHash);
CryptHashData(hHash,(const BYTE *)lpszPwd,strlen((const char *)lpszPwd),0);
CryptDeriveKey(hProv,0x6801,hHash,0,&hKey);
CryptDestroyHash(hHash);

/**************************************************************/
HANDLE pInFile,pOutFile;//文件句柄
DWORD dwReadLen = 0x400 ,dwReadSize ,dwWriteSize;//想要读取的数据长度;实际读取文件大小;实际写入数据

{//打开源文件
pInFile = ::CreateFile(strEvidencePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY, NULL); //用这个函数比OpenFile好
if( pInFile == INVALID_HANDLE_VALUE)
{
CloseHandle(pInFile); //一定注意在函数退出之前对句柄进行释放。
return -1;
}
}
{//打开写入文件
pOutFile = ::CreateFile(strDstPath.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL); //用这个函数比OpenFile好
if( pOutFile == INVALID_HANDLE_VALUE)
{
CloseHandle(pOutFile); //一定注意在函数退出之前对句柄进行释放。
return -1;
}
}
/**************************************************************/
BYTE szBuf[0x400 + 1] = {0}; //__in__out 输入加密内容,输出解密后内容 

//循环读取文件
do 
{
ReadFile(pInFile, szBuf, dwReadLen, &dwReadSize, NULL);

if (dwReadLen < dwReadSize) 
CryptDecrypt(hKey,0,TRUE,0,szBuf,&dwReadLen);
else
CryptDecrypt(hKey,0,TRUE,0,szBuf,&dwReadSize);
//写入文件
WriteFile(pOutFile,szBuf,dwReadSize,&dwWriteSize,NULL);

memset(szBuf,0,0x400 + 1);
}while( dwReadSize == dwReadLen);

CloseHandle(pInFile); 
CloseHandle(pOutFile); 
return 0;
}//DeCryptFetionDB()


本帖内容仅供研究学习使用。请勿用作非法用途!!!
----------------------------------------------------------------------------------------------------------------------------------[/hide]


评分

参与人数 1威望 +10 宅币 +10 贡献 +10 收起 理由
0xAA55 + 10 + 10 + 10 加油!

查看全部评分

271

主题

445

帖子

4770

积分

用户组: 真·技术宅

UID
2
精华
61
威望
148 点
宅币
3593 个
贡献
131 次
宅之契约
0 份
在线时间
615 小时
注册时间
2014-1-25
发表于 2016-5-6 21:10:38 | 显示全部楼层
牛逼呀大熊熊

1024

主题

2270

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17418 个
贡献
34873 次
宅之契约
0 份
在线时间
1656 小时
注册时间
2014-1-26
发表于 2016-5-6 22:47:25 | 显示全部楼层
打错字了!是ADVAPI不是ADVAIP!

4

主题

10

帖子

199

积分

用户组: 小·技术宅

UID
89
精华
1
威望
13 点
宅币
94 个
贡献
64 次
宅之契约
0 份
在线时间
7 小时
注册时间
2014-2-26
 楼主| 发表于 2016-5-6 22:49:15 | 显示全部楼层
0xAA55 发表于 2016-5-6 22:47
打错字了!是ADVAPI不是ADVAIP!

哎呀,不要在意这些细节,后来我发现里面很多错别字

4

主题

10

帖子

199

积分

用户组: 小·技术宅

UID
89
精华
1
威望
13 点
宅币
94 个
贡献
64 次
宅之契约
0 份
在线时间
7 小时
注册时间
2014-2-26
 楼主| 发表于 2016-5-6 22:50:39 | 显示全部楼层

牛逼毛噢,刚入门!!!
最近搞那个阿里旺旺,最后一层加密方法一样的。前面的加密方式还没研究出来,纠结死了

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-3-20 23:29 , Processed in 0.111281 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表