重拳出击!我是这样对灰产外挂下手的

李志宽
• 阅读 808

分析外挂样本一般的步骤

  1. 对外挂样本进行简单的信息分析。
  2. 分析还原外挂样本具体功能实现方式。
  3. 分析外挂样本的反检测功能。

1. 对外挂样本进行简单的信息分析

  • 查看文件属性,灰产及外挂的标配语言 “易语言”

重拳出击!我是这样对灰产外挂下手的

  • 通过Exeinfo Pe查壳工具进行对外挂样本查壳,看看发现是没加壳的应用程序。(心里突然咯噔了下,收费的外挂竟然都不做点保护,不对自己的程序负责,就直接把程序在市场上裸奔了)

重拳出击!我是这样对灰产外挂下手的

2.分析还原外挂样本具体功能实现方式

2.1 网络验证功能

  • 外挂一启动(注意:虚拟机环境)的界面就是收费的登陆账号验证,专业点的说也就是网络验证。
  • 外挂的网络验证选择方案: 外挂作者一般采用的方案,直接套用现场的的网络验证。很少很少自己又开发外挂又自己写网络验证。
  • 接下来我们需要通过逆向分析,分析下这个网络验证是采用什么验证的,是个什么样的实现思路和方法。

重拳出击!我是这样对灰产外挂下手的

  • 接着就开始需要借助反汇编工具ollydbg了(这里要感谢下这个伟大的ollydbg工具开发者的赏饭吃,让打工人有个好用的吃饭工具),ollydb一般有两种方式进行动态反汇编调试:1.用ollydbg打开要进行调试的样本。2.通过启动样本,接着进行用ollydbg工具进行附加调试分析。
  • 附加完直接上字符串分析大法,在ollydbg字符串界面中很明显这里有几个很明显的信息 :5yyz.com的链接地址和核盾的敏感信息。

重拳出击!我是这样对灰产外挂下手的

重拳出击!我是这样对灰产外挂下手的

  • 一顿分析过后核盾的后台登陆界面就出来了,到这里就够了,就不在进行对这服务器干啥了,不过随手一查下,这服务器直接放在阿里云的

重拳出击!我是这样对灰产外挂下手的

重拳出击!我是这样对灰产外挂下手的

  • 既然是逆向了,那么也不能简单的停留在这么肤浅的字符串信息上了,接下来就往下看下这个网络验证的大概实现功能并顺手把这个网络验证简单的用代码给还原下。
  • 通过下断点(INT3 函数断点)然后堆栈回溯的方法进行分析(具体的每个详细步骤就不罗列了),最终确认到登陆验证的入口函数是以下的函数。

重拳出击!我是这样对灰产外挂下手的

  • 接着结合下静态分析强大的IDA工具(这里也要感谢下IDA开发工具的,让我们破解软件还原代码成为了可能)。直接将外挂样本拖进IDA工具里面,还是一样直接先上字符串查看大法,接着查看字符串的x86汇编代码调用。

重拳出击!我是这样对灰产外挂下手的

  • 再通过IDA中强大的F5功能,将汇编代码转换为伪代码。

重拳出击!我是这样对灰产外挂下手的

  • 结合以上ollydbg工具的动态调试和IDA静态分析的伪代码结构,我们可以梳理出,该样本的主要通过调用InternetOpenA、HttpSendRequestA等API函数直接和https进行服务端通讯校验的,接下来将样本的网络验证简单的还原下大概的功能实现。
功能:还原登陆验证向服务端请教的实现
参数:就是直接服务器的url就可以
*/

bool loginSendHttpData(CString url)
{
 if(url.IsEmpty())
 {
  return false;
 }

 HINTERNET hInternet,hConnect,hRequest; 
 hInternet = (HINSTANCE)InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,NULL); 
 if(!hInternet) 
 {
  InternetCloseHandle(hInternet);
  hInternet = NULL;
  return false;
 }

 hConnect = (HINSTANCE)InternetConnectA(hInternet,  url,  INTERNET_DEFAULT_HTTPS_PORT, NULL,  NULL,  INTERNET_SERVICE_HTTP,0,0);
 if(!hConnect)  
 {   
  if(hConnect)  
   InternetCloseHandle(hConnect);
  if(hInternet)  
   InternetCloseHandle(hInternet);  
 } 

 hRequest = (HINSTANCE)HttpOpenRequestA(hConnect,"POST",url, "HTTP/1.1" ,NULL,NULL,  INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE,0);  
 bool ret= HttpSendRequestA(hRequest,0,0,0,0);
 if(!hRequest)  
 {
  if(hRequest)  
   InternetCloseHandle(hRequest);  
  if(hConnect)  
   InternetCloseHandle(hConnect);  
  if(hInternet)  
   InternetCloseHandle(hInternet);  
 } 

 return true;
}

