郁金香初级班 6/7 33-50 完结

郁金香 初级班完结(31 -50)

31.输入输出重定向

控制台重定义代码

     FILE* pfile = NULL;
  //重定向到标准输出
  errno_t iret = freopen_s(&pfile, "CONOUT$", "w", stdout);

 

防止卡代码注入器

 ::CreateThread(0, 0, 线程函数, 0, 0,0);
 DWORD WINAPI 线程函数(LPVOID arg);

 

自动释放DLL

 FreeLibraryAndExitThread(theApp.m_hInstance, 123);

 

32.定时器
 SetTimer函数的原型
 UINT_PTR SetTimer(
 HWND hWnd, // 窗口句柄
 UINT_PTR 定时器ID, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
 UINT nElapse, // 时间间隔,单位为毫秒
 TIMERPROC lpTimerFunc // 回调函数
 );
 //定时器回调
 void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT_PTR 定时器ID,DWORD dwTime);
 //关闭定时器
 void KillTimer(HWND hWnd,UINT 定时器ID);
p33 .基址偏移分析(省)
p34.对象分析(省)
p35 .mfc的消息机制 +事件

事件 :我鼠标单机按钮就是一个事件 理解 发出单机信息 接收后调用我写的槽函数

信息 :我重写鼠标双击处理函数

 void CdllzhuruDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
 {
  // TODO: 在此添加消息处理程序代码和/或调用默认值
 
  CDialogEx::OnLButtonDblClk(nFlags, point);
  MessageBoxA(0, "哈哈", "哈哈1", 0);
 
 }

 

p36 .编辑框控件

读取内容 设置内容

1.给编辑框设置 变量 值来进行简单控制 由编译器进行捆绑

 edit1 = L"haha";
 
  UpdateData(false);
 
  UpdateData(true);
 
  MessageBox(edit1, L"编辑框内容");

 

p37 在游戏空间加载DLL(省)

 

38 39 40.寻路call分析

关键点->开关

 指针基址可能是 =16C7B6E0
 0072B6FB - jne 0072B722
 0072B6FD - mov eax,[00BD08F4]
 0072B702 - cmp [eax+30],edx->判断是否寻路
 0072B705 - je 0072B722//寻路跳转
 0072B707 - fldz

寻路call分析

 0072B7 | 51                   | push ecx                                             | 寻路call
 0072B7 | D91C24               | fstp dword ptr ss:[esp],st(0)                        |
 0072B7 | 8955 F8              | mov dword ptr ss:[ebp-0x8],edx                       |
 0072B7 | 8955 FC              | mov dword ptr ss:[ebp-0x4],edx                       |
 0072B7 | 8B55 08              | mov edx,dword ptr ss:[ebp+0x8]                       |
 0072B7 | 52                   | push edx                                             |
 0072B7 | 8D45 F8              | lea eax,dword ptr ss:[ebp-0x8]                       |
 0072B7 | 50                   | push eax                                             |
 0072B7 | 6A 04                | push 0x4                                             |
 0072B7 | E8 DEBCFFFF          | call wow.727400                                      |

c++内关键寻路 ecx=24F01B08 后续课程会进行寻址

     this->UpdateData(1);
  UINT_PTR callm = 0x727400;
  char 参数2[8] = { 0,0,0,0,0,0,0,0 };
  float 坐标[3] = { x,y,z };
  UINT_PTR ecxq = 0x24F01B08;
  _asm {
  push 0//参4
  lea eax, 坐标
  push eax//参3 坐标
  lea eax, 参数2
  push eax//8个字节的0
  push 4//参4 4
  mov ecx,ecxq//ecx 需手动查询
  call callm
 
  }
     
41.c++开辟多线程

fs段->上次角色对象call的获取就有段寄存器 故此需要挂主线程

自写线程回调函数 ->开辟线程调用

TEB:fs段寄存器 如上call 内某个数据需要用到主线程的fs寄存器的值 故此需要挂接主线程

线程的认识:

3001071-20230224122342767-1429005970

主线程

一旦主线程死亡,所有线程跟着死亡

 DWORD WINAPI 线程回调函数01(LPVOID arg)
 {
 
  printf("线程回调1");
  while (true)
  {
  Sleep(1000);
  }
 }
 DWORD WINAPI 线程回调函数02(LPVOID arg)
 {
 
  printf("线程回调2");
  while (true)
  {
  Sleep(1000);
  }
 }
 void main() {
  CreateThread(0, 0, 线程回调函数01, 0, 0, 0);
  CreateThread(0, 0, 线程回调函数02, 0, 0, 0);
  getchar();
 }
 
42.FS与TEB关系

例子 获取护甲的eax的call 有fs段

[fs:2c] 0144DE00 主线程TEB [286000 +2C]->0144de 故此我们知道fs:2c=TEB+2C 在结构中是一块数组指针

AS

FS+18 =teb 地址

