# PC微信逆向：分析发送xml名片call

**URL:** <https://forum.90sec.com/t/topic/269>\
**Category:** 信安之路\
**Created:** [2019 年8 月 5 日 08:36 UTC](https://forum.90sec.com/t/topic/269 "2019-08-05T08:36:56Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![xazlsec](https://forum.90sec.com/user_avatar/forum.90sec.com/xazlsec/32/659_2.png) [@xazlsec](https://forum.90sec.com/u/xazlsec)\
发布日期： [2019 年8 月 5 日 08:36 UTC](https://forum.90sec.com/t/topic/269/1 "2019-08-05T08:36:56Z")

</div>

> 本文作者： **鬼手56** （信安之路病毒分析小组成员）
> 
> 成员招募：[信安之路病毒分析小组寻找志同道合的朋友](http://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247488359&idx=1&sn=98507e4fc7d4b15476c286e4aa9b8465&chksm=ec1e234fdb69aa590793a34d7bd7c2c77de3fe0c9d2051d27a5ba74328b3a0a880036bc06644&scene=21#wechat_redirect)

**微信版本**

 ![image](https://forum.90sec.com/uploads/default/original/2X/3/359d2d8d9a3b7d282f46da18fb152d828be83dcd.png)

### 定位发送 xml 名片 call

#### 发送 xml 名片 call 的切入点

 ![image](https://forum.90sec.com/uploads/default/original/2X/4/40688a28b15cc68d51bbf611bbead95d36e88853.jpeg)

在发送 xml 名片时，需要先选择一个对象，我们首先要找的是选择的 call。找到了选择的 call，就能确定要发送的对象的微信 ID 的地址了。有了要发送对象的微信 ID 的地址之后就能下一个内存访问断点，通过栈回溯找到发送 xml 名片的 call

#### 定位选择联系人的 call

那么如何定位到选择联系人的 call 呢？

 ![image](https://forum.90sec.com/uploads/default/original/2X/0/096e15f22deccdf0ef0dff3c58ab0993903145ef.png)

 ![image](https://forum.90sec.com/uploads/default/original/2X/c/ce1b5f40f715a50c2a37dff732d263473fcbeec2.png)

可以通过上面的字符串的区别从而定位到字符串的位置，然后下内存写入断点，再定位到选择的 call

 ![image](https://forum.90sec.com/uploads/default/original/2X/b/be5e51c80d4d01830eb253c71845e8fbf7b9d1b0.jpeg)

在 CE 中搜索已选择了 1 个联系人，找到存放字符串的地址

 ![image](https://forum.90sec.com/uploads/default/original/2X/3/3619f843e59fcf00ffe56aa32ce80ebd686b6ad3.jpeg)

变化选择的联系人，最终确定字符串的地址，接着在 OD 中对这个地址下内存写入断点

 ![image](https://forum.90sec.com/uploads/default/original/2X/b/b82a45acdd5fc361b8ab59cf54107f268c88dcdb.jpeg)

然后在微信选择一个联系人，程序断下。此时删除断点。既然要找选择联系人的 call，那么这个 call 里面必定有一个参数是当前选中的微信 ID，根据这个线索，我们在堆栈中找一个带有微信 ID 的返回地址

 ![image](https://forum.90sec.com/uploads/default/original/2X/5/5231858354e2b904257b01bea71b2739203c16df.jpeg)

反汇编窗口跟随，这个 call 就是选择联系人的 call

 ![image](https://forum.90sec.com/uploads/default/original/2X/4/489a973cfc43406db75b54c83cb8ca969d5b5996.jpeg)

#### 定位发送 xml 名片的 call

##### 定位接收者的微信 ID

接着我们在选择联系人的 call 下断，在微信中选择文件助手，让程序断下

 ![image](https://forum.90sec.com/uploads/default/original/2X/6/64560db65ef9a082c3d88e821e64c063470f312b.jpeg)

此时堆栈的参数中有选中的微信 ID，我们只要通过对这个微信 ID 下内存访问断点，栈回溯分析，就能找到发送 xml 名片的 call。

但是，这个 ID 我们是不能用的，因为它被当作一个参数传入函数中，这个微信 ID 是个局部变量，只要函数一结束，微信 ID 会自动销毁。所以我们需要找到函数调用后被赋值为微信 ID 的变量地址，然后对这个微信 ID 的地址下内存访问断点

 ![image](https://forum.90sec.com/uploads/default/original/2X/1/10af1e37e10c6bd8f56728f1881ec3d3522f3ba8.png)

我们首先在 CE 中添加这个地址

 ![image](https://forum.90sec.com/uploads/default/original/2X/1/1ab679b5826c3c90c00abde31918d3a30dba72c5.png)

接着将这个微信 ID 修改为一个比较独特的值，然后 F8 步过这个函数

 ![image](https://forum.90sec.com/uploads/default/original/2X/1/1bbcee83d7b2dd056177e3e852a1f38174944ddb.jpeg)

搜索修改之后的微信 ID，此时多了 1 个地址。这个多出来的 1 个地址就是我们所需要的。如果多出来两个地址，可以直接按 F9 让程序运行，此时地址只剩下一个。

#### 定位发送 xml 名片的 call

 ![image](https://forum.90sec.com/uploads/default/original/2X/8/84da2718aa4ab8a00e2b8733118ee484b5047b07.jpeg)

对找到的微信 ID 的地址下内存访问断点，F9 运行程序

 ![image](https://forum.90sec.com/uploads/default/original/2X/a/a0fd9db34025121d911b473daf929e56fabcd693.png)

点击发送，此时程序断下，分析附近堆栈

 ![image](https://forum.90sec.com/uploads/default/original/2X/8/8d6112320c6e0aa3fdd17e977c631dc3fad1501e.jpeg)

在堆栈的地址中找到一个参数，里面有微信 ID，那么这个很有可能就是我们需要的 call。在这个地方下断点

 ![image](https://forum.90sec.com/uploads/default/original/2X/0/0d165d9a68c36449e4855a6126c8c846687c3994.jpeg)

程序断下，此时 eax 为微信 ID，ecx 为空。那么这个不是我们需要的 call，继续 F8 单步往下走

 ![image](https://forum.90sec.com/uploads/default/original/2X/b/bacff64db4ef89d2ed303eda2e73ac991f7e3a23.jpeg)

此时我们看到这个 call 将 ForwardShareCard 这个字符串传入了堆栈，这个英文的意思是转发分享名片，那么可以猜测这个函数应该和发送 xml 名片的 call 有关系。继续往下单步

 ![image](https://forum.90sec.com/uploads/default/original/2X/f/fb976f19ff6c9dd72e16b64ba47ad723987cb33f.jpeg)

这里有个 call eax，此时 ecx 指向我们分享的名片的微信 ID，那么这个函数应该和发送 xml 名片是有关系的，我们 F7 进入函数。

一直单步到这里我们找到了一个 call，此时 eax 指向一个 xml 的数据

 ![image](https://forum.90sec.com/uploads/default/original/2X/5/52b5500fbc5381f4a481425c3ddb70b6123329ee.jpeg)

edx 指向接收者的微信 ID，那么这个 call 就非常有可能是我们要找的发送名片的 call

#### 验证发送 xml 名片的 call

那么怎么验证呢？我们修改接收者的微信 ID，让原本发送给文件助手的 xml 名片发给好友，如果 xml 名片发给了微信好友，那么可以证明这个就是我们要的发送 xml 名片的 call

### 方法扩展

依次类推，这种方法可以定位大多数的微信功能的 call，只要是带有这种选择框的call，都可以通过这种方法，先找到选择的函数，然后再通过微信接收者的 ID，下内存访问断点，栈回溯分析附近代码找到所需要的 call

 ![image](https://forum.90sec.com/uploads/default/original/2X/5/55387d0dce51c58632579c50642f3e953c90b9c1.png)

### 推荐阅读

[**原创** PC 端 _微信_ 技术研究之保存聊天语言](http://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247489335&idx=1&sn=aefa2775dc9d6cd6d18da8b4cb815c1c&chksm=ec1e271fdb69ae09805d0203316ad896d5794b016aa7014cffa8c8e46efe266357d058cd3afe&scene=21#wechat_redirect)

[**原创** _微信_ PC端技术研究(3)-如何找到消息发送接口](http://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247489419&idx=1&sn=fbb95d91a19582701576501a9c1a546f&chksm=ec1e27a3db69aeb5265d32faa445e59f3b4ab5c6ab2a3ea82f2f8307552716744331c5e3a020&scene=21#wechat_redirect)

[**原创** PC _微信_ 逆向：发送与接收消息的分析与代码实现](http://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247490895&idx=1&sn=ac647948495c798258c52ee5f392ef2f&chksm=ec1e2d67db69a471b34d31485151c6c0653b958ceae6e067dfccd21f8b9a8aff6bb84d1ac557&scene=21#wechat_redirect)
