郁金香初级班 6/7 33-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寄存器的值 故此需要挂接主线程
线程的认识:
主线程
一旦主线程死亡,所有线程跟着死亡
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 在结构中是一块数组指针
FS+18 =teb 地址
获取每段线程的TEB地址
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: 实现文件
//