获取每段线程的TEB地址

 #include<Windows.h>
 DWORD WINAPI 线程回调函数01(LPVOID arg)
 {
  UINT_PTR teb = 0;
  _asm
  {
  mov eax,FS:[0X18]
  mov teb,eax
 
  }
  printf("线程回调1-%x\n", teb);
  while (true)
  {
  Sleep(1000);
  }
 }
 CreateThread(0, 0, 线程回调函数01, 0, 0, 0);
43 44 .寻路call完善

追踪ecx 来源

返回一层call 发现mov ecx,ebx

ecx->eax->call返回值 分析call

 005274 | A1 3C12CA00          | mov eax,dword ptr ds:[0xCA123C]                      |
 005274 | 8B0D 3812CA00       | mov ecx,dword ptr ds:[0xCA1238]                     |
 
 005274 | 53                   | push ebx                                           |有对应的pop 故此排除是参数
 005274 | 68 A32A0000         | push 0x2AA3                                         |
 005274 | 68 9CF09F00         | push wow.9FF09C                                     | 9FF09C:".\\GameUI.cpp"
 005274 | 6A 08               | push 0x8                                             |
 005274 | 50                   | push eax                                             |
 005274 | 51                   | push ecx                                             |
 005274 | E8 69D9FAFF         | call wow.4D4DB0                                     | 返回值是eax->ecx
 005274 | 8BD8                 | mov ebx,eax                                         | ecx来源eax
 005274 | 83C4 14             | add esp,0x14                                         |

分析5个参数->刚好对应

44 c++编写

1.卡主线程 获取ecx

 VOID CALLBACK zhuxian(HWND h, UINT arg2, UINT_PTR arg3_id, DWORD time)
 {
  KillTimer(h, 10086);
  UINT_PTR CALLz = 0X4D4DB0;
 
  _asm
  {
  mov eax, dword ptr ds : [0xCA123C]
  mov ecx, dword ptr ds : [0xCA1238]
  push 0x2AA3
  push 0x9FF09C
  push 0x8
  push eax
  push ecx
  call CALLz
  mov 获取ecx2, eax
  add esp, 0x14
  }
 
 }
 
 void mi::OnBnClickedButton2()
 {
  HWND 游戏窗口句柄 = FindWindowA("GxWindowClassD3d", "魔兽世界");
  ::SetTimer(游戏窗口句柄, 10086, 1, zhuxian);
 }
 

2.寻路call的代码编写

 void mi::OnBnClickedButton1()
 {
  // TODO: 在此添加控件通知处理程序代码
 
  this->UpdateData(1);
  UINT_PTR callm = 0x727400;
  char 参数2[8] = { 0,0,0,0,0,0,0,0 };
  float 坐标[3] = { x,y,z };
  UINT_PTR ecxq = 0x24F01B08;
  _asm {
  push 0
  lea eax, 坐标
  push eax
  lea eax, 参数2
  push eax
  push 4
  mov ecx, 获取ecx2
  call callm
 
  }
 
 }
45.汇编中数组访问方式
 003622 | 8B4C85 D4            | mov ecx,dword ptr ss:[ebp+eax*4-0x2C]         |->数组来源
 003622 | 51                   | push ecx                                      |
 003622 | 68 5C8C3600          | push <test."%d\n"...>                         | 368C5C:"%d\n"
 003622 | E8 FCEDFFFF          | call test.3610DC                              | 打印
 003622 | 83C4 08              | add esp,0x8                                   |
 mov ecx,dword ptr ss:[ebp+eax*4-0x2C]  
 ebp->栈底
 eax->[ebp-0x44]->eax->add eax,0x1
 003622 | 83C0 01              | add eax,0x1                                   |
 003622 | 8945 BC              | mov dword ptr ss:[ebp-0x44],eax               |    
 003622 | 8B45 BC              | mov eax,dword ptr ss:[ebp-0x44]               |
 003622 | 8B4C85 D4            | mov ecx,dword ptr ss:[ebp+eax*4-0x2C]         |
46 47. 分析各项属性

属性值

 $-10              0         21         22         23 
 $ ==>            39         37          0          0
 $+10              0          2          1          0
 $+20              0          0          0          0
 $+30            157//护甲         0         0         0

名字

Xdebug 转CE +0 或者直接转常量查找地址

UTF-8->汉字

