郁金香2021年游戏辅助技术(初级班)(上)

郁金香2021年游戏辅助技术初级班(上)

    • %p、size_t、%zd、%llu、FindWindow、GetWindowText、SetWindowText
    • GetWindowThreadProcessId、OpenProcess、ReadProcessMemory
    • 封接读内存接口函数 int R4(void* 地址)
    • 跨进程向目标进程内存地址写入数值 WriteProcessMemory
    • C,C++32位和64位进程内存数据读写函数接口、通过头文件进行项目管理
    • X64环境masm汇编asm文件
    • 常见的六种参数调用约定传递与平栈
      • x86环境
      • x64环境
    • 汇编条件转移指令与循环
    • C,C++用代码,跨进程调用CALL
      • 用代码注入器调用CALL
      • C,C++创建远程线程调用CALL
    • 常用软件游戏
    • 定位特征码
    • PE查看分析工具
    • 驱动开发调试工具 DriverTool

%p、size_t、%zd、%llu、FindWindow、GetWindowText、SetWindowText

HMODULE hModule = GetModuleHandle(nullptr);
// %p 表示格式化指针
printf("ddd %p\n", hModule);
// sizeof输出的类型为size_t,%zd 表示格式化size_t类型大小
// 在x64系统下sizeof运算符 返回值是size_t 占用空间8字节 要使用%llu格式化输出
printf("sizeof(HMODULE)=%zd 字节\n", sizeof(hModule));	// sizeof(HMODULE)
//HWND hWnd = reinterpret_cast<HWND>(0x001A03DE);
printf("sizeof(DWORD)=%zd sizeof(LONG)=%zd\n", sizeof(DWORD), sizeof(LONG));// char short int的表示范围// 头文件 #include<limits.h>printf("char类型表示范围 %d至%d\r\n", SCHAR_MIN, SCHAR_MAX);printf("unsigned char类型表示范围 %u至%u\r\n", 0, UCHAR_MAX); // short printf("short类型表示范围 %d至%d\r\n", SHRT_MIN, SHRT_MAX);printf("unsigned short类型表示范围 %u至%u\r\n", 0, USHRT_MAX);// int  -21亿 +21亿printf("int类型表示范围 %d至%d\r\n", INT_MIN, INT_MAX);printf("unsigned int类型表示范围 %u至%u\r\n", 0, UINT_MAX);HWND calcHwnd = FindWindow(L"CalcFrame", nullptr);
printf("窗口句柄=%p\r\n", calcHwnd);
TCHAR buf[MAX_PATH] = { 0 };
wchar_t outBuf[MAX_PATH] = { 0 };
GetWindowText(calcHwnd, buf, MAX_PATH);
// %ws 表示格式化宽字符串
swprintf_s(outBuf, L"calc %ws\n", buf);	
// 宽字符串也可以使用大写的%S格式化输出
//_stprintf_s(outBuf, _T("calc caption %S\n"), buf);
MessageBox(nullptr, outBuf, buf, MB_OK);
SetWindowText(calcHwnd, L"我的计算器zzz");

GetWindowThreadProcessId、OpenProcess、ReadProcessMemory

GetWindowThreadProcessId //返回线程TID和进程PID

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#include <iostream>	// 包含了<stdio.h>头文件
#include<Windows.h>
int main()
{// 1 通过窗口标题或者类名 获取目标窗口句柄// 2 通过窗口句柄获取进程的PID,TIDHWND 窗口句柄 = FindWindowA("MainWindow", "植物大战僵尸中文版");printf("窗口句柄 h=%p\r\n", h);DWORD pid = 0, tid = 0;printf("&pid=%p\r\n", &pid);// int 和 long是等价// DWORD  等价于 unsigned long // DWORD* 等价于 LPDWORDtid = GetWindowThreadProcessId(窗口句柄, &pid);printf("tid=%d pid=%d  16进制tid=%X 16进制pid=%X\r\n", tid, pid, tid, pid);// 获取 进程 权限 句柄// 通过pid获取进程句柄,同时要指定渴望得到的访问权限HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); // PROCESS_VM_READprintf("进程句柄=%p \r\n", 进程句柄);unsigned int 返回值 = 0;//跨进程读取目标进程指定地址处的4字节数据//ReadProcessMemory(进程句柄, (LPCVOID)0x0000000077B2C934/*要读取的地址*/, &返回值/*存放数据的地址*/, 4, 0);ReadProcessMemory(进程句柄, reinterpret_cast<LPCVOID>(0x77B2C934)/*要读取的地址*/, &返回值/*存放数据的地址*/, 4, 0);printf("返回值=%X 返回值=%d 返回值=%u\r\n", 返回值, 返回值, 返回值);// GetLastError();
}