2.2 外挂具体实现功能的前部分

  • 先上来一个热乎的外挂登陆后的具体功能实现界面

重拳出击!我是这样对灰产外挂下手的

  • 以下是ollydbg通过下函数的断点也就是int3断点方式调试,接着分析触发断点下的堆栈数据,通过堆栈数据可以定位到下面的关键函数位置。
  • 下面的函数call的主要功能流程:
  1. 就是通过WinExec启动notepad的程序。
  2. 启动程序后通过查找notepad程序的窗口类名Notepad获取进程id。
  3. 通过远程线程方式将真正的外挂模块QT模块注入到notepad程序里面
  4. 强制关闭掉外挂的主程序。
  5. 下图是ollydbg定位到外挂功能关键函数的主入口函数。

重拳出击!我是这样对灰产外挂下手的

  • 下图是通过ollydgb动态调试后选中的函数。它主要功能是通过查找窗口,实现远程线程注入模块的函数

重拳出击!我是这样对灰产外挂下手的

  • 结合强大的静态分析工具IDA,分析定位到外挂它是通过调用底层系统WinExec函数去启动notepad进程,为后续的外挂模块找了一个可以安全注入的宿主程序(将外挂的主要模块放在记事本进程隐藏起来)。

重拳出击!我是这样对灰产外挂下手的

  • 通过PostQuitMessage消息机制强制关闭自身的外挂程序(这个是为了防止外挂程序被游戏反外挂检测到的操作)

重拳出击!我是这样对灰产外挂下手的

  • 外挂功能一顿操作后终于将最重要的外挂模块通过远程线程方式注入到notepad进程中,这个QT模块也将开启所谓的隐身蹲守模式,独自蹲守着那个一直期待的游戏客户端的启动并将游戏客户端的重要内存数据进行修改。

重拳出击!我是这样对灰产外挂下手的

  • 以上就会外挂前部分的功能实现,我们接下来来还原下这外挂的具体实现
  • 启动外挂的总流程
void  startNotepad()
{
 //启动notepad程序
 WinExec("\\system32\\notepad.exe",SW_SHOW);
 //通过窗口类名获取进程信息
 HWND hWnd = FindWindowA(NULL, "Notepad");
 DWORD dwPid = 0;
 GetWindowThreadProcessId(hWnd, &dwPid);
 //远程线程注入dll
 InJectNotepad(dwPid, "QT.dll");
 //强制关闭外挂程序
 PostQuitMessage(WM_QUIT);
}
  • 注入QT模块到记事本程序的实现
{
   if (DllName.IsEmpty())
       return false;

   HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,   FALSE, processId);                                      
   if (hProcess == INVALID_HANDLE_VALUE)
       return false;

   LPVOID pszDllName = VirtualAllocEx(hProcess, NULL, 4096,  MEM_COMMIT, PAGE_EXECUTE_READWRITE);               
   if (NULL == pszDllName)
    return false;

   bool bRet = WriteProcessMemory(hProcess, pszDllName, DllName, MAX_PATH, NULL);
   if(false == bRet)
    return false;

   HANDLE m_hInjecthread = CreateRemoteThread(hProcess, NULL,0, (LPTHREAD_START_ROUTINE)LoadLibraryA,  pszDllName,  NULL,  NULL);                                          
   if (NULL == m_hInjecthread)
    return false;

   DWORD dw = WaitForSingleObject(m_hInjecthread, -1);
   DWORD dwExitCode;
   GetExitCodeThread(m_hInjecthread, &dwExitCode);
   HMODULE m_hMod = (HMODULE)dwExitCode;
   BOOL bReturn = VirtualFreeEx(hProcess, pszDllName, 4096, MEM_DECOMMIT);
   if (NULL == bReturn)
      return false;

   CloseHandle(hProcess);
   hProcess = NULL;

   return true;
}

2.3 外挂具体实现功能的后部分

  • 接下来我们再看下这个外挂中最重要的QT模块都干了什么事情。
  • 遍历当前环境下的所有启动的进程。
  • 将对游戏客户端进行远程线程注入修改游戏客户端内存数据以此实现外挂的功能。
  • 下图就是QT模块的通过IDA工具简单的截图。

重拳出击!我是这样对灰产外挂下手的

  • 我们在把变量当前环境下的进程信息代码也还原下,远程线程注入代码的就不实现了,可以参考下前面的远程线程注入dll方式
//遍历游戏进程名称获取的进程的pid
DWORD GetProcessId(CString pszProcessName)
{
    HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (INVALID_HANDLE_VALUE == hProcess)
    {
        return 0;
    }

    DWORD dwProcessId = 0;

    PROCESSENTRY32 process32 = { 0 };
    process32.dwSize = sizeof(PROCESSENTRY32);

    BOOL bRetProcess = FALSE;
    bRetProcess = Process32First(hProcess, &process32);

    do
    {
        if (_tcscmp(pszProcessName, process32.szExeFile) == 0)
        {
            dwProcessId = process32.th32ProcessID;
            break;
        }

        bRetProcess = Process32Next(hProcess, &process32);
    } while (bRetProcess);
    CloseHandle(hProcess);

    return dwProcessId;
}