48-50.编写代码读取属性
 // svs.cpp: 实现文件
 //
 
 #include "pch.h"
 #include "郁金香初级班结业.h"
 #include "svs.h"
 #include "afxdialogex.h"
 
 
 // svs 对话框
 
 IMPLEMENT_DYNAMIC(svs, CDialog)
 
 svs::svs(CWnd* pParent /*=nullptr*/)
  : CDialog(IDD_DIALOG1, pParent)
  , x(0)
  , y(0)
  , z(0)
 {
 
 }
 
 svs::~svs()
 {
 }
 
 void svs::DoDataExchange(CDataExchange* pDX)
 {
  CDialog::DoDataExchange(pDX);
  DDX_Text(pDX, IDC_EDIT2, x);
  DDX_Text(pDX, IDC_EDIT1, y);
  DDX_Text(pDX, IDC_EDIT3, z);
 }
 
 
 BEGIN_MESSAGE_MAP(svs, CDialog)
  ON_BN_CLICKED(IDC_BUTTON2, &svs::OnBnClickedButton2)
  ON_BN_CLICKED(IDC_BUTTON1, &svs::OnBnClickedButton1)
  ON_BN_CLICKED(IDC_BUTTON4, &svs::OnBnClickedButton4)
  ON_BN_CLICKED(IDC_BUTTON3, &svs::OnBnClickedButton3)
  ON_BN_CLICKED(IDC_BUTTON5, &svs::OnBnClickedButton5)
  ON_BN_CLICKED(IDC_BUTTON6, &svs::OnBnClickedButton6)
 END_MESSAGE_MAP()
 
 UINT_PTR 获取ecx2;
 // svs 消息处理程序
 VOID CALLBACK zhuxian(HWND h, UINT arg2, UINT_PTR arg3_id, DWORD time)
 {
  KillTimer(h, 10086);
  UINT_PTR CALLz = 0X4D4DB0;
 
  _asm
  {
  mov eax, dword ptr ds : [0xCA123C]
  mov ecx, dword ptr ds : [0xCA1238]
  push 0x2AA3
  push 0x9FF09C
  push 0x8
  push eax
  push ecx
  call CALLz
  mov 获取ecx2, eax
  add esp, 0x14
  }
 
 }
 
 void svs::OnBnClickedButton2()
 {
  // TODO: 在此添加控件通知处理程序代码
  HWND 游戏窗口句柄 = FindWindowA("GxWindowClassD3d", "魔兽世界");
  ::SetTimer(游戏窗口句柄, 10086, 1, zhuxian);
 }
 
 
 void svs::OnBnClickedButton1()
 {
  // TODO: 在此添加控件通知处理程序代码
  this->UpdateData(1);
  UINT_PTR callm = 0x727400;
  char 参数2[8] = { 0,0,0,0,0,0,0,0 };
  float 坐标[3] = { x,y,z };
  UINT_PTR ecxq = 0x24F01B08;
  _asm {
 
 
 
  push 0
  lea eax, 坐标
  push eax
  lea eax, 参数2
  push eax
  push 4
  mov ecx, 获取ecx2
  call callm
 
  }
 }
 
 
 void svs::OnBnClickedButton4()
 {
  // TODO: 在此添加控件通知处理程序代码
  FreeConsole();//关闭控制台
  // TODO: 在此添加控件通知处理程序代码
 }
 
 
 void svs::OnBnClickedButton3()
 {
  AllocConsole();
  FILE* pfile = NULL;
  //重定向到标准输出
  errno_t iret = freopen_s(&pfile, "CONOUT$", "w", stdout); //printf输出重定向到控制台
  // TODO: 在此添加控件通知处理程序代码
 }
 
 DWORD R4(UINT_PTR 地址)
 {
  __try
  {
  return *(DWORD*)地址;//ReadProcessMemory
  }
  __except (1)
  {
  return 0;
  }
 }
 void svs::OnBnClickedButton5()
 {
  // TODO: 在此添加控件通知处理程序代码
  DWORD hj = R4(R4(获取ecx2 + 0xD0) + 0x174);
  DWORD 力量 = R4(R4(获取ecx2 + 0xD0) + 0x138);
  DWORD 敏捷 = R4(R4(获取ecx2 + 0xD0) + 0x13C);
  DWORD 耐力 = R4(R4(获取ecx2 + 0xD0) + 0x140);
  DWORD 智力 = R4(R4(获取ecx2 + 0xD0) + 0x144); 
DWORD 精神力 = R4(R4(获取ecx2 + 0xD0) + 0x148); 
​ 
if (hj != 0) 

​ 
​ 
printf("护甲值:%d 力量:%d 敏捷%d 耐力%d 智力 %d 精神力 %d \n", hj, 力量 
, 敏捷, 耐力, 智力, 精神力 
 
); 
printf("名字:%s", (char*)(0x400000 + 0x879D18)); 

else 

printf("读取失败\n"); 
​ 


​ 
DWORD* R42(UINT_PTR 地址) 

__try 

return (DWORD * )*(DWORD*)地址;//ReadProcessMemory 

__except (1) 

return 0; 


void svs::OnBnClickedButton6() 

// TODO: 在此添加控件通知处理程序代码 
DWORD* 力量 = R42(获取ecx2 + 0xD0) + 0x138;//这个地址内存储这个力量 
*力量 = 0x123; 

笔记下载md https://kxd.lanzoul.com/ik2Pn0ym41uh


 



posted @ 2023-05-29 16:39  大橘|博客  阅读(33)  评论(0)    收藏  举报