在这里插入图片描述

封接读内存接口函数 int R4(void* 地址)

通过接口函数读取基址偏移公式里的数据。

在这里插入图片描述

DWORD R4(UINT_PTR 内存地址)
{ HWND 窗口句柄 = FindWindowA("MainWindow", "植物大战僵尸中文版"); DWORD pid = 0, tid = 0;  tid = GetWindowThreadProcessId(窗口句柄, &pid);HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);	// PROCESS_VM_READDWORD 返回值 = 0;ReadProcessMemory(进程句柄, (LPCVOID)内存地址/*要读取的地址*/, &返回值/*存放数据的地址*/, 4, 0);return 返回值;
}

跨进程向目标进程内存地址写入数值 WriteProcessMemory

在这里插入图片描述

#include <iostream>
#include<Windows.h>HWND 获取游戏窗口句柄()
{return FindWindowA("MainWindow", "植物大战僵尸中文版");
}//unsigned
DWORD R4(UINT_PTR 内存地址)
{HWND 窗口句柄 = 获取游戏窗口句柄();	//FindWindowA("MainWindow", "植物大战僵尸中文版");DWORD pid = 0, tid = 0;tid = GetWindowThreadProcessId(窗口句柄, &pid);HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);DWORD 返回值 = 0;ReadProcessMemory(进程句柄, (LPCVOID)内存地址/*要读取的地址*/, &返回值/*存放数据的地址*/, 4, nullptr);CloseHandle(进程句柄);//释放掉句柄资源return 返回值;
}//写入成功 W4返回 非0的数值
//写入失败 W4返回 0
int W4(UINT_PTR 内存地址/*要写入目标进程的内存地址*/, DWORD 要写入的值)
{HWND 窗口句柄 = 获取游戏窗口句柄();	//FindWindowA("MainWindow", "植物大战僵尸中文版");DWORD pid = 0, tid = 0;tid = GetWindowThreadProcessId(窗口句柄, &pid); HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);unsigned int 返回值 = WriteProcessMemory(进程句柄, (LPCVOID)内存地址/*要写的目标进程地址*/, &要写入的值/*存放待写入数据的地址*/, 4, nullptr);CloseHandle(进程句柄);//释放掉句柄资源return 返回值;
}int main()
{//[[6A9EC0]+768]+5560 =14F2A3D8// [[[6A9EC0]+768]+5560]=75int 阳光 = R4(R4(R4(0x6A9EC0) + 0x768) + 0x5560);UINT_PTR 阳光地址 = R4(R4(0x6A9EC0) + 0x768) + 0x5560;printf("阳光=%d\r\n", 阳光);printf("阳光地址=%X\r\n", 阳光地址);W4(阳光地址, 567);getchar();//等待键盘输入
}int main_0()
{//[[6A9EC0]+768]+5560 =14F2A3D8// [[[6A9EC0]+768]+5560]=75int 阳光 = R4(R4(R4(0x6A9EC0) + 0x768) + 0x5560);UINT_PTR 阳光地址 = R4(R4(0x6A9EC0) + 0x768) + 0x5560;printf("阳光=%d\r\n", 阳光);printf("阳光地址=%X\r\n", 阳光地址);HWND 窗口句柄 = 获取游戏窗口句柄();	//FindWindowA("MainWindow", "植物大战僵尸中文版");DWORD pid = 0, tid = 0;tid = GetWindowThreadProcessId(窗口句柄, &pid);HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);int 新阳光的值 = 66666;WriteProcessMemory(进程句柄, (LPVOID)阳光地址, &新阳光的值, 4, nullptr);CloseHandle(进程句柄);//释放掉句柄资源getchar();//等待键盘输入
}

