120038686 发表于 2018-9-18 18:17

OD跟踪快速找到某网游客户端登录程序用到的PFX证书导入私钥

本帖最后由 120038686 于 2018-9-18 18:26 编辑

先说明一下,本文相对初级,主要是提供一个思路,高手可以绕过。
需要用到的工具:OD、PEID、Ethereal
最近接触到一个客户端登录程序,发现是使用SSL连接服务端,想自己编写一个登录器,
1、用PEID查壳,结果如下
https://attach.52pojie.cn/forum/201809/15/231217yrtmuy4kt7juzufg.jpg
查看目录下除了.dll文件外,还有.bpl文件,确定应该是Delphi开发的,不过有一个附加数据。

2、打开客户端运行,用Ethereal抓包结果显示,是连接服务器的443端口(SSL协议),
https://attach.52pojie.cn/forum/201809/15/232937waxcccczaca9yrvv.jpg
既然是SSL协议,就必须有证书,查看该程序文件夹中,有一个client.pfx文件,将其改名,再运行客户端登录程序,提示“连接不到后台服务器”。
https://attach.52pojie.cn/forum/201809/15/233246pq1naypanylntpun.jpg
将client.pfx改名回来,又能正常登录,这就让我更加肯定就是应用该证书文件登录服务器的。
3、问题来了,我想自己写一个登录客户端程序,就必须用到pfx文件中的密钥,可是导入该PFX文件中的私钥需要密码,
https://attach.52pojie.cn/forum/201809/15/233745jj7fddy5jom0gjdf.jpg
这样如何得到这密码呢?

4、分析该客户端的运行流程,应该就是直接读取这client.pfx,然后在程序中通过密码得到私钥,然后与服务器建立SSL连接。

5、撸起袖子,我们开始用OD载入跟踪一下看看能否得到PFX文件的私钥密码
OD载入后,程序停在入口点
00518C00 >    55            push ebp
00518C01   .8BEC          mov ebp,esp
00518C03   .83C4 E0       add esp,-0x20
00518C06   .53            push ebx
00518C07   .56            push esi
00518C08   .57            push edi
00518C09   .33C0          xor eax,eax                              ;kernel32.BaseThreadInitThunk
00518C0B   .8945 E0       mov dword ptr ss:,eax          ;kernel32.BaseThreadInitThunk
00518C0E   .8945 E4       mov dword ptr ss:,eax          ;kernel32.BaseThreadInitThunk
00518C11   .8945 EC       mov dword ptr ss:,eax          ;kernel32.BaseThreadInitThunk
00518C14   .8945 E8       mov dword ptr ss:,eax          ;kernel32.BaseThreadInitThunk
00518C17   .B8 787A5100   mov eax,p.00517A78
00518C1C   .E8 638AEEFF   call p.00401684
00518C21   .33C0          xor eax,eax                              ;kernel32.BaseThreadInitThunk
00518C23   .55            push ebp
00518C24   .68 2A8F5100   push p.00518F2A
00518C29   .64:FF30       push dword ptr fs:
00518C2C   .64:8920       mov dword ptr fs:,esp
00518C2F   .BA 448F5100   mov edx,p.00518F44                  ;ASCII "程序开始启动"
00518C34   .33C0          xor eax,eax                              ;kernel32.BaseThreadInitThunk
00518C36   .E8 0916F7FF   call <jmp.&baseimpcls.Hscomm::hsWriteLog>

6、按ALT+M,再CTRL+B,在内存中查找“client.pfx",发现有5处,经过测试,在下图处下内存访问断点最快到达关键代码处
https://attach.52pojie.cn/forum/201809/16/083127tkkws2sakjfyse84.jpg

7、按SHIFT+F9执行,断在下图处,
https://attach.52pojie.cn/forum/201809/16/083639stpytutmt0tttt0u.jpg
可以看到EDI指向”client.pfx"字符串,因为有10个字符,按Shift+F919次,然后按CTRL+F9到达下面的retn处

77180CA7    8B45 EC         mov eax,dword ptr ss:
77180CAA    EB 09         jmp short KernelBa.77180CB5
77180CAC    6A 57         push 0x57
77180CAE    E8 CE6BFDFF   call KernelBa.77157881
77180CB3    33C0            xor eax,eax
77180CB5    8B4D FC         mov ecx,dword ptr ss:
77180CB8    5F            pop edi                                  ; rtl60.40006977
77180CB9    5E            pop esi                                  ; rtl60.40006977
77180CBA    33CD            xor ecx,ebp
77180CBC    5B            pop ebx                                  ; rtl60.40006977
77180CBD    E8 BAE5FEFF   call KernelBa.7716F27C
77180CC2    C9            leave
77180CC3    C2 1800         retn 0x18;<==Ctrl+F9到达此处

