开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1104|回复: 6
收起左侧

[图文资料] feng包辅zhu“初体验”(二)

[复制链接]
发表于 2020-6-5 11:14:59 | 显示全部楼层 |阅读模式   湖南省长沙市


feng包辅zhu“初体验”(二)


篇幅过长,我们继续快乐~

(温馨提示请先观看:封  包辅zhu“初体验”(一))


(三)代码示例


  1. bool F发送封包(byte *p, DWORD ndIndex,char *szStr)
  2. {
  3.         byte *data = p;
  4.         DWORD nd包长 = ndIndex;
  5.         DWORD nd加密地址 = (DWORD)data + 0x2;
  6.         DWORD nd加密长度 = nd包长 - 0x2;
  7.         DWORD nd密钥地址 = NULL;
  8.         __try
  9.         {
  10.                 // [[[[[0x0F84BA4]]+0x4]+0x0C+0x8]]+0x54   密钥公 0019FB90   00000B4C  |Socket = 0xB4C
  11.                 nd密钥地址 = *(DWORD*)0x0F84BA4;
  12.                 nd密钥地址 = *(DWORD*)nd密钥地址;
  13.                 nd密钥地址 = *(DWORD*)(nd密钥地址 + 0x4);
  14.                 nd密钥地址 = *(DWORD*)(nd密钥地址 + 0x0C + 0x8);
  15.                 nd密钥地址 = *(DWORD*)nd密钥地址 + 0x54;

  16.                 F加密call(nd密钥地址, nd加密长度, nd加密地址, nd加密地址);

  17.                 HWND hWnd = (HWND)FindWindowA("Lapis Network Class", NULL);
  18.                 DWORD ndData = GetWindowLongW(hWnd, -21);
  19.                 DWORD Socket = *(DWORD*)(ndData + 0x38);
  20.                 send(Socket, (const char*)data, nd包长, 0);
  21.         }
  22.         __except (1)
  23.         {
  24.                 F输出调试信息("幻想神域 %s\n\r", szStr);
  25.                 return false;
  26.         }
  27.         return true;
  28. }
复制代码

HOOK拦截输出明文包内容:

(一)理论
完事具备,只欠东风。我们现在已经封装好了自己明文发包函数,就差内容了。那我们怎么才能知道,什么功能要传什么样的封包呢?比如吃药...难道直接传个“吃药”?

呃...其实说来也简单,我们不是找到明文封包了么,吃药断下我们把内容复制下来,多复制一些案例,细细分析总能猜出来。但是不同的动作会产生不同的封包,比如我们要实习一个自动打怪挂机、跑主线等,那工作量可就大了,如果都OD下断点复制,未免太麻烦了,所以我们需要一个更好的方式——HOOK。

HOOK简单来说其实就是想方设法改变程序原来的执行流程,我们这里的目标很简单,让cpu在运行加密函数之前,先运行我们的函数 我们函数里面输出明文包的内容 然后跳转回原来的地方让程序继续正常执行。

具体操作也很简单,如图:





其实所谓的代码和指令也数字,图上可知最左边是代码在内存中的地址,中间是代码在内存中真正的模样(数字),右边是OD帮我们把数字翻译成人能看懂的汇编代码。

那么既然我们知道了代码的本质(数值)和它的地址,所以我们可以通过地址修改数值来修改代码,从而改变代码流程。

比如把红框中的2句汇编代码修改成:0xE8XXXXXXXX   —— E8XXXXXXXX 对应Call指令上图也可以看到,后面的数值是算出来的 等于 要跳转地址 - (当前地址+0x5)。要跳转的地址肯定是我们的函数啊,当前地址上图就有 舒服~

当然我们的函数必须是一个裸函数,而且开头要使用 pushad 指令来保存现场环境,干完坏事后 使用 popad指令还原现场,最后一定要记得一字不差的写上被我们破坏的那2条指令,在使用 ret 指令跳转回去 不然程序肯定崩溃。(篇幅有限这里只是讲个大概,有兴趣具体学习百度一搜就有)

这样在我们的裸函数里面,pushad popad中间就可以写代码输出明文的封包内容。

