lichunfeng 发表于 2020-6-2 18:36

某X64EXE程序分析图文

本帖最后由 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 跳到我们想要的地方。贴出部分代码
if ((signed int)v4 < 8 )
memset(&Dst, 8 - v4, 8 - (signed int)v4);
sub_7FEF357E870(&xmmword_7FEF3652A20, Dst); 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代码:
typedef void (WINAPI* IntNet)(HINTERNET hInternet,LPCSTRlpszServerName,INTERNET_PORTnServerPort,LPCSTRlpszUserName,LPCSTRlpszPassword,DWORDdwService,DWORDdwFlags,DWORD_PTRdwContext);
IntNet ori_fun = (IntNet)GetProcAddress(LoadLibraryA("WinInet"),"InternetConnectA");
void WINAPI MyWinInetConnect(HINTERNEThInternet,LPCSTRlpszServerName, INTERNET_PORT nServerPort,LPCSTR lpszUserName,LPCSTR lpszPassword,DWORDdwService,DWORDdwFlags,DWORD_PTR dwContext)
{    LPCSTR MyServer = "127.0.1.1";   
    INTERNET_PORTp_port = 80;   
    if (strcmp(lpszServerName,"xx.xx.xx.xx") == 0)//服务端IP 已码{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;}

完成后,编写注入工具注入转向到本地或者服务器,发现程序驱动保护会蓝屏,后面采用网卡转向IP,并且win32dll还有验证,经过自写算法和des加密,调试难点在于游戏保护和他自身的驱动保护,并且dll是抹了PE头的,但是后面还是想办法逆了出来,由于是远程的,后面的过程讲不再讲解,本文完结,谢谢观看,最后感谢空空大神指点。
                        

jefel 发表于 2020-6-2 18:42

认真观看完毕!

boy7928 发表于 2020-6-2 20:27

是一头雾水

lichunfeng 发表于 2020-6-2 21:45

@材鸟 驱动保护 一方面保护自己的程序不被游戏检测,第二个功能防止内存补丁也就是防破解,他这里的驱动主要是防游戏检测和注入dll用的。

wikiyc 发表于 2020-6-3 08:04

很认真的看了一遍,没懂 :'(weeqw

材鸟 发表于 2020-6-3 19:33

lichunfeng 发表于 2020-6-2 21:45
@材鸟 驱动保护 一方面保护自己的程序不被游戏检测,第二个功能防止内存补丁也就是防破解,他这里的驱动主 ...

多谢解答,我对网卡转向IP这个知识点比较感兴趣,楼主如果有空,贴子能否补充完善?

adsz1111 发表于 2020-6-11 20:02

mov eax,0041C54A

cll1101 发表于 2021-5-22 10:52

大佬确实厉害,只有膜拜的份

cll1101 发表于 2021-5-22 11:22

主页搜索patch网络返回数据,跟进来帖子想要学习一下,貌似没有学到,不过依然膜拜大佬

tkcheems 发表于 2021-11-12 20:27

学习一下
页: [1]
查看完整版本: 某X64EXE程序分析图文