C,C++32位和64位进程内存数据读写函数接口、通过头文件进行项目管理

在这里插入图片描述

// 内存读写.h
#pragma once
#include <iostream>
#include<Windows.h>HWND 获取游戏窗口句柄();
DWORD R4(UINT_PTR 内存地址/*从这个地址开始读取4字节*/);
int W4(UINT_PTR 内存地址/*从这个地址开始写入4字节*/, DWORD 要写入的值);
// 内存读写.cpp
#include "内存读写.h"HWND 获取游戏窗口句柄()
{return FindWindowA("MainWindow", "植物大战僵尸中文版");
}// 读取4字节数据
DWORD R4(UINT_PTR 内存地址)
{HWND 窗口句柄 = 获取游戏窗口句柄();	//FindWindowA("MainWindow", "植物大战僵尸中文版");DWORD pid = 0, tid = 0;tid = GetWindowThreadProcessId(窗口句柄, &pid);HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);DWORD 返回值 = 0;ReadProcessMemory(进程句柄, (LPCVOID)内存地址/*要读取的地址*/, &返回值/*存放数据的地址*/, 4, nullptr);CloseHandle(进程句柄);//释放掉句柄资源return 返回值;
}//写入成功 W4返回 非0的数值
//写入失败 W4返回 0
int W4(UINT_PTR 内存地址/*要写入目标进程的内存地址*/, DWORD 要写入的值)
{HWND 窗口句柄 = 获取游戏窗口句柄();	//FindWindowA("MainWindow", "植物大战僵尸中文版");DWORD pid = 0, tid = 0;tid = GetWindowThreadProcessId(窗口句柄, &pid); HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);unsigned int 返回值 = WriteProcessMemory(进程句柄, (LPCVOID)内存地址/*要写的目标进程地址*/, &要写入的值/*存放待写入数据的地址*/, 4, nullptr);CloseHandle(进程句柄);//释放掉句柄资源return 返回值;
}
// main程序入口点.cpp
#include "内存读写.h"//[[6A9EC0]+768]+5560 =14F2A3D8// [[[6A9EC0]+768]+5560]=75int 阳光 = R4(R4(R4(0x6A9EC0) + 0x768) + 0x5560);UINT_PTR 阳光地址 = R4(R4(0x6A9EC0) + 0x768) + 0x5560;printf("阳光=%d\r\n", 阳光);printf("阳光地址=%X\r\n", 阳光地址);DWORD 新的阳光值 = 5567;W4(阳光地址, 新的阳光值);getchar();//等待键盘输入

X64环境masm汇编asm文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当我们在x32dbg调试器中找不到main入口点的时候,可以通过在main函数主体最开始位置那里,添加MessageBoxA或者MessageBeep函数这种方法来定位入口点:

在这里插入图片描述

在这里插入图片描述

如上图所示,通过跳转到MessageBoxA函数这里并下断点,运行到这里断下后,在右下角栈那里可以看到_main返回地址。

在我们自己编写代码调试测试的时候,最好把随机基址给禁用掉,这样就可以变成固定地址,方便我们测试:

在这里插入图片描述

  call指令77256C78 | E8 EF02FBFF    | call ntdll.77206F6C       EIP=77206F6Cpush 77256C78+5 //esp=esp-4	//64 rsp=rsp-8ret指令77256CAF | C3             | ret    跳转到 [esp]esp=esp+4  //64 rsp=rsp+8

常见的六种参数调用约定传递与平栈

在这里插入图片描述

x86环境