然后按F8,单步跟踪执行,达到下面代码处,发现注释那边有"ssl_certfile“和"ssl_certpass",
005152B7   .50            push eax
005152B8   .8D85 20FEFFFF lea eax,dword ptr ss:
005152BE   .50            push eax
005152BF   .B9 A4585100   mov ecx,pbrc.005158A4                  ;ASCII "ssl_certfile"
005152C4   .8B55 F0       mov edx,dword ptr ss:
005152C7   .8B45 FC       mov eax,dword ptr ss:
005152CA   .E8 3D090000   call pbrc.00515C0C
005152CF   .8D95 20FEFFFF lea edx,dword ptr ss:
005152D5   .8B45 FC       mov eax,dword ptr ss:
005152D8   .05 4C010000   add eax,0x14C
005152DD   .E8 4EC1EEFF   call <jmp.&rtl60.System::VarToLStr>
005152E2   .8D85 F0FDFFFF lea eax,dword ptr ss:
005152E8   .BA BC585100   mov edx,pbrc.005158BC                  ;ASCII "hundred@0538"
005152ED   .E8 9EC1EEFF   call <jmp.&rtl60.System::OleVarFromLStr>
005152F2   .8D85 F0FDFFFF lea eax,dword ptr ss:
005152F8   .50            push eax
005152F9   .8D85 00FEFFFF lea eax,dword ptr ss:
005152FF   .50            push eax
00515300   .B9 D4585100   mov ecx,pbrc.005158D4                  ;ASCII "ssl_certpass"
00515305   .8B55 F0       mov edx,dword ptr ss:
00515308   .8B45 FC       mov eax,dword ptr ss:
0051530B   .E8 FC080000   call pbrc.00515C0C

8、在00515300 处按F2下断,再按F4执行到该处,再继续按F8单步执行到下图处。
https://attach.52pojie.cn/forum/201809/16/084650ckokitltnhzhuesn.jpg
发现ds处是指向如下的ASCII字符串,应该就是密码的加密串32位,先复制保存下来,查MD5,发现解密需要时间。
ds:=045F1598, (ASCII "93772BD903FE6A6441473E70D9316C9D")
eax=045BE7A4

9、继续F8单步执行,来到下图处
https://attach.52pojie.cn/forum/201809/16/085303if5vxwhfxua5fuzv.jpg
发现字符串”xscli-666“字符串,并看到代码区的上一行代码是
00515356   .E8 9568F7FF   call <jmp.&baseimpcls.Encryptpublic::hsDecryptEx>
基本上可以断定该字符串就是client.pfx的私钥密码。

10、到资源管理器中,双击导入client.pfx,密码处输入刚才获取的字符串”xscli-666“,导入成功!
https://attach.52pojie.cn/forum/201809/16/085659wvu3nglulmawr3mg.jpg

总结:该客户端登录程序仅通过附加数据方式稍作加密,但是未将证书文件附加混淆到可执行文件中,相对来说还是比较容易找到证书密码。
该程序的新版本中,已经将证书文件附加混淆到可执行文件中,笔者经过OD动态调试,将证书pfx文件从内存数据中dump出来,并获得证书密码,也可以自己写一个登录器。具体的下次再发。
也希望大家多支持一下新人!{:1_893:}

zysanjing1 发表于 2018-9-19 15:24

感谢分享,学习了~~~

小菜鸟一枚 发表于 2018-9-19 15:36

感谢分享,学习了

1000Y 发表于 2018-9-19 16:12

感谢分享,向楼主学习!

cxb2468 发表于 2018-9-19 16:59


感谢分享,学习了~~~

qyboy 发表于 2018-9-19 18:36

很详细介绍了推理,值得认真学习一下

gongyong728125 发表于 2018-9-20 08:24

谢谢楼主啦,学习!

超级大坏蛋 发表于 2018-9-20 17:24

你太牛了,登录器都给破解了

章学诚 发表于 2018-9-20 18:02

已经收藏,等哪天有空翻出来学习学习

jiu812yan 发表于 2018-9-20 23:32

谢谢楼主分享
页: [1] 2 3 4
查看完整版本: OD跟踪快速找到某网游客户端登录程序用到的PFX证书导入私钥