3.分析外挂样本的反检测功能

  • 外挂做了敏感字的规避,也就是外挂样本的窗口标题外挂窗口中没有过多的敏感文字展示。
  • 外挂样本通过注入到notepad的宿主进程中在进行操作外挂,也就是没有直接在外挂样本中操作这个功能,也是一个反外挂检测的一个方式。

如何学习呢?有没有免费资料?

今天免费分享 免费分享!

以上大型逆向安全学习资料获取方式:

转发 !

转发 !

转发 !关注我 私信回复关键词:“ 逆向 ” 即可免费领取!

点赞
收藏
评论区
推荐文章
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
李志宽 李志宽
1年前
黑灰产行业是怎么运行的?游戏黑灰产识别和溯源取证
游戏中的黑灰产一般来说,黑色产业指的是从事具有违法性的活动且以此来牟取利润的产业。而灰色产业则指的是不明显触犯法律和违背道德,游走于法律和道德边缘,以打擦边球的方式为“黑产”提供辅助的争议行为。游戏中的黑灰产主要围绕着:外挂辅助软件、盗号软件、工作室、私服、木马、钓鱼软件。外挂:外挂就是一种基于游戏进行作弊的软件,通过利用第三方软件或程序对游戏数据进行修改,
初识DevOps
基本概念和延伸的思考DevOps,是Development(开发)和Operations(运维)组成的复合词,一般译为“开发运维一体化”。看到这个概念,首先会产生几个问题:开发是什么,哪些环节是开发?运维是什么,哪些环节是运维?开发人员写好代码在本地调试,环境出问题了自己来调整,这是开发工作还是运维工作?系统故障后,运维人员发现是配置文件内容出错了就改成了正
SPDK QOS机制解析
本文关键词:intelspdkbdevqos序:intelspdk软件在存储领域应用广泛。因其可以高效管理linux系统的nvmessd盘,又支持vhostuser协议可以对接qemu虚拟机,在云计算领域通常被用来做本地盘云主机的存储管理软件。如此优秀的一款软件,有必要仔细分析其内部的实现机制,本篇文章主要介绍spdkqos机制。spdk
天翼云高可用虚拟IP(HAVIP)实践
(一)产品概述天翼云高可用虚拟IP(HighAvailabilityVirtualIPAddress,简称HAVIP)是一种可用独立创建和删除的私有网络IP地址资源。通过在VIPCIDR中申请一个私有网络IP地址,然后与高可用软件(如高可用软件Keepalived)配合使用,可用在VPC中搭建高可用的主备集群服务,提高VPC中服务的可用性。限制和说明
一个关于SDWAN单臂部署方案验证的实验
假设有这样一张网络,其中RTA和PCA表示某公司的A分支,通过中国电信CT路由器接入互联网ISP;RTB和PCB表示某公司的B分支,通过中国联通CU路由器接入互联网ISP。DNS(8.8.8.8)表示某互联网应用。为实现A分支私网192.168.2.0/24和B分支私网192.168.3.0/24的互通,现计划使用某厂商的SDWAN方案进打通两个内网,像下图
高性能API网关Kong介绍
本文关键词:高性能、API网关、Kong、微服务1.Introduction是随着微服务(Microservice)概念兴起的一种架构模式。原本一个庞大的单体应用(Allinone)业务系统被拆分成许多微服务(Microservice)系统进行独立的维护和部署,服务拆分带来的变化是API的规模成倍增长,API的管理难度也在日益增加,使用API网关发布和管
SPDK对接Ceph性能优化
关键词:SPDK、NVMeOF、Ceph、CPU负载均衡SPDK是intel公司主导开发的一套存储高性能开发套件,提供了一组工具和库,用于编写高性能、可扩展和用户态存储应用。它通过使用一些关键技术实现了高性能:1.将所有必需的驱动程序移到用户空间,以避免系统调用并且支持零拷贝访问2.IO的完成通过轮询硬件而不是依赖中断,以降低时延3.使用消息传递,以避免IO
3A网络 3A网络
5个月前
理解 virt、res、shr 之间的关系(linux 系统篇)
理解virt、res、shr之间的关系(linux系统篇)前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过t
3A网络 3A网络
5个月前
开发一个不需要重写成 Hive QL 的大数据 SQL 引擎
开发一个不需要重写成HiveQL的大数据SQL引擎学习大数据技术的核心原理,掌握一些高效的思考和思维方式,构建自己的技术知识体系。明白了原理,有时甚至不需要学习,顺着原理就可以推导出各种实现细节。各种知识表象看杂乱无章,若只是学习