#include<iostream>//VS环境默认的调用约定
//add esp,参数数量*4
//add rsp,参数数量*8
int _cdecl call_cdecl(int a, int b)
{return a + b;
}//ret 参数数量*4  //x86   //ret 8
//ret 参数数量*8  //x64   //ret 10
int _stdcall call_std(int a, int b)
{return a + b;
}
//快速
int _fastcall call_fast(int a, int b)
{return a + b;
}
// thiscall 类成员函数独有
/*
int __thiscall call_vector(int a, int b)
{return a + b;
}
*/
// __vectorcall (/ Gv)
int __vectorcall call_vector(int a, int b)
{return a + b;
}//int __clrcall test()
//{
//	return 1;
//}int abc(int a, int b, int c)
{printf("技能释放 a=%d,b=%d c=%d\r\n", a, b, c);return a + b + c;
}
int main()
{int a = 333;int b = 123;printf(" call_cdecl()=%X行号=%d\r\n",  call_cdecl(0x11A, 0xA11), __LINE__);printf(" call_std()=%X行号=%d\r\n",    call_std(0x11B, 0xB11), __LINE__);printf(" call_fast()=%X行号=%d\r\n",   call_fast(0x11C, 0xC11), __LINE__);printf(" call_vector()=%X行号=%d\r\n", call_vector(0x11D, 0xD11), __LINE__);printf(" 释放技能 abc=%d\r\n", abc(0x123, 2, 6));getchar();return 1;
}

在这里插入图片描述

在这里插入图片描述

可以按冒号给函数添加标签,按分号添加注释。

在这里插入图片描述

在x86环境下,_fastcall调用约定,传递参数:ecx参数1、edx参数2、剩下的参数通过堆栈(push)来传递,并在函数内进行平栈(ret n)。

在这里插入图片描述

在x86环境下,_vectorcall调用约定,传递参数:ecx参数1、edx参数2、剩下的参数通过堆栈(push)来传递,也是在函数内进行平栈(ret 数值)。
由于现在传的参数都是整数,所以_fastcall和_vectorcall我们通过反汇编看到参数传递、堆栈平衡都一样;其实它们是有区别的,区别应该就在于参数是浮点数的情况下。

在x86环境下,_cdecl和_stacall调用约定,全部是用push传递参数。

x64环境

#include<iostream>//VS环境默认的调用约定
//add esp,参数数量*4
//add rsp,参数数量*8
int _cdecl call_cdecl(int a, int b,int a3,int a4,int a5,int a6)
{return a + b+a3+a4+a5+a6;
}//ret 参数数量*4  //x86   //ret 8
//ret 参数数量*8  //x64   //ret 10
int _stdcall call_std(int a, int b, int a3, int a4, int a5, int a6)
{return a + b + a3 + a4 + a5 + a6;
}
//快速
int _fastcall call_fast(int a, int b, int a3, int a4, int a5, int a6)
{return a + b + a3 + a4 + a5 + a6;
}
// thiscall 类成员函数独有
/*
int __thiscall call_vector(int a, int b)
{return a + b;
}
*/
// __vectorcall (/ Gv)
int __vectorcall call_vector(int a, int b, int a3, int a4, int a5, int a6)
{return a + b + a3 + a4 + a5 + a6;
}//int __clrcall test()
//{
//	return 1;
//}int abc(int a, int b, int c)
{printf("技能释放 a=%d,b=%d c=%d\r\n", a, b, c);return a + b + c;
}
int main()
{int a = 333;int b = 123;printf(" call_cdecl()=%X行号=%d\r\n", call_cdecl(0x11A, 0xA11,3,4,5,6), __LINE__);printf(" call_std()=%X行号=%d\r\n", call_std(0x11B, 0xB11,3,4,5,6), __LINE__);printf(" call_fast()=%X行号=%d\r\n", call_fast(0x11C, 0xC11,3,4,5,6), __LINE__);printf(" call_vector()=%X行号=%d\r\n", call_vector(0x11D, 0xD11,3,4,5,6), __LINE__);printf(" 释放技能 abc=%d\r\n", abc(0x123, 2, 6));getchar();return 1;
}

