Rindro-Plugins/Include/Hook.hpp

2162 lines
58 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <cwchar>
#include "MinHook.h"
#include "inlinehook.h"
#include "RegisterSquirrel.hpp"
#include "IO_Ex.hpp"
//游戏初始化完毕Flag
static bool InitGameFlag = false;
//宽屏百级UI
static bool Yosin百级UIFlag = false;
//StringBin文件缓存
extern std::vector<std::string> StringBin;
//脚本是否请求到的Flag
extern bool jiaoben;
//脚本文件数组
extern std::vector<std::string> BaseData;
struct BufState {
const wchar_t* buf;
int ptr;
int size;
};
//加载脚本的逻辑
int Sq_mycompilebuffer(HSQUIRRELVM v, const wchar_t* s, int size, const wchar_t* filename, BOOL printerror) {
BufState buf;
buf.buf = s;
buf.size = size;
buf.ptr = 0;
return SQ_Compile(v, (LSQLEXREADFUNC)0x1359AD0, &buf, filename, printerror);
}
void Suxn() {
size_t Ds = BaseData.size();
for (size_t i = 0; i < Ds; i++)
{
std::string filenamebuf = "BaseData" + std::to_string(i);
std::string strbuf = BaseData[i];
wchar_t* filename = DNFTOOL::charTowchar_t((char*)filenamebuf.c_str());
wchar_t* str = DNFTOOL::charTowchar_t((char*)strbuf.c_str());
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
#ifdef SELL
//std::cout << strbuf << std::endl;
if (Sq_mycompilebuffer(v, str, wcslen(str), L"interactive console", false) >= 0) {
Sq_pushroottable(v);
Sq_call(v, 1, SQFalse, SQTrue);
Sq_pop(v, 1);
//std::cout << "加载了: " << strbuf.substr(0, 100) << std::endl;
}
#else
if (Sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) {
Sq_pushroottable(v);
Sq_call(v, 1, SQFalse, SQTrue);
Sq_pop(v, 1);
}
#endif // SELL
Sq_settop(v, Top);
delete[] filename;
delete[] str;
}
BaseData.clear();
jiaoben = false;
}
typedef struct REG
{
DWORD EAX;
DWORD EBX;
DWORD ECX;
DWORD EDX;
DWORD ESI;
DWORD EDI;
DWORD ESP;
DWORD EBP;
DWORD VmAddress;
BYTE Cl;
} REG;
REG PlayerEach = { 0 };
void __declspec(naked)PlayerEach2() {
static int address = 0x11B34E0;
static int address1 = 0x001004B59;
_asm
{
pushad
pushfd
mov PlayerEach.ECX, ecx
mov PlayerEach.EDI, edi
}
if (PlayerEach.EDI == 2) {
PlayerEach.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_PlayerEachPos", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, *(int*)(PlayerEach.ECX + 0x14));
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, *(int*)(PlayerEach.ECX + 0x18));
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 3, 0, 1);
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, PlayerEach.VmAddress);
}
_asm {
popfd
popad
call address
test al, al
jmp address1
}
}
REG MouseAsm = { 0 };
void __declspec(naked)MouseWheelUp() {
static int address = 0x11BDE12;
static int address1 = 0x0011BDEEE;
static int address2 = 0x0011BDEDF;
static int address3 = 0x0011BDECE;
_asm
{
pushad
pushfd
mov MouseAsm.EDI, edi
mov MouseAsm.ECX, ecx
}
if ((int)*(BYTE*)0x1B46886 == 0) {
_asm {
popfd
popad
jmp address
}
}
else {
if (MouseAsm.EDI == 0x20A) {
if (MouseAsm.ECX == 0x780000) {
_asm {
popfd
popad
jmp address3
}
}
else {
_asm {
popfd
popad
jmp address2
}
}
}
else {
_asm {
popfd
popad
jmp address1
}
}
}
}
REG DrawWindow_BAsm = { 0 };
void __declspec(naked)DrawWindow_B_Hook() {
static int address = 0xFFDA10;
static int address1 = 0x66BEA1;
_asm
{
pushad
pushfd
}
if (InitGameFlag)
{
DrawWindow_BAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_DrawWindow_B", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 1, 0, 1);
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DrawWindow_BAsm.VmAddress);
}
_asm {
popfd
popad
mov ecx, eax
call address
jmp address1
}
}
REG BuffIconHookAsm = { 0 };
void __declspec(naked)BuffIcon_Hook() {
static int address = 0x4C8C1D;
static int address2 = 0x4C8C5B;
_asm
{
pushad
pushfd
}
_asm {
popfd
popad
add esi,0x88
sub edi,eax
mov BuffIconHookAsm.Cl, cl
pushad
pushfd
}
if (BuffIconHookAsm.Cl == 1) {
_asm {
popfd
popad
jmp address
}
}
else {
_asm {
popfd
popad
jmp address2
}
}
}
REG BuffIconHookBAsm = { 0 };
void __declspec(naked)BuffIcon_Hook_B() {
static int address = 0x4BF566;
//static int address2 = 0x4C8C5B;
_asm
{
pushad
pushfd
}
_asm {
popfd
popad
sub edi,eax
add esi, 0x88
mov [ebp-40],esi
jmp address
}
}
void __declspec(naked)HudBloodBackground() {
static int address = 0x4CA03D;
_asm
{
pushad
pushfd
}
if (InitGameFlag)
{
DrawWindow_BAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_HUD_BloodBackground", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 1, 0, 1);
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DrawWindow_BAsm.VmAddress);
}
_asm {
popfd
popad
mov ecx,[esi+0xa94]
push 0
jmp address
}
}
REG Damage_HookAsm = { 0 };
void __declspec(naked)Damage_Hook() {
static int address = 0xE5A2E5;
_asm
{
pushad
pushfd
mov Damage_HookAsm.EDI, edi
mov Damage_HookAsm.EBX, ebx
mov Damage_HookAsm.EBP, ebp
}
Damage_HookAsm.EAX = *(int*)0x1AB7CDC;
if (InitGameFlag)
{
int Address = Damage_HookAsm.EBX;//只要等于 read 或者 等于0 就说明是我自己的伤害
int Damage = *(DWORD*)(Damage_HookAsm.EBP - 0x17c);
Damage_HookAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_PushDamageData", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Address);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Damage_HookAsm.EAX);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Damage);
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 4, 0, 1);
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, Damage_HookAsm.VmAddress);
Damage_HookAsm.EBX = 0;
Damage_HookAsm.EBP = 0;
}
_asm {
popfd
popad
mov eax, Damage_HookAsm.EAX
xor ecx,ecx
jmp address
}
}
typedef struct REG1
{
DWORD EAX;
DWORD EBX;
DWORD ECX;
DWORD EDX;
DWORD ESI;
DWORD EDI;
DWORD ESP;
DWORD EBP;
DWORD VmAddress;
BYTE Cl;
SQBool flag;
int vm_data1;
} REG1;
REG1 DiscardItem_HookAsm = { 0 };
void __declspec(naked)DiscardItem_Hook() {
static int address = 0xE71EAB;
static int func = 0xE6E070;
_asm
{
pushad
pushfd
mov DiscardItem_HookAsm.ESI, esi
mov DiscardItem_HookAsm.EBX, ebx
}
if (InitGameFlag)
{
DiscardItem_HookAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_DiscardItem", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, DiscardItem_HookAsm.ESI);
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 2, 1, 1);
Sq_getbool(*(HSQUIRRELVM*)0x1AF3544, -1, &DiscardItem_HookAsm.flag);
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DiscardItem_HookAsm.VmAddress);
if (!DiscardItem_HookAsm.flag) {
_asm {
popfd
popad
mov eax,0
jmp address
}
}
}
_asm {
popfd
popad
push 1
push DiscardItem_HookAsm.ESI
push 0xFB
mov ecx, DiscardItem_HookAsm.EBX
call func
jmp address
}
}
REG1 DiscardItem_HookBAsm = { 0 };
void __declspec(naked)DiscardItemB_Hook() {
static int address = 0xE71E95;
static int func = 0x10086C0;
_asm
{
pushad
pushfd
mov DiscardItem_HookBAsm.EAX, eax
mov DiscardItem_HookBAsm.ESI, esi
mov DiscardItem_HookBAsm.ECX, ecx
}
if (InitGameFlag)
{
DiscardItem_HookBAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_DiscardItem", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, DiscardItem_HookBAsm.ESI);
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 2, 1, 1);
Sq_getbool(*(HSQUIRRELVM*)0x1AF3544, -1, &DiscardItem_HookBAsm.flag);
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DiscardItem_HookBAsm.VmAddress);
if (!DiscardItem_HookBAsm.flag) {
_asm {
popfd
popad
mov eax, 0
jmp address
}
}
}
_asm {
popfd
popad
push 0
push 0
push 0
push 0x1C
push DiscardItem_HookBAsm.EAX
push 0
push 0
call func
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook() {
static int address = 0x10F79D1;
_asm
{
imul edx,edx,0x7a
xor eax, eax
add edx, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook1() {
static int address = 0x10F7B4B;
_asm
{
imul eax, eax, 0x7a
xor edx, edx
add eax, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook2() {
static int address = 0x10F7F91;
_asm
{
imul ecx, ecx, 0x7a
add ecx, 0xA1
xor edx, edx
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook3() {
static int address = 0x10F8319;
_asm
{
imul edx, edx, 0x7a
xor eax, eax
add edx, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook4() {
static int address = 0x10F843E;
_asm
{
imul eax, eax, 0x7a
xor ecx, ecx
add eax, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook5() {
static int address = 0x10F85F2;
_asm
{
imul eax, eax, 0x7a
xor ecx, ecx
add eax, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook6() {
static int address = 0x10F2C74;
_asm
{
imul eax, eax, 0x7a
add eax, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
void __declspec(naked)SelectCharacter_Hook7() {
static int address = 0x10F3480;
_asm
{
imul eax, eax, 0x7a
xor edx, edx
add eax, 0xA1
pushad
pushfd
}
_asm {
popfd
popad
jmp address
}
}
REG ReadStringBin_HookAsm = { 0 };
void InserBinStr(char* src, int size) {
StringBin.push_back(std::string(src, size));
}
void __declspec(naked)ReadStringBin_HookA() {
static int address = 0x119F303;
_asm
{
pushad
pushfd
}
InserBinStr("error str",10);
_asm {
popfd
popad
mov ecx,0xff
lea edi,[ebp - 0x410]
jmp address
}
}
void __declspec(naked)ReadStringBin_HookB() {
static int address = 0x119F2C8;
_asm
{
pushad
pushfd
mov ReadStringBin_HookAsm.EBX, ebx
mov ReadStringBin_HookAsm.ESI, esi
mov ReadStringBin_HookAsm.ECX ,ecx
}
InserBinStr((char*)ReadStringBin_HookAsm.ESI, ReadStringBin_HookAsm.EBX);
_asm {
popfd
popad
mov eax,[ebp + 450]
add eax,ebx
jmp address
}
}
REG1 MonsetrRace_HookAsm = { 0 };
void __declspec(naked)MonsetrRace_Hook() {
static int address = 0x43A8BA;
static int address1 = 0x43A86A;
_asm
{
mov MonsetrRace_HookAsm.EBX, ebx
mov MonsetrRace_HookAsm.EDX, edx
xor ebx, ebx
push edi
mov edi, [ebp + 0x8]
test eax, eax
pushad
pushfd
mov MonsetrRace_HookAsm.ESI, esi
mov MonsetrRace_HookAsm.vm_data1, 34
}
MonsetrRace_HookAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_Rindro_MonsterEXControl_Race", -1);
if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
{
Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, MonsetrRace_HookAsm.ESI);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, MonsetrRace_HookAsm.EBX);
Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, MonsetrRace_HookAsm.EDX);
Sq_call(*(HSQUIRRELVM*)0x1AF3544, 4, 1, 1);
Sq_getinteger(*(HSQUIRRELVM*)0x1AF3544, -1, &MonsetrRace_HookAsm.vm_data1);
}
else {
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, MonsetrRace_HookAsm.VmAddress);
_asm {
popfd
popad
jmp address1
}
}
Sq_settop(*(HSQUIRRELVM*)0x1AF3544, MonsetrRace_HookAsm.VmAddress);
_asm {
popfd
popad
mov edi, MonsetrRace_HookAsm.vm_data1
jmp address
}
}
//窗口打开事件Hook
typedef void(__fastcall _OpenWindow)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, DWORD a3);
static _OpenWindow* OldOpenWindow;
void __fastcall NewOpenWindow(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, DWORD a3) {
if (InitGameFlag) {
if (*(DWORD*)0x1A5FB20 == thisc) {
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"L_OpenOldWindowCallBack", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, a1);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
}
OldOpenWindow(thisc, 0, a1, a2, a3);
}
//鼠标事件
typedef void(_11BDC90)(int a1, unsigned int a2, int a3);
static _11BDC90* Old11BDC90;
void New11BDC90(int a1, unsigned int a2, int a3) {
if (InitGameFlag) {
int X = *(int*)0x1B4686C;
int Y = *(int*)0x1B46870;
if ((X | Y) >= 0) {
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"L_MouseCallBack", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, a1);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, X);
Sq_pushinteger(v, Y);
Sq_call(v, 5, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
}
Old11BDC90(a1, a2, a3);
return;
}
//N键大地图
typedef int(_fastcall _1030C30)(int a1, int a2, BYTE* a3);
static _1030C30* Old1030C30;
int _fastcall New1030C30(int a1, int a2, BYTE* a3)
{
int ret = Old1030C30(a1, a2, a3);
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_DrawMiniMapUI", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, 111);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
return ret;
}
//官方的组合NutHook
typedef int(_fastcall _674030)(wchar_t* thisc, DWORD Seat, wchar_t* a2, int a3);
static _674030* Old674030;
int _fastcall New674030(wchar_t* thisc, DWORD Seat, wchar_t* a2, int a3)
{
int ret = Old674030(thisc, Seat, a2, a3);
return ret;
}
//他人信息Hook
typedef int(_fastcall _FA42D0)(int a1, int seat, int a2, int a3);
static _FA42D0* OldFA42D0;
int _fastcall NewFA42D0(int a1, int seat, int a2, int a3)
{
//OtherPlayerInfoType = a2 + 1;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
SQBool Flag;
Sq_pushroottable(v);
Sq_pushstring(v, L"L_Other_Character_Info_Window", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, *(int*)(a1 + 0xc));
Sq_call(v, 2, SQTrue, SQTrue);
Sq_getbool(v, -1, &Flag);
}
Sq_settop(v, Top);
if (!Flag)return OldFA42D0(a1, seat, a2, a3);
return 0;
}
//伤害字体 HOOK
typedef DWORD(_cdecl _7EEED0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6);
static _7EEED0* Old7EEED0;
DWORD _cdecl New7EEED0(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
SQBool Flag;
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_PushDamageFontData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, a1);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, a3);
Sq_pushinteger(v, a4);
Sq_pushinteger(v, a5);
Sq_pushinteger(v, a6);
Sq_pushinteger(v, Damage_HookAsm.EDI);
Sq_pushinteger(v, Damage_HookAsm.EBX);
Sq_call(v, 9, SQTrue, SQTrue);
Sq_getbool(v, -1, &Flag);
}
Sq_settop(v, Top);
if (Flag) {
return Old7EEED0(a1, a2, a3, a4, a5, a6);
}
return 0;
}
//注册收包
typedef void(__fastcall* init_pack_handler_t)(void* Ecx);
static init_pack_handler_t Lpfn_Init = nullptr;
typedef void(__cdecl* pack_handler_t)(int idx, int err, void*, void*);
typedef void(__cdecl* register_pack_handler_t)(int idx, pack_handler_t handler, int zero);
typedef bool(__cdecl* _Net_Get_Dword)(DWORD*);
static _Net_Get_Dword Net_Get_Dword = reinterpret_cast<_Net_Get_Dword>(0x011AEA60);
typedef bool(__cdecl* _Net_Get_Buffer)(char*, int);
static _Net_Get_Buffer Net_Get_Buffer = reinterpret_cast<_Net_Get_Buffer>(0x011AEA90);
//130号收包
void Pack_Control(int idx, int code, void* p3, void* p4)
{
if (InitGameFlag)
{
DWORD Size;
Net_Get_Dword(&Size);
char* Buffer = new char[Size + 1];
Net_Get_Buffer(Buffer, Size);
Buffer[Size] = '\0';
wchar_t* ss = DNFTOOL::charTowchar_t(Buffer);
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
#if defined(SELL) || defined(EXPRESS)
Sq_pushstring(v, L"Sq_Pack_Control", -1);
#else
Sq_pushstring(v, L"Sq_Pack_ControlLocal", -1);
#endif // SELL
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushstring(v, ss, -1);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
delete[]ss;
}
}
void H_Register_Pack(void* Ecx)
{
Lpfn_Init(Ecx);
auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
Registerfunc(130, Pack_Control, 0);
}
//DrawMain HOOK
typedef DWORD(_fastcall _4C61F0)(DWORD thisc, DWORD Seat);
static _4C61F0* Old4C61F0;
DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat)
{
DWORD Ret = Old4C61F0(thisc, Seat);
if (BaseData.size() > 0 && jiaoben == true && InitGameFlag) {
Suxn();
//注册包控制 (很多煞笔登录器不让开始注册)
auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
Registerfunc(130, Pack_Control, 0);
}
static bool mouseInit = false;
//进入角色调用
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+", 0) == 0) {
if (!InitGameFlag)
{
InitGameFlag = true;
}
}
if (InitGameFlag) {
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
//std::cout << "A: " << Sq_gettop(v) << std::endl;
//Old1359130(v, *(int*)((char*)0x19E364 + (4 * 5)), *(int*)((char*)0x19E364 + (4 * 6)));
//Old1359130(v, *(int*)((char*)0x19E364 + (4 * 2)), *(int*)((char*)0x19E364 + (4 * 3)));
//std::cout << "Q: " << Sq_gettop(v) << std::endl;
Sq_pushroottable(v);
Sq_pushstring(v, L"L_DrawWindow_A", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_call(v, 1, SQFalse, SQTrue);
}
Sq_settop(v, Top);
Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"L_drawMainCustomUI_All", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_call(v, 1, SQFalse, SQTrue);
}
Sq_settop(v, Top);
//std::cout << "H: " << Sq_gettop(v) << std::endl;
}
return Ret;
}
static void InitBin() {
void* buf = malloc(81443744);
int readsize;
typedef bool(_59E3D0)(wchar_t* path, void* buffer, int a3, int* a4);
_59E3D0* SUB_59E3D0 = (_59E3D0*)0x59E3D0;
bool a = SUB_59E3D0(L"stringtable.bin", buf, 81443744, &readsize);
if (a) {
IO_Ex pvf((char*)buf, readsize);
int Count = pvf.GetInt();
int CurrentIndex = 0;
for (int i = 0; i < Count; i++) {
pvf.seek(CurrentIndex * 4 + 4);
int StartPos = pvf.GetInt();
int EndPos = pvf.GetInt();
int Len = EndPos - StartPos;
pvf.seek(StartPos + 4);
std::string Str = pvf.GetString(Len);
StringBin.push_back(Str);
CurrentIndex++;
}
}
free(buf);
}
void PFunc(HSQUIRRELVM v, const SQChar* s, ...) {
va_list vl;
va_start(vl, s);
// 使用_vsnwprintf正确计算格式化后的宽字符字符串长度
int len = _vsnwprintf(nullptr, 0, s, vl);
va_end(vl);
va_start(vl, s);
// 动态分配足够的内存空间注意长度计算需要考虑宽字符的字节数通常一个宽字符占2字节或更多取决于平台和编码
wchar_t* buffer = new wchar_t[len + 1];
// 将格式化后的宽字符字符串拼接到动态分配的内存中
_vsnwprintf(buffer, len + 1, s, vl);
va_end(vl);
std::wofstream outFile("test.txt", std::ios::out | std::ios::app | std::ios::binary); // 以二进制模式打开文件用于追加写入
if (outFile) {
outFile << buffer << std::endl; // 将宽字符字符串写入文件,并添加换行符
outFile.close(); // 关闭文件流
std::wcout << L"宽字符字符串已成功追加写入文件。" << std::endl;
}
else {
std::wcerr << L"无法打开文件进行追加写入。" << std::endl;
}
std::wcout << buffer << std::endl; // 使用std::wcout输出宽字符字符串
delete[] buffer;
}
//HookNut函数注册
typedef void(__cdecl _Register_Nut)();
static _Register_Nut* Register_Nut_Old;
void __cdecl H_Register_Nut()
{
InitBin();
Register_Nut_Old();
static bool Init = false;
if (!Init) {
Init = true;
//sq_setprintfunc(*(HSQUIRRELVM*)0x1AF3544, PFunc);
R_Register_Nut();
std::string BaseFile = "YosinBaseC";
std::string Base = R"(
FFI_FIRST_ABI <- 0;
FFI_SYSV <- 1;
FFI_STDCALL <- 2;
FFI_THISCALL <- 3;
FFI_FASTCALL <- 4;
FFI_MS_CDECL <- 5;
FFI_PASCAL <- 6;
FFI_REGISTER <- 7;
Lenheart_P_Update <- true;
function Sq_L_Medal (x,y) {}
function Sq_SettingWindowCallBack (x,y) {}
function Sq_BuffSwitchingCallBack (x,y) {}
function Sq_SwitchingCallBack (x,y) {}
function Sq_UpgradeCallBack (x,y) {}
function Sq_RecoveryCallBack (x,y) {}
function Sq_RecoveryTypeSetCallBack (Type) {}
function Sq_DrawMainMaxLayerCustomUI (pack) {}
function Lenheart (VmTop) {}
function Sq_MouseEventCallBack (Lb, Rb, Mb) {}
function Sq_SelectCharacter (Chunk) {}
function Sq_DrawMainTopLayerCustomUI (pack) {}
function Sq_GetExeStr_Event (StrIndex) {return StrIndex;}
function Sq_CreatChr (chunk) {}
function Sq_SendPackType_Event (Type) {}
function Sq_SendPackByte_Event (Parm) {}
function Sq_SendPackWord_Event (Parm) {}
function Sq_SendPackDWord_Event (Parm) {}
function Sq_SendPackChar_Event (Parm) {}
function Sq_SendPack_Event () {}
function Sq_DrawItemBack (Xpos, Ypos, Image) {}
function Sq_DrawItemFront (Xpos, Ypos, Image) {}
function Sq_GetDrawMonBloodSw () {return false;}
function Sq_DrawMonsterBlood (Object, X, Y) {}
function Sq_Set_Inventory_M_Pos (This) {}
function Sq_Get_Ex_IntData (SkillAddress, Idx, objAddress) {return 0;}
function Sq_Get_Ex_SkillCoolTime (SkillAddress, Idx, objAddress) {return 0;}
function Sq_Get_Ex_LevelData (SkillAddress, Idx, objAddress) {return 0;}
function Sq_PlayerEachPos (x, y) {}
function Sq_DrawMainMaxLayerCustomUI (pack) {}
function Sq_PushDamageFontData (ObjAddress, X, Y, Z, Value, Type,A8,A9) { return true;}
function Sq_PushDamageData(ObjAddress, MySelfAddress, Value);
function Sq_Pack_Control (chunk) {}
function Sq_MessageWindowDraw (a,c) {}
function Sq_Get_Event_Pos_X () {return 1;}
function Sq_Get_Event_Pos_Y () {return 1;}
function Sq_L_OtherPlayerInfo (x, y, Type, Value, ImgBuf) {local str = Value.tostring(); local lenght = L_sq_GetStringDrawLength(str); L_sq_DrawImg(ImgBuf, x + 70 - lenght, y + 5); return Value;}
function Sq_DrawMiniMapUI (a) {}
function Sq_CompleteTask(a1,a2,a3){}
function L_drawMainCustomUI_All(){}
function L_MouseCallBack(a, b, c,d) {}
function L_DrawWindow_A() {}
function L_DrawWindow_B() {}
function L_OpenOldWindowCallBack(WindowIndex) {}
function L_Old_Window_Get(WindowObject) {}
function L_Character_Info_Window(WindowObject) { return false;}
function L_Other_Character_Info_Window(WindowObject) {return false;}
function L_Old_Window_Visible(WindowObject,Flag) {}
getroottable().LenheartBaseFuncTab <- {};
getroottable().LenheartFuncTab <- {};
getroottable().Rindro_Scr_Width <- L_sq_RA(0x4D848E);
getroottable().Rindro_Scr_High <- L_sq_RA(0x4D8495);
)";
//是否为本地
FILE* file = fopen("sqr/DofileList.nut", "rb");
if (file)
{
Base += "RINDROLOCAL <- true";
fclose(file);
}
else {
Base += "RINDROLOCAL <- false";
}
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
wchar_t* filename = DNFTOOL::charTowchar_t((char*)BaseFile.c_str());
wchar_t* str = DNFTOOL::charTowchar_t((char*)Base.c_str());
if (sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) {
Sq_pushroottable(v);
Sq_call(v, 1, SQTrue, SQFalse);
Sq_pop(v, 1);
}
delete[]filename;
delete[]str;
#ifndef SELL//本地模式要加在整体脚本
#ifndef EXPRESS//本地模式要加在整体脚本
Sq_pushroottable(v);
Sq_pushstring(v, L"dofile", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushstring(v, L"sqr/DofileList.nut", -1);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_pop(v, 2);
#endif // !SELL
#endif // !SELL
}
}
//HOOK绘制字体
typedef void(__fastcall* DrawCode)(DWORD thisc, int Seat, int a3, int a4, int a5, int a6);
static DrawCode DrawCodeF;
typedef int(_fastcall _DrawOtherPlayer_Img)(int thisc, void*, int X, int Y, int Img);
static _DrawOtherPlayer_Img* DrawOtherPlayer_Img = (_DrawOtherPlayer_Img*)0x11A8F60;
void _fastcall H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, int a5, int a6)
{
//std::cout << std::hex << a6 << std::endl;
wchar_t* strbuffer = (wchar_t*)a6;
if (strbuffer == NULL)return;
wchar_t* clone = new wchar_t[wcslen(strbuffer) + 2];
wcscpy(clone, strbuffer);
std::string GameStr;
DNFTOOL::Wchar_tToString(GameStr, clone);
delete[]clone;
if (GameStr.find("将帐号金库中的物品存入金库中") != std::string::npos) {
std::cout << GameStr << std::endl;
}
return DrawCodeF(thisc, Seat, a3, a4, a5, a6);
}
//HOOK Item颜色
extern std::map< int, int>ItemColorMap;
typedef DWORD(_cdecl _OldHookEquNameColor)(int rarity);
static _OldHookEquNameColor* OldHookEquNameColor;
DWORD _cdecl HookEquNameColor(int rarity)
{
DWORD OldColor = OldHookEquNameColor(rarity);
switch (rarity)
{
case 6:
return 0xFF0055FF;
case 7:
return 0xFF9314FF;
case 8:
return 0xFF1CBC0C;
case 9:
return 0xFFACFF08;
}
return OldColor;
}
typedef DWORD(_fastcall _OldHookItemColor)(DWORD thisc, DWORD Seat);
static _OldHookItemColor* OldHookItemColor;
DWORD _fastcall HookItemColor(DWORD thisc, DWORD Seat)
{
int ItemCode = *(int*)(thisc + 0x1C);
if (ItemColorMap.count(ItemCode) == 1)
{
return ItemColorMap[ItemCode];
}
//不在注册项目颜色map里就执行原颜色获取
int Rarity = *(int*)(thisc + 0xF4);
int color = HookEquNameColor(Rarity);
return color;
}
//Hook发包相关
static SendPacksType _OldSendPackType;
int __fastcall NewSendPacksType(DWORD thisc, int Seat, int Parm)
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_SendPackType_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, Parm);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
return _OldSendPackType(thisc, 0, Parm);
}
return _OldSendPackType(thisc, 0, Parm);
}
static SendPacksByte _OldSendPackByte;
int __fastcall NewSendPacksByte(DWORD thisc, int Seat, int Parm)
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_SendPackByte_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, Parm);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
return _OldSendPackByte(thisc, 0, Parm);
}
static SendPacksWORD _OldSendPackWord;
int __fastcall NewSendPacksWord(DWORD thisc, int Seat, int Parm)
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_SendPackWord_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, Parm);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
return _OldSendPackWord(thisc, 0, Parm);
}
static SendPacksDWORD _OldSendPackDWord;
int __fastcall NewSendPacksDWord(DWORD thisc, int Seat, int Parm)
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_SendPackDWord_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, Parm);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
return _OldSendPackDWord(thisc, 0, Parm);
}
static SendPacksChar _OldSendPackChar;
int __fastcall NewSendPacksChar(DWORD thisc, int Seat, char* Parm, int Size)
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_SendPackChar_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushstring(v, (SQChar*)Parm, Size);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
return _OldSendPackChar(thisc, 0, Parm, Size);
}
static SendPacks* _OldSend;
int NewSend()
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_SendPack_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_call(v, 1, SQFalse, SQTrue);
}
Sq_settop(v, Top);
}
return _OldSend();
}
//Exe索引字符串函数Hook
typedef int(_cdecl _sub1220590)(int a1);
static _sub1220590* sub1220590 = (_sub1220590*)0x1220590;
int _cdecl Newsub1220590(int a1)
{
if (InitGameFlag)
{
SQInteger StrIndex = a1;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_GetExeStr_Event", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, a1);
Sq_call(v, 2, SQTrue, SQTrue);
Sq_getinteger(v, -1, &StrIndex);
}
Sq_settop(v, Top);
return sub1220590(StrIndex);
}
return sub1220590(a1);
}
//绘制Item_图标
typedef int(_fastcall _sub11A8F60)(DWORD a1, DWORD Seat, int a2, int a3, int a4);
static _sub11A8F60* sub11A8F60;
int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4)
{
if (InitGameFlag)
{
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_DrawItemBack", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, a3);
Sq_pushinteger(v, a4);
Sq_call(v, 4, SQFalse, SQTrue);
}
Sq_settop(v, Top);
int ret = sub11A8F60(a1, 0, a2, a3, a4);
Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_DrawItemFront", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, a3);
Sq_pushinteger(v, a4);
Sq_call(v, 4, SQFalse, SQTrue);
}
Sq_settop(v, Top);
return ret;
}
return sub11A8F60(a1, 0, a2, a3, a4);
}
//活动图标
typedef DWORD** (_fastcall _Event)(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4);
static _Event* OldEvent;
DWORD** _fastcall NewEvent(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4)
{
if ((int)a4 == 1 && (int)a3 == 96527 /*&& a2 <= 536 && ((a2 - 456)%20 == 0)*/)//事先修改了活动图标的Y轴 在进行HOOK以便修改
{
int X, Y;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Event_Pos_X", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_call(v, 1, SQTrue, SQTrue);
Sq_getinteger(v, -1, &X);
}
Sq_settop(v, Top);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Event_Pos_Y", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_call(v, 1, SQTrue, SQTrue);
Sq_getinteger(v, -1, &Y);
}
Sq_settop(v, Top);
a2 += X;
a3 = (DWORD**)Y;
}
return OldEvent(thisc, Seat, a2, a3, a4);
}
//选择频道
typedef void(_fastcall _10F2700)(DWORD thisc, DWORD Seat, int a2);
static _10F2700* Old10F2700;
void _fastcall New10F2700(DWORD thisc, DWORD Seat, int a2)
{
Old10F2700(thisc, Seat, a2);
static bool Flag = false;
if (!Flag && thisc) {
for (size_t i = 0; i < 28; i++)
{
int addr = *(int*)(thisc + (0x4 * i) + 0x1c);
int value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
}
Flag = true;
}
return;
}
//选择服务器
typedef void (_fastcall _FC9440)(DWORD thisc, DWORD Seat,int a2);
static _FC9440* OldFC9440;
void _fastcall NewFC9440(DWORD thisc, DWORD Seat,int a2)
{
OldFC9440(thisc, Seat, a2);
//游戏开始按钮
*(int*)((*(int*)(thisc + 0x1c0)) + 0x14) = 470;
return;
}
//选择角色
typedef void(_fastcall _10F7660)(DWORD thisc, DWORD Seat,int a3);
static _10F7660* Old10F7660;
void _fastcall New10F7660(DWORD thisc, DWORD Seat, int a3)
{
Old10F7660(thisc, Seat, a3);
static bool Flag = false;
if (!Flag && thisc) {
//其他按钮
for (size_t i = 0; i < 5; i++)
{
int addr = *(int*)(thisc + (0x4 * i) + 0x70);
int value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
}
//选择频道按钮
{
int addr = *(int*)(thisc + 0x15c);
int value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
}
//滚轮进度条
for (size_t i = 0; i < 8; i++)
{
int addr = *(int*)(thisc + (0x4 * i) + 0xA0);
int value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
}
//滚轮上下按钮
for (size_t i = 0; i < 2; i++)
{
int addr = *(int*)(thisc + (0x4 * i) + 0x16c);
int value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
}
//冒险团描述和进度 按钮
{
int addr = *(int*)(thisc + 0x34c);
int value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
addr = *(int*)(addr + 0x2c0);
value = *(int*)(addr + 0x14);
*(int*)(addr + 0x14) = value + 133;
}
Flag = true;
}
return ;
}
//HOOK PushString
typedef uint32_t(__cdecl* LSqPushStringFunc)(uint32_t v, const wchar_t* s, uint32_t l);
LSqPushStringFunc LrealSqPushString;
uint32_t __cdecl LMySqPushString(uint32_t v, const wchar_t* s, uint32_t l)
{
//获取技能攻击力
if (!wcscmp(s, L"getCurrentModuleDamageRate")) {
return LrealSqPushString(v, L"L_getCurrentModuleDamageRate", l);
}
return LrealSqPushString(v, s, l);
}
//GetIntData
typedef DWORD(_fastcall _908510)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
static _908510* Old908510;
DWORD _fastcall New908510(DWORD thisc, DWORD Seat, DWORD a2, int a3)
{
if (a3 != *(int*)0x1AB7CDC)return Old908510(thisc, Seat, a2, a3);
SQInteger NutAddValue = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, thisc);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, a3);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getinteger(v, -1, &NutAddValue);
}
Sq_settop(v, Top);
return NutAddValue + Old908510(thisc, Seat, a2, a3);
}
//读取冷却
typedef DWORD(_fastcall _909020)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
static _908510* Old909020;
DWORD _fastcall New909020(DWORD thisc, DWORD Seat, DWORD a2, int a3)
{
if (a3 != *(int*)0x1AB7CDC)return Old909020(thisc, Seat, a2, a3);
SQInteger NutAddValue = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, thisc);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, a3);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getinteger(v, -1, &NutAddValue);
}
Sq_settop(v, Top);
return NutAddValue + Old909020(thisc, Seat, a2, a3);
}
//原生角色Get
typedef DWORD(_fastcall _90A4A0)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
static _90A4A0* Old90A4A0;
DWORD _fastcall New90A4A0(DWORD thisc, DWORD Seat, DWORD a2, int a3) {
if (!InitGameFlag)return Old90A4A0(thisc, Seat, a2, a3);
if (a3 != *(int*)0x1AB7CDC)return Old90A4A0(thisc, Seat, a2, a3);
SQInteger NutAddValue = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, thisc);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, a3);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getinteger(v, -1, &NutAddValue);
}
Sq_settop(v, Top);
int ret = NutAddValue + Old90A4A0(thisc, Seat, a2, a3);
return ret;
}
//获取技能对象
typedef int __fastcall sub_TTTTTT(int a1, int a2, int a3);
static sub_TTTTTT* TFuncsub_GetSkillAddress = (sub_TTTTTT*)0x8406C0;
//Nut角色Get1
typedef DWORD(_fastcall _BA89D0)(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3, DWORD a4);
static _BA89D0* OldBA89D0;
DWORD _fastcall NewBA89D0(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3, DWORD a4) {
if (!InitGameFlag)return OldBA89D0(thisc, Seat, a2, a3, a4);
if (a3 != *(int*)0x1AB7CDC)return OldBA89D0(thisc, Seat, a2, a3, a4);
DWORD ADDRESS = TFuncsub_GetSkillAddress(thisc, 0, a3);
SQInteger NutAddValue = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, ADDRESS);
Sq_pushinteger(v, a2);
Sq_pushinteger(v, thisc);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getinteger(v, -1, &NutAddValue);
}
Sq_settop(v, Top);
int ret = NutAddValue + OldBA89D0(thisc, Seat, a2, a3, a4);
return ret;
}
//Nut角色Get2
typedef DWORD(_5A40E0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4);
static _5A40E0* Old5A40E0;
DWORD New5A40E0(DWORD a1, DWORD a2, DWORD a3, DWORD a4) {
if (!InitGameFlag)return Old5A40E0(a1, a2, a3, a4);
if (a3 != *(int*)0x1AB7CDC)return Old5A40E0(a1, a2, a3, a4);
DWORD ADDRESS = TFuncsub_GetSkillAddress(a1, 0, a2);
SQInteger NutAddValue = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, ADDRESS);
Sq_pushinteger(v, a3);
Sq_pushinteger(v, a1);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getinteger(v, -1, &NutAddValue);
}
Sq_settop(v, Top);
int ret = NutAddValue + Old5A40E0(a1, a2, a3, a4);
return ret;
}
//描述对象HOOK
typedef struct LevelDataBuffer
{
DWORD SkillAddresss;
DWORD SkillIdx;
DWORD ObjectAddress;
} RELevelDataBufferG;
LevelDataBuffer _LevelDataBuffer = { 0 };
typedef DWORD(_75D1F0)(DWORD thisc);
static _75D1F0* Old75D1F0;
DWORD New75D1F0(DWORD thisc) {
if (!InitGameFlag)return Old75D1F0(thisc);
if (_LevelDataBuffer.ObjectAddress != *(int*)0x1AB7CDC)return Old75D1F0(thisc);
SQInteger NutAddValue = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, _LevelDataBuffer.SkillAddresss);
Sq_pushinteger(v, _LevelDataBuffer.SkillIdx);
Sq_pushinteger(v, _LevelDataBuffer.ObjectAddress);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getinteger(v, -1, &NutAddValue);
}
Sq_settop(v, Top);
if (NutAddValue != 0) {
int ret = NutAddValue + Old75D1F0(thisc);
_LevelDataBuffer.SkillAddresss = 0;
_LevelDataBuffer.SkillIdx = 0;
_LevelDataBuffer.ObjectAddress = 0;
return ret;
}
return Old75D1F0(thisc);
}
typedef DWORD(__fastcall _44E620)(void* thisc,DWORD Seat);
static _44E620* Old44E620;
DWORD __fastcall New44E620(void* thisc, DWORD Seat) {
//*(int*)((char*)thisc + 0xC) = 256;
DWORD Ret = Old44E620(thisc, Seat);
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"L_Old_Window_Get", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, (int)thisc);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
return Ret;
}
typedef char(__fastcall _11B3B70)(void* thisc, DWORD Seat,char Flag);
static _11B3B70* Old11B3B70;
char __fastcall New11B3B70(void* thisc, DWORD Seat, char Flag) {
char Ret = Old11B3B70(thisc, Seat, Flag);
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"L_Old_Window_Visible", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, (int)thisc);
Sq_pushinteger(v, (int)Flag);
Sq_call(v, 3, SQFalse, SQTrue);
}
Sq_settop(v, Top);
return Ret;
}
typedef char(__fastcall _11D43A0)(void* thisc, DWORD Seat);
static _11D43A0* Old11D43A0;
char __fastcall New11D43A0(void* thisc, DWORD Seat) {
//char Ret = Old11D43A0(thisc, Seat);
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
SQBool Flag;
Sq_pushroottable(v);
Sq_pushstring(v, L"L_Character_Info_Window", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, (int)thisc);
Sq_call(v, 2, SQTrue, SQTrue);
Sq_getbool(v, -1, &Flag);
}
Sq_settop(v, Top);
if(!Flag)return Old11D43A0(thisc, Seat);
return 0;
}
typedef DWORD(__fastcall _7CDA30)(void* thisc, DWORD Seat, DWORD*a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6);
static _7CDA30* Old7CDA30;
DWORD __fastcall New7CDA30(void* thisc, DWORD Seat, DWORD* a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6) {
DWORD Ret = Old7CDA30(thisc, Seat, a2, a3, a4, a5, a6);
//std::cout << "相机坐标: " << *(int*)((int)thisc + 0x638) << std::endl;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
SQBool Flag;
Sq_pushroottable(v);
Sq_pushstring(v, L"L_Sync_Camera_Pos", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v,(int)thisc);
Sq_call(v, 2, SQFalse, SQTrue);
}
Sq_settop(v, Top);
return Ret;
}
typedef int(_fastcall _Get_Img)(int thisc, void*, int a2);
static _Get_Img* OldGet_Img;
int _fastcall NewGet_Img(int thisc, void*, int a2) {
return OldGet_Img(thisc, 0, a2);
}
typedef int(_fastcall _4294A0)(int thisc, void*,int a2);
static _4294A0* Old4294A0;
int _fastcall New4294A0(int thisc, void*,int a2) {
return 0;
return Old4294A0(thisc, 0,a2);
}
typedef int(_fastcall _FFDC60)(int thisc, void*, int a2,int a3 ,int a4);
static _FFDC60* OldFFDC60;
int _fastcall NewFFDC60(int thisc, void*, int a2, int a3, int a4) {
//return 0;
int X = *(int*)0x1B4686C;
int Y = *(int*)0x1B46870;
SQInteger Flag = 0;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"SyncRindro_Cursor", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, X);
Sq_pushinteger(v, Y);
Sq_call(v,3, SQTrue, SQTrue);
Sq_getinteger(v, -1, &Flag);
}
Sq_settop(v, Top);
if (Flag == 1)return 0;
return OldFFDC60(thisc, 0, a2,a3,a4);
}
typedef int(_fastcall _4017F0)(int thisc, void* a2, char* str, int a3);
static _4017F0* Old4017F0;
int _fastcall New4017F0(int thisc, void* a2, char* str, int a3) {
static int idx = 0;
std::string Buf(str, a3);
StringBin.push_back(Buf);
idx++;
return Old4017F0(thisc, a2, str,a3);
}
//怪物头像绘制HOOK
typedef int(__fastcall _43A1B0)(DWORD thisc, DWORD Seat, int Xpos , int Ypos);
static _43A1B0* Old43A1B0;
int __fastcall New43A1B0(DWORD thisc, DWORD Seat, int Xpos, int Ypos) {
SQBool Flag = true;
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
SQInteger Top = Sq_gettop(v);
Sq_pushroottable(v);
Sq_pushstring(v, L"L_Rindro_MonsterEXControl_Face", -1);
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
Sq_pushroottable(v);
Sq_pushinteger(v, *(DWORD*)(thisc + 8));
Sq_pushinteger(v, Xpos);
Sq_pushinteger(v, Ypos);
Sq_call(v, 4, SQTrue, SQTrue);
Sq_getbool(v, -1, &Flag);
}
Sq_settop(v, Top);
if(Flag)return Old43A1B0(thisc, Seat, Xpos, Ypos);
return 0;
}
void RegisterHook() {
#ifdef EXPRESS
InitGameFlag = true;
MH_Initialize();
//Hook收包
MH_CreateHook((void*)0x721EA0, &H_Register_Pack, reinterpret_cast<void**>(&Lpfn_Init));
MH_EnableHook((void*)0x721EA0);
//HookNut函数注册
MH_CreateHook((void*)0x67B910, &H_Register_Nut, reinterpret_cast<void**>(&Register_Nut_Old));
MH_EnableHook((void*)0x67B910);
return;
#endif // EXPRESS
//InlineHook///
//玩家菜单选项HOOK 有回调
inlinehook SSS(0x001004B52, (int)&PlayerEach2);
SSS.Motify_address();
//修复滚轮
//inlinehook MMM(0x011BDE05, (int)&MouseWheelUp);
//MMM.Motify_address();
//窗口绘制HOOK
inlinehook WindowDrawHook(0x066BE9A, (int)&DrawWindow_B_Hook);
WindowDrawHook.Motify_address();
//伤害HOOK
inlinehook DamageHook(0xE5A2DE, (int)&Damage_Hook);
DamageHook.Motify_address();
//丢弃道具的HOOK
inlinehook DiscardItemHook(0xE71E9C, (int)&DiscardItem_Hook);
DiscardItemHook.Motify_address();
inlinehook DiscardItemHookB(0xE71E83, (int)&DiscardItemB_Hook);
DiscardItemHookB.Motify_address();
//怪物种族绘制HOOK
inlinehook MonsetrRaceHook(0x43A862, (int)&MonsetrRace_Hook);
MonsetrRaceHook.Motify_address();
////读取StringBin文件
//inlinehook ReadStringBinHookA(0x119F2F8, (int)&ReadStringBin_HookA);
//ReadStringBinHookA.Motify_address();
//inlinehook ReadStringBinHookB(0x119F2C0, (int)&ReadStringBin_HookB);
//ReadStringBinHookB.Motify_address();
//Fundction Hook//
MH_Initialize();
//关闭原版商城
//MH_CreateHook((void*)0x4294A0, &New4294A0, reinterpret_cast<void**>(&Old4294A0));
//MH_EnableHook((void*)0x4294A0);
//绘制鼠标
MH_CreateHook((void*)0xFFDC60, &NewFFDC60, reinterpret_cast<void**>(&OldFFDC60));
MH_EnableHook((void*)0xFFDC60);
//MH_CreateHook((void*)0x11AA190, &NewGet_Img, reinterpret_cast<void**>(&OldGet_Img));
//MH_EnableHook((void*)0x11AA190);
//镜头坐标HOOK
MH_CreateHook((void*)0x7CDA30, &New7CDA30, reinterpret_cast<void**>(&Old7CDA30));
MH_EnableHook((void*)0x7CDA30);
//窗口遍历事件
MH_CreateHook((void*)0x44E620, &New44E620, reinterpret_cast<void**>(&Old44E620));
MH_EnableHook((void*)0x44E620);
//窗口打开事件Hook 为了写UI框架 打开原生窗口将渲染队列切换为下层
MH_CreateHook((void*)0xE6E070, &NewOpenWindow, reinterpret_cast<void**>(&OldOpenWindow));
MH_EnableHook((void*)0xE6E070);
//鼠标事件HOOK
MH_CreateHook((void*)0x11BDC90, &New11BDC90, reinterpret_cast<void**>(&Old11BDC90));
MH_EnableHook((void*)0x11BDC90);
//N键大地图
MH_CreateHook((void*)0x1030C30, &New1030C30, reinterpret_cast<void**>(&Old1030C30));
MH_EnableHook((void*)0x1030C30);
//官方的组合NutHook
MH_CreateHook((void*)0x674030, &New674030, reinterpret_cast<void**>(&Old674030));
MH_EnableHook((void*)0x674030);
//DrawMain HOOK
MH_CreateHook((void*)0x4C61F0, &New4C61F0, reinterpret_cast<void**>(&Old4C61F0));
MH_EnableHook((void*)0x4C61F0);
//伤害字体 HOOK
MH_CreateHook((void*)0x7EEED0, &New7EEED0, reinterpret_cast<void**>(&Old7EEED0));
MH_EnableHook((void*)0x7EEED0);
//Hook收包
MH_CreateHook((void*)0x721EA0, &H_Register_Pack, reinterpret_cast<void**>(&Lpfn_Init));
MH_EnableHook((void*)0x721EA0);
//HookNut函数注册
MH_CreateHook((void*)0x67B910, &H_Register_Nut, reinterpret_cast<void**>(&Register_Nut_Old));
MH_EnableHook((void*)0x67B910);
//Hook绘制字符
//MH_CreateHook((void*)0x1206BD0, &H_Register_DrawCode, reinterpret_cast<void**>(&DrawCodeF));
//MH_EnableHook((void*)0x1206BD0);
//HOOK获取绘制颜色
MH_CreateHook((void*)0x7AB080, &HookItemColor, reinterpret_cast<void**>(&OldHookItemColor));
MH_EnableHook((void*)0x7AB080);
//HOOK根据品级得到颜色
MH_CreateHook((void*)0x7AAD00, &HookEquNameColor, reinterpret_cast<void**>(&OldHookEquNameColor));
MH_EnableHook((void*)0x7AAD00);
//Hook发包相关
//HOOK发包类型
MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast<void**>(&_OldSendPackType));
MH_EnableHook((void*)0x1127D60);
//MH_CreateHook((void*)0x1128550, &NewSendPacksByte, reinterpret_cast<void**>(&_OldSendPackByte));
//MH_EnableHook((void*)0x1128550);
//MH_CreateHook((void*)0x1128580, &NewSendPacksWord, reinterpret_cast<void**>(&_OldSendPackWord));
//MH_EnableHook((void*)0x1128580);
//MH_CreateHook((void*)0x11285B0, &NewSendPacksDWord, reinterpret_cast<void**>(&_OldSendPackDWord));
//MH_EnableHook((void*)0x11285B0);
//MH_CreateHook((void*)0x11285E0, &NewSendPacksChar, reinterpret_cast<void**>(&_OldSendPackChar));
//MH_EnableHook((void*)0x11285E0);
//MH_CreateHook((void*)0x1127EC0, &NewSend, reinterpret_cast<void**>(&_OldSend));
//MH_EnableHook((void*)0x1127EC0);
//exe字符串索引
MH_CreateHook((void*)0x1220590, &Newsub1220590, reinterpret_cast<void**>(&sub1220590));
MH_EnableHook((void*)0x1220590);
//绘制Item_图标
MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast<void**>(&sub11A8F60));
MH_EnableHook((void*)0x11A8F60);
//血槽背景层Hook (图标绘制也在这里)
inlinehook HudBloodBackgroundHook(0x04CA035, (int)&HudBloodBackground);
HudBloodBackgroundHook.Motify_address();
//如果加载了百级UI
FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
if (file) {
Yosin百级UIFlag = true;
//BUFF图标 显示
inlinehook BuffIconHook(0x04C8C14, (int)&BuffIcon_Hook);
BuffIconHook.Motify_address();
//BUFF图标 文字标识
inlinehook BuffIconHookB(0x04BF55E, (int)&BuffIcon_Hook_B);
BuffIconHookB.Motify_address();
//活动图标
MH_CreateHook((void*)0x11B4030, &NewEvent, reinterpret_cast<void**>(&OldEvent));
MH_EnableHook((void*)0x11B4030);
//选择服务器
//MH_CreateHook((void*)0xFC9440, &NewFC9440, reinterpret_cast<void**>(&OldFC9440));
//MH_EnableHook((void*)0xFC9440);
//选择频道界面
MH_CreateHook((void*)0x10F2700, &New10F2700, reinterpret_cast<void**>(&Old10F2700));
MH_EnableHook((void*)0x10F2700);
//选择角色
MH_CreateHook((void*)0x10F7660, &New10F7660, reinterpret_cast<void**>(&Old10F7660));
MH_EnableHook((void*)0x10F7660);
inlinehook SelectCharacter(0x10F79C9, (int)&SelectCharacter_Hook);
SelectCharacter.Motify_address();
inlinehook SelectCharacter1(0x10F7B43, (int)&SelectCharacter_Hook1);
SelectCharacter1.Motify_address();
inlinehook SelectCharacter2(0x10F7F89, (int)&SelectCharacter_Hook2);
SelectCharacter2.Motify_address();
inlinehook SelectCharacter3(0x10F8311, (int)&SelectCharacter_Hook3);
SelectCharacter3.Motify_address();
inlinehook SelectCharacter4(0x10F8436, (int)&SelectCharacter_Hook4);
SelectCharacter4.Motify_address();
inlinehook SelectCharacter5(0x10F85EA, (int)&SelectCharacter_Hook5);
SelectCharacter5.Motify_address();
inlinehook SelectCharacter6(0x10F2C6E, (int)&SelectCharacter_Hook6);
SelectCharacter6.Motify_address();
inlinehook SelectCharacter7(0x10F3478, (int)&SelectCharacter_Hook7);
SelectCharacter7.Motify_address();
fclose(file);
}
//HOOK PushString
MH_CreateHook((void*)0x1358A60, &LMySqPushString, reinterpret_cast<void**>(&LrealSqPushString));
MH_EnableHook((void*)0x1358A60);
//读取静态数据
MH_CreateHook((void*)0x908510, &New908510, reinterpret_cast<void**>(&Old908510));
MH_EnableHook((void*)0x908510);
//读取冷却
MH_CreateHook((void*)0x909020, &New909020, reinterpret_cast<void**>(&Old909020));
MH_EnableHook((void*)0x909020);
//读取动态数据
MH_CreateHook((void*)0x090A4A0, &New90A4A0, reinterpret_cast<void**>(&Old90A4A0));
MH_EnableHook((void*)0x090A4A0);
MH_CreateHook((void*)0x0BA89D0, &NewBA89D0, reinterpret_cast<void**>(&OldBA89D0));
MH_EnableHook((void*)0x0BA89D0);
MH_CreateHook((void*)0x05A40E0, &New5A40E0, reinterpret_cast<void**>(&Old5A40E0));
MH_EnableHook((void*)0x05A40E0);
//技能描述对象HOOK
MH_CreateHook((void*)0x075D1F0, &New75D1F0, reinterpret_cast<void**>(&Old75D1F0));
MH_EnableHook((void*)0x075D1F0);
//窗口设置显示与隐藏
MH_CreateHook((void*)0x11B3B70, &New11B3B70, reinterpret_cast<void**>(&Old11B3B70));
MH_EnableHook((void*)0x11B3B70);
//个人面板的属性信息遍历
//MH_CreateHook((void*)0x11D43A0, &New11D43A0, reinterpret_cast<void**>(&Old11D43A0));
//MH_EnableHook((void*)0x11D43A0);
//怪物头像绘制 Hook
MH_CreateHook((void*)0x43A1B0, &New43A1B0, reinterpret_cast<void**>(&Old43A1B0));
MH_EnableHook((void*)0x43A1B0);
//他人信息Hook 数值
MH_CreateHook((void*)0xFA42D0, &NewFA42D0, reinterpret_cast<void**>(&OldFA42D0));
MH_EnableHook((void*)0xFA42D0);
//他人信息Hook 图标
//MH_CreateHook((void*)0xFA8230, &NewFA8230, reinterpret_cast<void**>(&OldFA8230));
//MH_EnableHook((void*)0xFA8230);
}