分析:
1、企业微信收到信息后会存到数据库,或者会先查消息窗口相关信息用以展示。
2、企业微信用的是sqlite数据库
3、从sqlite数据库作为切入点,找到存入数据库时的断点。当然,应该还存在其他的各种方法。
 
一、找HOOK点
1、分析sqlite执行sql语句的源码:
 
SQLITE_API int sqlite3_get_table(
sqlite3 *db, /* The database on which the SQL executes */
const char *zSql, /* The SQL to be executed */
char ***pazResult, /* Write the result table here */
int *pnRow, /* Write the number of rows in the result here */
int *pnColumn, /* Write the number of columns of result here */
char **pzErrMsg /* Write error messages here */
){
int rc;
TabResult res;
 
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) || pazResult==0 ) return SQLITE_MISUSE_BKPT;
#endif
*pazResult = 0;
if( pnColumn ) *pnColumn = 0;
if( pnRow ) *pnRow = 0;
if( pzErrMsg ) *pzErrMsg = 0;
res.zErrMsg = 0;
。。。。
 
SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3 *db){
u32 magic;
if( db==0 ){
logBadConnection("NULL");
return 0;
}
magic = db->magic;
if( magic!=SQLITE_MAGIC_OPEN ){
if( sqlite3SafetyCheckSickOrOk(db) ){
testcase( sqlite3GlobalConfig.xLog!=0 );
logBadConnection("unopened");
}
return 0;
}else{
return 1;
}
}
 
 
第一个可能会被执行的包含比较特殊的字符串符号的语句
logBadConnection("unopened");//应该不会被执行,但是会执行调用它的方法,先找到它就可以找到方法的入口,

 

2、搜索unopened字符串,在引用字符串的语句位置找到函数入口处下断点
给企业微信发送消息后断下
Ctrl+F9跳出函数,观察寄存器地址和栈顶地址存放的数据特征。循环往复直到找到熟悉的微信id和一个可能是企业微信id的内存块儿(大概在断点处断下了三次,再往外跳了n次)

 

3、这时的反汇编区不好hook,在dd [[[esi+24]+8]]的内存位置下内存访问端点,然后F9

 

4、这个位置比较适合,读ecx的值即可。在此处下断点,删除其他断点,测试几次看看
发几个文本、图片、视频,发现都会断下,不发送信息,随便用鼠标操作企业微信不会断下。可以采取次地址为hook地址
 
5、内容结构分析
经过测试分析得出接收内存的偏移对应的大概内容
+0:消息ID
+10:微信ID
+28:会话ID
+50:消息类型
+134:内容
。。。
posted on 2022-10-14 18:52  bzryk  阅读(5104)  评论(3编辑  收藏  举报