在x64dbg调试器中,转到main函数的话,ctrl+G,输入main确定即可,main前面不需要加下划线(x86)。

在这里插入图片描述

在x64环境下,_cdecl、_stacall和_fastcall、_vectorcall这4种调用约定,我们发现都一样,都是用rcx、rdx、r8、r9来传递参数,超出4个的参数用堆栈(rsp+20)来传递。

我们看到第5个参数是rsp+20,前4个参数占0x20大小的空间,但是在x64环境下,前4个参数分别通过rcx、rdx、r8、r9来传递,为了对齐(也是为了兼容x86汇编),第5个参数通过rsp+20来传递,第6个参数通过rsp+28来传递;
而且在函数内部最后一条指令就是一条ret,后面不跟数值。

经过测试我们发现,在x64环境下,这4种调用约定是没有区别的,参数传递和平栈方式都是相同的,所以暂时可以认为这4种调用约定是相同的。

在这里插入图片描述

由于call该函数的指令执行后,rsp=rsp-8,所以上图mov ss:[rsp+20],r9d并没有覆盖call指令执行前的第5个参数,mov ss:[rsp+20],r9d对于call指令执行前的环境来说,相当于mov ss:[rsp+18],r9d,即第4个参数给了ss:[rsp+18],在函数里面的这种堆栈传参方式也是为了兼容x86汇编。
即堆栈变化示意图如下:

在这里插入图片描述

在这里插入图片描述

x64寄存器低4字节低2字节低1字节
rcxecxcxcl
rdxedxdxdl
r8r8dr8wr8b
r9r9dr9wr9b

再看一个函数,堆栈变化同理:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以针对所有配置、所有平台进行设置:

在这里插入图片描述

汇编条件转移指令与循环

在这里插入图片描述

在这里插入图片描述

