PC 微信公众号文章key(即a8key的分析)

前言:

        微信公众号上文章很不错,但是有的文章敏感文章会被删除,有的时候没赶上,就很难受,所以想爬公众号的文章。

正文:

        最开始是想通过找call,调用微信的call去获取历史文章的,但是经过各种分析,始终无法找到,经过百度,谷歌得知,发送的请求可以被抓到,比如这篇文章抓包分析公众号,得知,我们想要获取公众号的历史文章需要一个关键参数key,他们全部都是抓包更新,这十分不方便,开始对key的分析.

        通过点击公众号这个位置

      点击后去看微信的日志,

    

        在日志中,看到大量a8key字样的东西,后面跟着的就是微信返回的带key的链接,开始猜测,key是否就是a8key,(有我群里朋友就跟我说key就是a8ey,我开始去验证,找 了分微信的安卓协议,获取a8key发现确实可用,得出结论,key就是a8key).

        在各种日志的地方下断,最终在这里断下

        

        按照我微信逆向的经验,一般调用都是调用的日志往回返回两层的地方,回溯找到。

    

     为什么是这个call呢,主要是这个call简单,只需要url和一个缓冲区即可调用,所以我决定调用这里。这里只有mov ecx,edi,我不知道edi是个什么东西,随意需要追edi在哪个初始化的

        

        我尝试过edi传空的缓冲区,发现不行,所以必须得知道edi在哪里初始化的,找到函数头,发现mov edi,ecx,所以继续往上层找,

        

        ecx来自esi

        

        

        看到下面都是使用edi,在这个函数分析得知edi来自图中初始化edi的函数的返回值,确定了edi

        

          开始写代码尝试调用,最开始是直接崩溃的后面分析崩溃原因

        

     

    我自己写的代码调用会在这个地方崩溃,

    

                   

观察发现这里面就是一个经典的微信里的结构体,而且这个结构体在上面说到初始化edi的里面并没有赋值,最开始我想寻找给这里赋值的地方,但是找到后发现比较复杂,就么有这么做,尝试在执行自己代码初始化完edi的时候,手动创建这样的结构体,最终调用成功。

    从始至终,我都没在od里提到我们重要的key在哪,其实我也不知道key在这个线程的哪,我知道key,是在解析pb(protobuf)的线程看到了返回值,

    我是通过找      "NetSceneGetA8Key Success srcurl:http://mp.weixin.qq.com/mp/getmassse。。。。。" 字符串找到的,我最开始分析其实并没有那么顺利,虽然我知道call因该就是上面那个,但是我始终看不到返回值(key),所以才想到从这个日志 的地方往回追,看看到底这个带key的链接是拿来的,

    不断回溯找到   [[[[0x6BA6FF04]+0x4]]+0x14]+0x154    链接会被写入到这个地方,但是,并不是一直指向这个的,在没有获取key的时候,是没有指向这里的,通过下内存写入断,找到了写入的地方,最终确定合适的位置

    

    微信服务器返回的protobuf数据写入到edi,函数执行完

    

很明显的结构体,凭借经验,第一个红框指向的内容是protobuf数据,第二个红框就是长度,复制这些478的数据出来放入pb解析工具

    看到 了原始 的链接和服务器返回的带key的链接。

    至此,分析结束。

调用的代码:      微信版本是3.3.0.104

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

    char buf_1[0x30] = { 0 };

    wchar_t url[0x200] = L"<mark class="encrypted"></mark>

    std::wstring str = L"<mark class="encrypted"></mark>

    WxString* wxid = new WxString();

    wxid->pstr = (wchar_t *)str.c_str();

    wxid->len = str.size();

    wxid->maxLen = str.size() * 2;

    struct URL

    {

        char Zero[0x4c0] = { 0 };

        WxString url;

    };

    URL inner;

    inner.url.pstr = (wchar_t*)str.c_str();

    inner.url.len = str.size();

    inner.url.maxLen = str.size() * 2;

    //69AD0000

    DWORD call_add_1 = getWeChatwinADD() + (0x6AD7587E - 0x69AD0000);

    DWORD call_add_2 = getWeChatwinADD() + (0x6A5B02C0 - 0x69AD0000);

    DWORD cadd_add_3 = getWeChatwinADD() + (0x6A09CE90-0x69AD0000);

    DWORD cadd_add_4 = getWeChatwinADD() + 0xAE7290;//6A777290           69C90000

    __asm {

        push 0x928  

        call call_add_1

        add esp, 0x4

        push esi

        push esi

        push esi

        push esi

        mov ecx, eax

        call call_add_2

        mov edi,eax                //初始化edi  应该是对应的浏览器的句柄

        lea eax, [edi + 0x718]

        lea edx, inner

        mov[eax], edx

        sub esp, 0x14

        mov ecx, esp

        push - 0x1

        mov dword ptr ds : [ecx] , 0x0

        mov dword ptr ds : [ecx + 0x4] , 0x0

        mov dword ptr ds : [ecx + 0x8] , 0x0

        mov dword ptr ds : [ecx + 0xC] , 0x0

        mov dword ptr ds : [ecx + 0x10] , 0x0

        lea eax, buf_1

        push eax

        call cadd_add_3

        push ecx

        push 0x0

        sub esp, 0x14

        mov ecx, esp

        push - 0x1

        mov dword ptr ds : [ecx] , 0x0

        mov dword ptr ds : [ecx + 0x4] , 0x0

        mov dword ptr ds : [ecx + 0x8] , 0x0

        mov dword ptr ds : [ecx + 0xC] , 0x0

        mov dword ptr ds : [ecx + 0x10] , 0x0

        lea eax , url

        push eax

        call cadd_add_3

  

        mov ecx, edi

        call cadd_add_4

    }

}

虽然我获取到了key,但是还有个问题就是,我调用的代码没有崩溃,我注入的dll也没有崩溃,完好退出的,但是在拦截到服务器返回的protobuf数据的地方放开后,微信自动退出了,没有崩溃,我不知道原因,所以希望有兴趣的的大佬可以跟我一起交流,为什么我调用明明都已经成功了,服务器返回的pb数据也看到了为什么微信退出了,我觉得我能力有限,暂时无法解决这个问题,真心希望有懂的大佬可以指点一二,很不甘心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值