好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 lichunfeng 于 2021-10-13 21:22 编辑
64位自写网络验证程序分析图文
前几天一个朋友给我发的一个软件,大概分析了两三天,最后也不了了之了,总的来说比较艰辛,分析过程也是综合了很多知识和技术,那么做个图文记录下这个分析过程。
1. 用到的工具: X64DBG,OllyDbg,IDA,查壳工具PEID,抓包Sniffer,VS2008,易语言,以及其他库和模块
2. 用到的知识点:X64汇编和x86汇编,对称算法,Http协议,简单的编程技术
3. 软件介绍: 用于模拟器自动执行任务,端游自动登录组队等,实现无人工的自动机械化操作。
通常破解一款软件,需要知道他的验证过程,文件布置,大概用到哪些技术,然后再思考应对方法。软件内置七个文件夹,一个自动更新程序,和一些相关的配置。其中有一个目录含有sys文件,以及未知的二进制文件, miniblink_x64.dll这个文件
如图:
而miniblink x64这个文件,是基于谷歌浏览器内核的一个控件,而opengl这个文件可能是Hook绘图函数的一个dll。Sys文件可能是用于相关保护或者内存读写的东西。在另一个文件夹也发现了浏览器控件加载所用到的js css文件
如图
剩下的ini 以及txt文件是保存用户相关配置 以及一些lua脚本文件。文件相关信息分析到此。
打开软件,界面如下:
根据此界面和目录文件,我得到一些信息,确定了他是浏览器控件,通过Miniblink这个官方公开的Api传递一些参数到EXE,或者是EXE传到浏览器,这么一个通信过程。然后观察他的日志信息,如图:
按他日志显示来看,他先是安装了驱动即sys文件,启动监听端口,可能是他自带的本地服务器,进程通信一般来说就是内存共享或者通过网络来进行,一般有这个的话,猜测他可能用到了Dll注入技术,注入到模拟器或者其他进程,用本地服务器来做通讯,日志打印一些信息。
上面分析了一些关于此软件的文件和一些用到的基本技术,以及对于他框架的大概猜测。 下面开始分析他的验证:根据用正版的哥们反应,输入卡号激活,重启之后将自动验证成功。首先打开抓包工具Sniffer,设置成启动新进程抓包,关闭软件重新打开,得到数据包如图:
发送包:
返回包:
IP已做模糊处理,
根据发送包和返回包,我们可以得到一些结论:软件通过Http协议,post发送数据到服务端验证机器码是否被授权,而数据包中session字段,经过百度搜索,可知是用的一个协议框架,基本上可以忽略。很明显,post提交参数中,都是被加密了的。由于他的界面是浏览器控件,我们打开他文件目录中的js,有如下函数,如图:
main.js 内容
可知他的激活卡号是32位的,输入卡密之后CallCpp,猜测是传参到ExE进行验证。 根据以上分析,我们可以思考一下怎么Crack了,第一种方法就是常规的patch网络返回数据,跟踪解密函数,出Call,然后写汇编固定住数据,第二种方法,就是搭建服务器,然后通过Hook或者其他方法将他的网络连接转向到自己的服务器去做验证。第一种方法呢,说实话工作量大,分析起来累,如果有心跳什么的数据一个个去固定太累,并且程序有内存检测之类的 就不是很好用。第二种方法呢,难度大,需要分析出来他网络包的加密算法和解密算法,以及一定的网络编程技术,好处就是一劳永逸,其他数据只需要抓包解密,然后改写服务端返回逻辑即可。后面的分析中得知,软件有驱动保护,对于软件的注入 写内存基本上无解,朋友用驱动注入是可以的,但是实现起来难度也大且麻烦,而且端游方面是32位的dll通讯,所以基本上就抛弃了第一种方法,下面展示第二种方法的分析程。
打开X64DBG,载入主程序,入口特征:
根据此特征,可知VMP3.x的壳子,经验之谈,不再赘述。由于是网络验证,bp发包函数 Send,WSASend,然后随便输入一个32位的卡密,点击激活,程序执行在send处断下,如图:
来源于wininet.dll,我们做个记录,方便做转向。此时,我们观察寄存器RDX的内容,即是加密后的发送数据: 部分截图
至于为什么传递参数不是栈,而是在寄存器,X64一些特性和X86还是不一样的吧,只要适应他的特性就好,按他的套路去分析就对了,我们不能纠结于每一个点,不然一个软件分析下来也够呛。那么这时候,目标要明确,咱们断点目的,以及我们要找的东西是什么,我想上面已经说的很清楚了,咱们要找他的post的加密解密,他真正传送到服务器的数据是什么,单凭这一串密文,无从得知,此时我们观察堆栈(栈区),有些情况下,他的明文还在栈保留着,一直向下找如下:
那么这个可能就是我们要的明文数据,Enter返回到mfcm140uxd.dll这个内存空间中,然后搜索字符串,得到他加密数据并发送的函数。如图:
看到%s,很明显,他是格式化字符串然后再进行数据加密。下面代码如图:
当运行到000007FEF3571E89已经加密完成。可以判断上面的一个循环加Call,即是咱们要的加密算法。file:///C:/Users/ADMINI~1/AppData/Local/Temp/msoclip1/01/clip_image030.jpg这一串可能就是算法相关的秘钥之类的。那么此时我们单步跟进算法call如图:
发现他是一个很复杂的结构,OD单步的话,很难去分析,此时我们拿下复制mfcm140uxd.dll的路径,然后找到他。复制出来,打开咱们的神器IDA(X64),拖进去。然后Edit-segment-Rebase设置基址和DGB调试器的一致。按g 跳到我们想要的地方。贴出部分代码
[Asm] 纯文本查看 复制代码 if ((signed int)v4 < 8 )
memset(&Dst[v4], 8 - v4, 8 - (signed int)v4);
sub_7FEF357E870(&xmmword_7FEF3652A20, Dst); [Asm] 纯文本查看 复制代码 if ( (signed int)v2 > 0 )
{
v5 = &v34;
v6 = v2;
v7 = ((unsigned int)(v2 - 1) >> 3) + 1;
v8 = v7;
v4 = 8 * v7;
do
{
v9 = v6;
if ( v6 >= 8 )
v9 = 8;
sub_7FEF357F960((__int64)((char *)&v35 + v3), v5, v9, 0);
v3 += 16;
v6 -= 8;
v5 = (char *)v5 + 8;
--v8;
}
while ( v8 );
v1 = v19;
}
前面说过,他是结构相对复杂的算法,我们结合OD和 IDA看到的特征,得出一点结论,秘钥先进行处理,然后每8位字符进行加密。而参考下DES算法基本原理:
1.所需参数key:8个字节共64位的工作密钥data:8个字节共64位的需要被加密或被解密的数据 mode:DES工作方式,加密或者解密 2.初始置换DES算法使用64位的密钥key将64位的明文输入块变为64位的密文输出块,并把输出块分为L0、R0两部分,每部分均为32位。
我们猜测是DES算法,秘钥
当我们拿到加密信息和key后,尝试用DES加密解密 发现结果完全正确,而返回包也是同样的key和算法,至此最核心的东西我们已经掌握,分析工作已完成一大半。接下来就是抓包解密返回信息,架构服务端逻辑返回数据等,此处不再讲解,部分代码如图:
服务端完成之后,剩下的就是EXE IP 转向了,转向的方法也挺多,下面展示自己写的Hook代码:
[Asm] 纯文本查看 复制代码 [/align][/align][align=left]typedef void (WINAPI* IntNet)(HINTERNET hInternet,LPCSTR lpszServerName, INTERNET_PORTnServerPort,LPCSTRlpszUserName,LPCSTRlpszPassword,DWORD dwService,DWORD dwFlags,DWORD_PTRdwContext);
IntNet ori_fun = (IntNet)GetProcAddress(LoadLibraryA("WinInet"),"InternetConnectA");
void WINAPI MyWinInetConnect(HINTERNET hInternet,LPCSTR lpszServerName, INTERNET_PORT nServerPort,LPCSTR lpszUserName,LPCSTR lpszPassword,DWORD dwService,DWORD dwFlags,DWORD_PTR dwContext)
{ LPCSTR MyServer = "127.0.1.1";
INTERNET_PORTp_port = 80;
if (strcmp(lpszServerName,"xx.xx.xx.xx") == 0)//服务端IP 已码[/align][align=left]{return ori_fun(hInternet,MyServer,p_port,lpszUserName,lpszPassword,dwService,dwFlags,dwContext);}
return ori_fun(hInternet,lpszServerName,nServerPort,lpszUserName,lpszPassword,dwService,dwFlags,dwContext);}
BOOL WINAPI DllMain(HMODULE hModule,DWORD dwReason,PVOID pvReserved)
{ if (dwReason == DLL_PROCESS_ATTACH){DisableThreadLibraryCalls(hModule);
Mhook_SetHook((PVOID*)&ori_fun,MyWinInetConnect);
return TRUE;}
else if (dwReason == DLL_PROCESS_DETACH){
return FALSE;}[/align][align=left]
完成后,编写注入工具注入转向到本地或者服务器,发现程序驱动保护会蓝屏,后面采用网卡转向IP,并且win32dll还有验证,经过自写算法和des加密,调试难点在于游戏保护和他自身的驱动保护,并且dll是抹了PE头的,但是后面还是想办法逆了出来,由于是远程的,后面的过程讲不再讲解,本文完结,谢谢观看,最后感谢空空大神指点。
|
-
免费评分
-
参与人数 3 | 威望 +1 |
吾爱币 +23 |
热心值 +2 |
收起
理由
|
Hmily
| + 1 |
+ 20 |
+ 1 |
感谢发布原创作品,吾爱破解论坛因你更精彩! |
处女-大龙猫
| |
+ 1 |
|
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
材鸟
| |
+ 2 |
+ 1 |
驱动保护只是封包函数嘛?调试器没检测? |
查看全部评分
|