使用Exeinfo Pe shell检查工具检查插件样本,看看它是否是脱壳的应用程序。 (我的心猛地一跳,付费插件连任何保护都没有做,也不对自己的程序负责,就这么把程序裸露在市场上。)
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_PRCONFIG, NULL,NULL,NULL); if(!hInternet) { InternetCloseHandle(hInternet); hInternet=NULL;返回假; 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 外挂具体实现功能的前部分
首先是登录后热插拔具体功能实现界面
下面是通过函数的断点,即int3断点方法来调试ollydbg,然后分析触发断点下的堆栈数据。通过堆栈数据可以定位下面的关键函数位置。以下函数调用的主要功能流程是通过WinExec启动记事本程序。启动程序后,通过查找记事本程序的窗口类名Notepad来获取进程ID。通过远程线程将真正的插件模块QT模块注入记事本程序中,强制关闭插件主程序。下图是ollydbg的主要入口函数,用于定位插件功能的关键函数。
下图是通过ollydgb动态调试后选择的函数。其主要功能是通过搜索窗口实现远程线程注入模块功能。
结合强大的静态分析工具IDA,分析定位插件,该插件通过调用底层系统的WinExec函数启动记事本进程,并找到可以安全注入的宿主程序,供后续插件模块使用(插件的主模块被放置在记事本进程隐藏中)。
通过PostQuitMessage消息机制强制关闭自己的外挂程序(这是为了防止外挂程序被游戏的反外挂程序检测到)
经过对插件功能的一些操作,最终通过远程线程将最重要的插件模块注入到notepad进程中。这个QT模块还会开启所谓的隐身模式,守护着我一直在等待的游戏客户端的启动。最后修改重要的内存数据。
以上就实现了插件第一部分的功能。我们来还原一下插件的具体实现。启动插件的整体流程void startNotepad(){ //启动记事本程序WinExec('\\system32\\notepad.exe',SW_SHOW ); //通过窗口类名获取进程信息HWND hWnd=FindWindowA(NULL, 'Notepad');双字dwPid=0; GetWindowThreadProcessId(hWnd, dwPid); //远程线程注入dll InJectNotepad(dwPid, 'QT.dll' ;==INVALID_HANDLE_VALUE) return false; LPVOID pszDllName=VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (NULL==pszDllName) 返回false; bool bRet=WriteProcessMemory(hProcess, pszDllName, DllName, MAX_PATH, NULL); if (false==bRet) 返回false; HANDLE m_hInjectthread=CreateRemoteThread(hProcess, NULL,0, (LPTHREAD_START_ROUTINE)LoadLibraryA, pszDllName, NULL, NULL); if (NULL==m_hInjectthread) 返回false; DWORD dw=WaitForSingleObject(m_hInjecthread, - 1); DWORD dwExitCode; GetExitCodeThread(m_hInjectthread, dwExitCode); HMODULE m_hMod=(HMODULE)dwExitCode; BOOL bReturn=VirtualFreeEx(hProcess, pszDllName, 4096, MEM_DECOMMIT); if (NULL==bReturn) 返回false;关闭句柄(hProcess); h进程=NULL; return true;}
2.3 外挂具体实现功能的后部分
接下来我们看一下这个插件中最重要的QT模块是做什么的。遍历当前环境中所有已启动的进程。会对游戏客户端进行远程线程注入,修改游戏客户端的内存数据,从而实现外挂功能。下图是通过IDA工具对QT模块进行的简单截图。
我们还在变量的当前环境中恢复进程信息代码。远程线程注入代码将不会被执行。可以参考前面的远程线程注入dll方法//遍历游戏进程名获取进程的pidDWORD GetProcessId(CString pszProcessName ){HANDLE hProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);如果(INVALID_HANDLE_VALUE==hProcess){返回0; } DWORD dwProcessId=0;还可以; bRetProcess=Process32First(hProcess, process32); do { if (_tcscmp(pszProcessName, process32.szExeFile)==0) { dwProcessId=process32.th32ProcessID; }休息; bRetProcess=Process32Next(hProcess, process32); while (bRetProcess);关闭句柄(hProcess); return dwProcessId;}
3.分析外挂样本的反检测功能
插件避免敏感词,即插件示例的窗口标题中没有显示太多敏感词。将插件样本注入记事本的宿主进程来操作插件,即在插件样本中不直接操作该函数,这也是反插件检测的一种方法。如何学习?有免费的资料吗?
标签:
用户评论
哇,原来灰品插件这么厉害,我也是从这篇文章开始了解的。
有6位网友表示赞同!
用了灰品插件后,感觉工作效率提升了不少,真是个神器!
有5位网友表示赞同!
一直听说灰品插件,但不知道怎么用,这篇教程太及时了!
有5位网友表示赞同!
刚开始用灰品插件,效果真的不错,但是要注意别滥用啊。
有12位网友表示赞同!
我之前用过一个类似的插件,效果一般般,这篇教程让我重新看到了希望。
有14位网友表示赞同!
用了灰品插件后,发现很多功能都很实用,但是也担心它会不会泄露我的隐私。
有19位网友表示赞同!
这篇文章让我对灰品插件有了更深的了解,但我觉得还是要谨慎使用。
有19位网友表示赞同!
我就是这样开始使用灰品插件的,没想到效果这么好,推荐给大家试试看。
有7位网友表示赞同!
看了这篇文章,我决定试试灰品插件,希望可以提高我的工作效率。
有5位网友表示赞同!
灰品插件确实能提高效率,但我觉得还是得根据自己的需求来选择。
有6位网友表示赞同!
用了灰品插件,感觉电脑运行速度都变快了,但有时候也担心它会不会影响电脑安全。
有10位网友表示赞同!
这篇文章让我对灰品插件有了全新的认识,谢谢分享!
有5位网友表示赞同!
用了灰品插件,但是发现有些功能用起来很麻烦,不如之前的插件方便。
有6位网友表示赞同!
灰品插件虽然好用,但是用得不好会适得其反,得学会合理使用。
有5位网友表示赞同!
看了这篇文章,我决定彻底放弃之前的插件,试试这个灰品插件。
有7位网友表示赞同!
用了灰品插件,感觉生活和工作都轻松了很多,真的太感谢了!
有9位网友表示赞同!
这篇文章让我对灰品插件有了恐惧感,感觉太不安全了。
有9位网友表示赞同!
我开始用灰品插件了,但是有点担心它会不会让我上瘾,毕竟它太强大了。
有9位网友表示赞同!
用了灰品插件,感觉生活和工作都有了质的飞跃,但是也要注意保护个人信息。
有12位网友表示赞同!
这篇文章让我对灰品插件有了全新的看法,之前一直觉得它是坏东西。
有13位网友表示赞同!