int main_while01()
{/* 局部变量定义 */int a = 10;/* while 循环执行 */// SF(符号标志位)// OF(溢出标志位)//cmp a-20 从而影响到 符号标志位while (a < 20) // SF=OF  {printf("a 的值: %d  行号=%d \n", a, __LINE__);a++; //a=a+1; add [esp+??],1// inc [esp+??]}return 0;
}int main()
{printf("main start 行号=%d \n", __LINE__);main_while01();printf("main end   行号=%d \n", __LINE__);return 1;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们看到上图OF不等于SF,SF为1,这是有符号跳转指令JL的条件,所以jge条件不成立,不跳转,进入循环。
(汇编指令cmp就是做了一个减法操作,即a - 20,从而影响到符号标志位SF)

在这里插入图片描述

如上图所示,当ss:[ebp-8]等于14的时候,执行cmp指令,可以看到ZF等于1,OF等于SF都为0:

在这里插入图片描述

当OF等于0,SF等于0,即OF==SF,那么有符号跳转指令jge跳转条件成立,循环终止。

减法的话对SF和ZF标志位有影响;
加法的话对CF和OF标志位有影响。

我们再来看看包含continue语句的while循环代码:

int main_continue()
{/* 局部变量定义 */int a = 0;/* while 循环执行 */while (a < 10) //0x0A=10{a++;if (a == 5){/* 使用 continue 进入下一次循环 */continue;}printf("for循环测试:a 的值: %d 行号=%d \n", a, __LINE__);}return 0;
}int main()
{printf("main start 行号=%d \n", __LINE__);main_continue();printf("main end   行号=%d \n", __LINE__);return 1;
}

在这里插入图片描述

我们从上图可以看到,判断小于的话用jge指令,判断等于的话用jne指令。

C,C++用代码,跨进程调用CALL

用代码注入器调用CALL

#include <iostream>
#include <Windows.h>
int call00()
{printf("call00 无参数 call0_test  行号=%d\r\n",  __LINE__);return 0x123;
}int call01(int a)
{printf("call01 参数1=%d   行号=%d\r\n", a,  __LINE__);return a + 2;
}int call02(int a, int b)
{printf("call02 参数1=%d 参数2=%d 行号=%d\r\n", a, b,__LINE__);return a + b+3;
}int main()
{
//	MessageBoxA(0, 0, 0, 0);//ctrl+G 转到 MessageBoxA 下断printf("MessageBoxA=%p 行号=%d \r\n", MessageBoxA, __LINE__);int 计数 = 1;while (1){printf("call00=%p call01=%p,call02=%p \n", call00, call01, call02);getchar();printf("计数=%d,行号=%d \r\n", 计数++, __LINE__);}return 1;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意,x64dbg标题栏上的线程号5236是十进制的,左下角的1474是十六进制的,这两个数是一样的。

C,C++创建远程线程调用CALL

  • 远程调用CALL的流程
    1. 用spy++获取目标窗口句柄,FindWindow
    2. 有了窗口句柄的情况 用GetWindowThreadProcessID获取目标进程PID
    3. 通过OpenProcess获取目标进程的线程创建权限 获取相应的句柄
    4. 用CreateRemoteThread调用远程的CALL
#include <iostream>
#include<Windows.h>
//unsigned
//int R4(UINT_PTR 内存地址)
//{
//	HWND 窗口句柄 = FindWindowA("MainWindow", "植物大战僵尸中文版");
//	DWORD pid = 0, tid = 0;
//	tid = GetWindowThreadProcessId(窗口句柄, &pid); // a&b 
//	HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);//HWND
//	unsigned int 返回值 = 0;
//	ReadProcessMemory(进程句柄, (LPCVOID)内存地址/*要读取的地址*/, &返回值/*存放数据的地址*/, 4, 0);
//	return 返回值;
//}// \n
// \ \\
// 窗口标题= "C:\\Users\\Administrator\\source\\repos\\A001\\Debug\\A023_测试CALL.exe"
//#define 窗口标题 "C:/moshou/A001-游戏辅助技术(初级班)/代码\A001-024/Debug"
//#define 窗口标题 "C:\moshou\A001-游戏辅助技术(初级班)\代码\A001-024\Debug"
#define 窗口标题 R"(C:\moshou\A001-游戏辅助技术(初级班)\代码\A001-024\Debug\A023_测试CALL.exe)"DWORD 获取PID()
{HWND 窗口句柄 = FindWindowA(0, 窗口标题);DWORD pid = 0, tid = 0;tid = GetWindowThreadProcessId(窗口句柄, &pid); // a&b return pid;
}void 调用call01测试()
{DWORD pid = 4180; //直接在任务管理器里 取得PIDHANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);//HWND//1,4,5 重视这3个参数CreateRemoteThread(进程句柄,//10, //20, //3(LPTHREAD_START_ROUTINE)0x411370,//4 CALL地址(LPVOID)123,//5 CALL的参数0,0);
}void 调用call01测试2(int 参数1)
{DWORD pid = 4180;//任务管理器取的pidHANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);//HWND//1,4,5 重视这3个参数CreateRemoteThread(进程句柄,//10, //20, //3(LPTHREAD_START_ROUTINE)0x411370,//4 CALL地址(LPVOID)参数1,//5 CALL的参数0,0);CloseHandle(进程句柄);
}void 调用call01测试3(int 参数1)
{DWORD pid = 获取PID();//任务管理器取的pidprintf("pid=%d \r\n", pid);HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);//HWND//1,4,5 重视这3个参数CreateRemoteThread(进程句柄,//10, //20, //3(LPTHREAD_START_ROUTINE)0x4113CA,//4 call01地址(LPVOID)参数1,//5 CALL的参数0,0);CloseHandle(进程句柄);
}int main()
{调用call01测试3(12666);调用call01测试3(12667);调用call01测试3(12668);//R忽略 转义字符char test[]= R"(C:\Users\Administrator\source\repos\A001\Debug\A023_测试CALL.exe)";//char test2[] = "C:\Users\Administrator\source\repos\A001\Debug\A023_测试CALL.exe";printf("%s\r\n",test);std::cout << "Hello World!\n";
}

常用软件游戏

在这里插入图片描述

这个代码注入器只能用于32位程序的测试,64位进程能用的这类代码注入工具目前还没有发现免费的,我们只能自己写代码来注入。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

免签名加载驱动:
https://github.com/TheCruZ/kdmapper

win10过签名:
https://github.com/HyperSine/Windows10-CustomKernelSigners

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
vs平台工具集如果装了Inter C++ Compiler编译器的话,Intel的编译器是支持__asm int 3这些内联汇编的:

在这里插入图片描述

定位特征码

在这里插入图片描述
编辑好特征码之后,移动到函数开头、或者更上面一些,Ctrl+B打开输入要查找的二进制字串对话框,粘贴特征码搜索,能找到的话说明我们编写的特征码没问题;
还应该重启游戏,打开OD附加游戏,按照上面所述搜索特征码进行验证。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

PE查看分析工具

PE查看器(PE_Study) https://www.cr173.com/soft/47081.html
PE文件查看器(PETool) https://www.cr173.com/soft/89855.html
逆缘PE文件提取 https://www.cr173.com/soft/85171.html

PE分析工具(PE_Hacker) https://www.cr173.com/soft/1438600.html
https://blog.csdn.net/PE_Hacker/article/details/115766034

PE-Analysis:

在这里插入图片描述

驱动开发调试工具 DriverTool

驱动开发调试工具,比如测试模式下的数字签名Windows 64Signer V1.2,又比如DebugView等一些工具。

在这里插入图片描述

/

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】递枕头

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;模拟方法二&#xff1a; O ( 1 ) O(1) O(1) 解法 写在最后 Tag 【模拟】【 O ( 1 ) O(1) O(1) 公式】【2023-09-26】 题目来源 2582. 递枕头 题目解读 编号从 1 到 n 的 n 个人站成一排传递枕头。最初&#xff0c;排…

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好&#xff0c;复试分数90.24&#xff0c;电科学硕分数线84、信通83、专硕电子与信息74. 面试流程&#xff1a; 1&#xff1a;5min ppt的介绍。其中前2min用英语简要介绍基本信息&#xff0c;后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…

出现 conda虚拟环境默认放在C盘 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 方法一3.2 方法二1. 问题所示 通过conda配置虚拟环境的时候,由于安装在D盘下,但是配置的环境默认都给我放C盘 通过如下命令:conda env list,最后查看该环境的确在C盘下 2. 原理分析 究其根本原因,这是因为默认路径没有足够的…

编程每日一练(多语言实现):判断偶数

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现 一、实例描述 利用单条件单分支选择语句判断输入的一个整数 是否是偶数。 运行程序&#xff0c;输入一个 整数18&#xff0c; 然后按回车键&#xff0c;将提示该数字是偶数…

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相…

Android ConstraintLayout app:layout_constraintHorizontal_weight

Android ConstraintLayout app:layout_constraintHorizontal_weight <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:…

【已解决】qt死活不响应鼠标移动到按钮事件

本博文源于笔者正在研究的内容&#xff0c;这个问题大概捣鼓了一个下午&#xff0c;问题是这样子&#xff1a;我有一个按钮&#xff0c;我应用程序运行时&#xff0c;我鼠标放到按钮上&#xff0c;按钮就会被填充图标。怀揣着这样一个想法&#xff0c;我搜啊搜&#xff0c;整啊…

verilog学习笔记(1)module实例化2

移位寄存器多路选择器 我的代码&#xff1a; module top_module ( input clk, input [7:0] d, input [1:0] sel, output [7:0] q );wire [7:0] w1;wire [7:0] w2;wire [7:0] w3;my_dff8 my_dff8_1(.clk(clk),.d(d),.q(w1));my_dff8 my_dff8_2(.clk(clk),.d(w1),.q(w2));my_d…

前端知识总结

在前端开发中&#xff0c;y x是一种常见的自增运算符的使用方式。它表示将变量x的值自增1&#xff0c;并将自增后的值赋给变量y。 具体来说&#xff0c;x是一种后缀自增运算符&#xff0c;表示将变量x的值自增1。而y x则是将自增前的值赋给变量y。这意味着在执行y x之后&am…

【MySQL】表的约束

文章目录 1. 表的约束概述2. 空属性 not null3. 默认值 default4. 列描述 comment5. zerofill6. 主键 primary key7. 自增长 auto_increment8. 唯一键 unique9. 外键 foreign key 1. 表的约束概述 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要…

基于微信小程序的英语互助小程序设计与实现(亮点:小组制打卡、模拟考试答题、错题本、学习论坛)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

什么是 AirServer?Mac专用投屏工具AirServer 7 .27 for Mac中文破解版百度网盘下载

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具&#xff0c;能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App&#xff0c;从 iOS 设备无线传送到 Mac 电脑的屏幕上&#xff0c;把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…

从零开始—【Mac系统】MacOS配置Java环境变量

系统环境说明 Apple M1 macOS Ventura 版本13.5.2 1.下载JDK安装包 Oracle官网下载地址 JDK下载【注&#xff1a;推荐下载JDK8 Oracle官网JDK8下载】 关于JDK、JRE、JVM的关系说明 JDK(Java Development Kit&#xff0c;Java开发工具包) &#xff0c;是整个JAVA的核心&#…

ctfshow web入门(21-28爆破)

web21 抓包 进行了base64加密&#xff0c;解码后发现账号和密码格式是 账号:密码 爆破 位置一开始选错了&#xff0c;应该是不含Basic的 模式选择custom iterator(自定义迭代器) 自定义迭代器可以自定义拼接方式 分别设置三个位置&#xff0c;第一个位置为admin 第二个位置…

RHCE---Linux的计划任务

文章目录 目录 文章目录 前言 一.单一执行的例行性工作 at 命令 二.循环执行的例行性工作 crontab 命令 课后作业&#xff1a; 思维导图 前言 如果想要让自己设计的备份程序可以自动地在系统下面运行&#xff0c;而不需要手动来启动它&#xff0c;这是该如何处理&#xff1f…

威胁追踪如何增强您的网络安全态势

网络威胁的复杂性、频率和影响正在加剧。2022 年&#xff0c;勒索软件攻击达到2.361 亿次&#xff0c;其中 39% 的英国企业遭受网络攻击。 这些攻击需要工具和资源来识别和纠正漏洞&#xff0c;以在云环境中维护强大的安全框架&#xff0c;从而降低数据泄露和合规违规的风险。…

asp.net core automapper的使用

1.安装automapper的nuget包 AutoMapper.Extensions.Microsoft.DependencyInjection 2.创建需要映射的类和转换后的类 public class studto{public int sn { get; set; }public string name { get; set; }public string sex { get; set; }public int age { get; set; }public s…

mac 配置 httpd nginx php-fpm 详细记录 已解决

在日常mac电脑 开发php项目一直是 httpd 方式 运行&#xff0c;由于有 多版本 运行的需求&#xff0c;docker不想用&#xff0c;索性用 php-fpm进行 功能处理。上次配置 是好的&#xff0c;但是感觉马马虎虎&#xff0c;这次 配置底朝天。因为配置服务器&#xff0c;几乎也都是…

List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

系列文章目录 SpringBootVue3实现登录验证码功能 Java实现发送邮件&#xff08;定时自动发送邮件&#xff09; 换个角度使用Redis去解决跨域存取Session问题 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 更多该系列文章请查看我的主页哦 文章目录…

游戏技术亮点|Aavegotchi 与 GameSwift 建立合作伙伴关系

构建一个优秀的游戏只是成功发布的一部分&#xff0c;让数百万玩家体验这款游戏才是真正的乐趣所在。 这也是为什么我们很高兴宣布与 GameSwift 建立了新的合作伙伴关系&#xff0c;GameSwift 是一款先进的模块化游戏区块链&#xff0c;采用 zkEVM 技术构建&#xff0c;是全球…