2162 lines
58 KiB
C++
2162 lines
58 KiB
C++
#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);
|
||
} |