(二)参考代码


  1. //HOOK
  2. void HXSYDialog::OnBnClickedButton3()
  3. {
  4.         // TODO: 在此添加控件通知处理程序代码
  5.         /*00B92C82    8B46 08         mov eax, dword ptr ds : [esi + 0x8]
  6.         00B92C85    2BC1            sub eax, ecx
  7.         00B92C87    83C0 FE         add eax, -0x2*/

  8.         DWORD ndHOOKAddress = 0x00B92C82;
  9.         DWORD ndHOOK函数指针 = (DWORD)FHOOK明文发包;
  10.         DWORD ndHOOK跳转值 = ndHOOK函数指针 - ndHOOKAddress - 5;

  11.         DWORD old = 0;
  12.         //改变内存页属性
  13.         VirtualProtect((PVOID)ndHOOKAddress, 0x30, PAGE_EXECUTE_READWRITE, &old);

  14.         //修改代码
  15.         *(byte*)ndHOOKAddress = 0xE8; //Call
  16.         *(DWORD*)(ndHOOKAddress + 1) = ndHOOK跳转值;

  17.         //还原内存页属性
  18.         VirtualProtect((PVOID)ndHOOKAddress, 0x30, old, &old);
  19. }

  20. //还原HOOK,一样的道理修改回去
  21. void HXSYDialog::OnBnClickedButton4()
  22. {
  23.         // TODO: 在此添加控件通知处理程序代码
  24.                 /*00B92C82    8B46 08         mov eax, dword ptr ds : [esi + 0x8]
  25.         00B92C85    2BC1            sub eax, ecx
  26.         00B92C87    83C0 FE         add eax, -0x2*/

  27.         DWORD ndHOOKAddress = 0x00B92C82;

  28.         DWORD old = 0;
  29.         VirtualProtect((PVOID)ndHOOKAddress, 0x30, PAGE_EXECUTE_READWRITE, &old);

  30.         *(byte*)ndHOOKAddress = 0x8B;
  31.         *(DWORD*)(ndHOOKAddress + 1) = 0xC12B0846;

  32.         VirtualProtect((PVOID)ndHOOKAddress, 0x30, old, &old);
  33. }

  34. //我们的函数
  35. DWORD g_nd包长 = 0;
  36. DWORD g_nd包Address = 0;
  37. DWORD g_ndPid = NULL;

  38. HANDLE g_hProcess = 0;
  39. byte *g_byP = nullptr;
  40. char g_szObj[0x1000];
  41. char g_szStr[0x1000];

  42. void __declspec(naked) FHOOK明文发包()
  43. {
  44.         __asm
  45.         {
  46.                 //保存寄存器 提升堆栈
  47.                 pushad

  48.                 //得到包地址 包长
  49.                 mov eax, dword ptr[esi + 4]
  50.                 mov g_nd包Address, eax
  51.                 mov ecx, dword ptr[esi + 8]
  52.                 sub ecx, eax
  53.                 mov g_nd包长, ecx
  54.         }
  55.         //提升权限
  56.         F提升权限(TRUE);
  57.         //获得进程ID
  58.         GetWindowThreadProcessId(F获取游戏主窗口句柄(), &g_ndPid);//获得进程ID
  59.         //打开进程
  60.         g_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_ndPid);//打开进程

  61.         g_byP = new byte[g_nd包长];
  62.         //读出包内容
  63.         ReadProcessMemory(g_hProcess, (LPCVOID)g_nd包Address, g_byP, g_nd包长, 0);// p 封包字节集
  64.         *(WORD*)g_byP = g_nd包长 - 2;
  65.         for (int i = 0; i < (int)g_nd包长; i++)
  66.         {
  67.                 sprintf_s(g_szObj, "%02X", g_byP[i]);
  68.                 strcat_s(g_szStr, g_szObj);
  69.         }
  70.         //自己封装 支持多线程的printf()
  71.         F输出调试信息("幻想神域:明文发包  包长:%x   包内容:%s\r\n", g_nd包长, g_szStr);
  72.         //清空缓冲区
  73.         sprintf_s(g_szStr, "%s", "");
  74.         delete[] g_byP;
  75.         __asm
  76.         {
  77.                 popad

  78.                 //还原两句 被HOOK的游戏代码
  79.                 mov eax, dword ptr ds : [esi + 0x8]
  80.                 sub eax, ecx

  81.                 retn
  82.         }
  83. }

  84. //自己封装 支持多线程的printf()
  85. void F输出调试信息(char * pszFormat, ...)
  86. {
  87. #ifdef _DEBUG
  88.         char szbufFormat[0x1000];
  89.         char szbufFormat_Game[0x1100] = "";
  90.         va_list argList;
  91.         va_start(argList, pszFormat);
  92.         vsprintf_s(szbufFormat, pszFormat, argList);
  93.         strcat_s(szbufFormat_Game, szbufFormat);
  94.         OutputDebugStringA(szbufFormat_Game);
  95.         va_end(argList);
  96. #endif
  97. }
