首页
社区
课程
招聘
给Internet Download Manager打补丁
发表于: 2021-4-23 01:37 5724

给Internet Download Manager打补丁

2021-4-23 01:37
5724

关键字:IDM WinXP tls1.2 openssl SSL_connect

   收到官方回复,IDM v6.38b22 修复了此问题。


Q1815349357Q


起因,由于部分网站升级https加密协议至tls1.2,而WinXP的schannel不支持tls1.2,使用windows SSPI提供https能力的软件,在XP下不能访问tls1.2的网站。


因此,thunder和IDM等下载软件,在后期版本里,都引入了openssl来支持https.


至笔者发文时,IDM的最新版本是v6.38b21,其在SSPI方式失败的时候,会尝试openssl来连接。


但是笔者发现,WinXP下IDM仍不能下载部分https链接,提示:



图例Url是:https://www.appinn.com/wp-content/uploads/Appinn-icon-32.jpg


wireshark抓包,与笔者调用openssl成功下载的demo对比发现:



下载失败的那种情况,SSL握手的时候,扩展字段里缺少了server_name.


对比IDM的SSL相关实现,发现它缺少了很重要的一句,SSL_set_tlsext_host_name(sslHandle, host);


// Connect the SSL struct to our connection

        if (!SSL_set_fd (sslHandle, (int)socket))

            ERR_print_errors_fp (stderr);


        SSL_set_tlsext_host_name(sslHandle, host);


        // Initiate SSL handshake

        if (SSL_connect (sslHandle) != 1)

            ERR_print_errors_fp (stderr);


于是需要给IDMan.exe里补丁上这一句:


1 查壳,无壳。

2 查导入表表,没发现libssl.dll.

3 windbg Ctrl+e IDMan.exe,sxe ld libssl.dll,返回至IDMan.exe领空,发现:

LoadLibraryW(libssl.dll);

GetProcAddress(h_libssl_dll, "SSL_connect");


SSL_set_tlsext_host_name宏实际是SSL_ctrl(),但是上面初始化ssl函数的函数里,没有初始化SSL_ctrl,给它补一个:

3.1 .rdata节末尾空白处,加一个字符串pch_SSL_ctrl"SSL_ctrl";

3.2 .data节末尾空白处加一个变量存SSL_ctrl地址;

3.3 在.text节末尾空白处加:

  test    bl, bl

  jnz     L_Fail

  push    offset pch_SSL_ctrl ; lpProcName

  mov     eax, h_libssl_dll

  push    eax             ; hModule

  call    esi ; GetProcAddress

  mov     SSL_ctrl, eax

  cmp     eax, edi

  jz      L_Fail

  jmp     L_Success


3.4 在初始化ssl函数的函数里,原来初始化玩最后一个SSL函数,即SSL_read后,跳到L_SSL_ctrl,

  push    offset aSsl_read ; "SSL_read"

  mov     ecx, h_libssl_dll

  push    ecx             ; hModule

  call    esi ; GetProcAddress

  mov     SSL_read, eax

  cmp     eax, edi

  jnz     L_SSL_ctrl

  

这样就找到了SSL_ctrl的地址。


4. bp libssl!SSL_connect,下载https://www.appinn.com/wp-content/uploads/Appinn-icon-32.jpg,断下,返回至IDMan.exe领空;

在SSL_connect之前,我们要想办法插入SSL_set_tlsext_host_name(sslHandle, host);

SSL_set_tlsext_host_name有两个参数,明显这里能直接拿到sslHandle,而host是Url中的www.appinn.com,猜测在此处函数里的this指针里,会有这个host的存在。

SSL_set_tlsext_host_name宏实际是SSL_ctrl。


bp ws2_32!gethostbyname, 笔者这里第五次命中时会进入openssl流程,返回至IDMan.exe领空,能看到:


  v5 = *(_DWORD *)(this_ + 0x184);

  if ( v5 )

    v6 = *(_BYTE *)(v5 + 0x15C);

  else

    v6 = 0;


  if ( v6 )

  {

    host = *(char **)(v5 + 0x140);

  }

  else

  {

    v9 = *(char ***)(this_ + 0xB4);

    if ( !v9 )

      v9 = *(char ***)(this_ + 0xB0);

    host = *v9;

  }

这里就拿到了host的位置,实际后面我们用到的是poi(poi(this_ + 0xB0))。


返回一开始断SSL_connect的地方,返回IDMan领空,把call SSL_connect改为:


  mov     ecx, [esi+3450h]

  push    ecx

  nop

  jmp     L_SSL_ctrl_setServerName  // 原来是call SSL_connect

  

在.text节末尾空白处加:

   L_SSL_ctrl_setServerName proc near

                 mov     eax, [esi+0B0h]

                 mov     eax, [eax]

                 push    eax             ; _DWORD

                 push    0               ; _DWORD

                 push    37h             ; _DWORD

                 push    ecx             ; _DWORD

                 call    SSL_ctrl

                 add     esp, 10h

                 call    SSL_connect

                 jmp     原始call SSL_connect后一句

 L_SSL_ctrl_setServerName endp

 

 

 测试OK ~

 

 PS:

 1.汇编代码可以用VS 里 __asm{ xxx xxx}, 反编译后拿到。

 2.jmp等的opcode自己构造,目标地址-原始地址-5,如果是负值用补码;

 3.用IDA patch的,菜单Edit -> Patch program -> Change byte,完成后Apply patches to input file...

 4.笔者爱用WinXP,有意见统一回复,你XX.



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-5-4 21:36 被囧囧编辑 ,原因: 隐私
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 4522
活跃值: (4498)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

IDM6.36 WIN7下可正常完成下载.没有发现此问题.


XP很久没有用了, 可能作者开发以WIN7以上为系统平台了吧.

最后于 2021-4-23 08:49 被Mxixihaha编辑 ,原因:
2021-4-23 08:47
0
雪    币: 1263
活跃值: (4337)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
3
注册机了解一下
2021-4-23 09:02
0
雪    币: 284
活跃值: (3694)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
4

本楼没法删除吗?

最后于 2021-4-23 12:58 被囧囧编辑 ,原因:
2021-4-23 12:54
0
雪    币: 284
活跃值: (3694)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
5
小菜鸟一 注册机了解一下
回帖前建议读一下帖子,随意回帖就暴露你网名了,
2021-4-23 12:54
0
雪    币: 3476
活跃值: (3003)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
小菜鸟一 注册机了解一下
你这看都不看就回复。看看作者补丁的什么再说
2021-4-23 15:59
0
雪    币: 105
活跃值: (4628)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

???咋没引用上

最后于 2021-4-23 18:54 被Imxz编辑 ,原因:
2021-4-23 18:54
0
雪    币: 284
活跃值: (3694)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
8

IDM v6.38b22 修复了这个问题,收到官方回复。

最后于 2021-5-4 21:29 被囧囧编辑 ,原因:
2021-5-1 12:38
0
游客
登录 | 注册 方可回帖
返回
//