复制代码

(三)实战

我们上面的HOOK代码会把封包内容输出出来,但是由于是DLL注入形式的代码,所以我们并没有控制台窗口,故不能直接看到输出。这时候我们就需要借助一个输出捕捉工具了——Dbgview:





只需要输入关键字,就可以捕捉所有进程带关键子的输出,非常好用。



图片40.png

我们试着嗑下如图位置的药品,看看会游戏会发送什么样的封包。





包长:16   包内容:14004F00000000000100000000000000000000000000
包长:16   包内容:14004F00000000000A00000000000000000000000000

很明显,”1400”是封包2字节后的有效长度 我们之前已经分析过了。”4F”应该是代表吃药这个动作,那么”1” 和 “A”根据药品的位置来看 应该就是药品在背包表格中的下标,其他都为0我们可以暂时无视它们。

基本摸清了吃药封包的结构,我们可以尝试封装一个通过药品下标吃药的函数了:


void F吃药Call(int i)
{
byte Data[0x16] = { 0x14,00,0x4F,00,00,00,00,0x00,00,00,00,00,00,00,00,00,00,00,00,00,00,00};
(WORD)(Data + 0x8) = i;
F发送封包(Data, 0x16, "");
}


调用一下试试:



图片42.png

Nice~! 封包吃药成功~!(使用药水这几个字可不是我P上去的啊,游戏嗑药就这特性)

麻雀虽小,五脏俱全 ; 经历千辛万苦我们终于达成了目标!虽然只有一个简单的嗑药功能,但是这却是一个货真价实的封包辅Z!!!
总结:
封包辅Z也并不多神秘和神奇,只是省去了中间的过程,直接联系服务器。

优点: 不走游戏代码,相当于避开了所有的本地检测,极其稳定。
缺点: 需要做很多前期工作,实现麻烦、分析封包费时费力。

屈尊调用游戏功能函数“内存辅Z”研究速度快,认真逆向分析封包内容“封包辅Z”快乐而稳定!



点评

帖中工具、游戏、完整源码geihub链接 https://github.com/Li-lab-dev/-   广西壮族自治区桂林市  发表于 2020-7-19 21:40

结帖率:94% (181/193)

签到天数: 6 天

发表于 2020-6-6 11:31:30 | 显示全部楼层   安徽省芜湖市
啊哈和 发表于 2020-6-5 20:09
嗯, shuj总共是要的,也可以通过明文收包获取   但是不好分析。 还是通过反汇编分析找游戏是怎么访问的 ...

期待你的教程 明文必须配合内存
回复 支持 反对

使用道具 举报

发表于 2020-6-6 09:37:40 | 显示全部楼层   吉林省长春市
不错不错,效果好极了,用美国话叫  万瑞古德
回复 支持 反对

使用道具 举报

发表于 2020-6-5 20:15:23 | 显示全部楼层   辽宁省丹东市
我看的竟然 硬了  还有么 大佬
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-5 20:09:15 | 显示全部楼层   湖南省长沙市
zzh233 发表于 2020-6-5 11:58
明文请求的确很方便 但是有时候还得配合内存 比如遍历包裹 遍历周围怪物 我最不理解的就是二叉树

嗯, shuj总共是要的,也可以通过明文收包获取   但是不好分析。 还是通过反汇编分析找游戏是怎么访问的好,普通二叉树还好  变形的会比较麻烦。 有空讲讲怎么找 怎么遍历 这些shuj。
回复 支持 反对

使用道具 举报

结帖率:94% (181/193)

签到天数: 6 天

发表于 2020-6-5 11:58:34 | 显示全部楼层   安徽省芜湖市
明文请求的确很方便 但是有时候还得配合内存 比如遍历包裹 遍历周围怪物 我最不理解的就是二叉树
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表