lib update

This commit is contained in:
HolographicHat
2022-08-12 23:34:04 +08:00
parent 41863c32f7
commit 10dd03335f
8 changed files with 67 additions and 4 deletions

View File

@@ -115,6 +115,7 @@
<ClInclude Include="src\il2cpp-functions.h" />
<ClInclude Include="src\il2cpp-types.h" />
<ClInclude Include="src\il2cpp-init.h" />
<ClInclude Include="src\il2cpp-unity-functions.h" />
<ClInclude Include="src\pch.h" />
<ClInclude Include="src\util.h" />
</ItemGroup>

View File

@@ -8,7 +8,7 @@ using std::to_string;
HWND unityWnd = 0;
HANDLE hPipe = 0;
std::set<UINT16> PacketWhitelist = { 172, 198, 112, 2676, 7, 21 }; // ping, token, loginreq
std::set<UINT16> PacketWhitelist = { 172, 198, 112, 2676, 7, 21, 135 }; // ping, token, loginreq
bool OnPacket(KcpPacket* pkt) {
if (pkt->data == nullptr) return true;
@@ -22,12 +22,13 @@ bool OnPacket(KcpPacket* pkt) {
return true;
}
if (!PacketWhitelist.contains(ReadMapped<UINT16>(data->vector, 2))) {
#ifdef _DEBUG
//ifdef _DEBUG
printf("Blocked cmdid: %d\n", ReadMapped<UINT16>(data->vector, 2));
#endif
//endif
delete[] data;
return false;
}
printf("Passed cmdid: %d\n", ReadMapped<UINT16>(data->vector, 2));
if (ReadMapped<UINT16>(data->vector, 2) == 2676) {
auto headLength = ReadMapped<UINT16>(data->vector, 4);
auto dataLength = ReadMapped<UINT32>(data->vector, 6);
@@ -47,6 +48,12 @@ namespace Hook {
return OnPacket(pkt) ? CALL_ORIGIN(Kcp_Send, client, pkt, method) : 0;
}
void MonoLoginMainPage__set_version(void* obj, Il2CppString* value, void* method) {
auto version = IlStringToString(value);
value = string_new(version + " YaeAchievement");
CALL_ORIGIN(MonoLoginMainPage__set_version, obj, value, method);
}
bool Kcp_Recv(void* client, ClientKcpEvent* evt, void* method) {
auto result = CALL_ORIGIN(Kcp_Recv, client, evt, method);
if (result == 0 || evt->fields.type != KcpEventType::EventRecvMsg) {
@@ -54,6 +61,17 @@ namespace Hook {
}
return OnPacket(evt->fields.packet) ? result : false;
}
std::map<INT, UINT> signatures;
ByteArray* UnityEngine_RecordUserData(INT type) {
if (signatures.count(type)) {
return GCHandle_GetObject<ByteArray>(signatures[type]);
}
auto result = CALL_ORIGIN(UnityEngine_RecordUserData, type);
signatures[type] = GCHandle_New(result, true);
return result;
}
}
void Run(HMODULE* phModule) {
@@ -66,8 +84,13 @@ void Run(HMODULE* phModule) {
Sleep(1000);
}
InitIL2CPP();
HookManager::install(Genshin::UnityEngine_RecordUserData, Hook::UnityEngine_RecordUserData);
for (int i = 0; i < 4; i++) {
Genshin::Application_RecordUserData(i, nullptr);
}
HookManager::install(Genshin::Kcp_Send, Hook::Kcp_Send);
HookManager::install(Genshin::Kcp_Recv, Hook::Kcp_Recv);
HookManager::install(Genshin::MonoLoginMainPage__set_version, Hook::MonoLoginMainPage__set_version);
hPipe = CreateFile(R"(\\.\pipe\YaeAchievementPipe)", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);
if (hPipe == INVALID_HANDLE_VALUE) {
Win32ErrorDialog(1001);

View File

@@ -12,3 +12,9 @@ namespace Genshin {
#include "il2cpp-functions.h"
}
#undef DO_APP_FUNC
#define DO_UNI_FUNC(ca, oa, r, n, p) extern r (*n) p
namespace Genshin {
#include "il2cpp-unity-functions.h"
}
#undef DO_UNI_FUNC

View File

@@ -3,5 +3,8 @@ using namespace Genshin;
DO_APP_FUNC(0x05E24240, 0x04EA10F0, Il2CppString*, Convert_ToBase64String, (ByteArray* value, int offset, int length, void* method));
DO_APP_FUNC(0x018280A0, 0x018293F0, void, Packet_Xor, (ByteArray** data, int length, void* method));
DO_APP_FUNC(0X00E83770, 0x00E83990, void, MonoLoginMainPage__set_version, (void* obj, Il2CppString* value, void* method));
DO_APP_FUNC(0x0688D860, 0x058838C0, ByteArray*, Application_RecordUserData, (int32_t nType, void* method));
DO_APP_FUNC(0x0193BA70, 0x0193C7D0, int, Kcp_Send, (void* client, KcpPacket* pkt, void* method));
DO_APP_FUNC(0x029EF820, 0x029F05C0, bool, Kcp_Recv, (void* client, ClientKcpEvent* evt, void* method));

View File

@@ -12,6 +12,12 @@ namespace Genshin {
}
#undef DO_APP_FUNC
#define DO_UNI_FUNC(ca, oa, r, n, p) r (*n) p
namespace Genshin {
#include "il2cpp-unity-functions.h"
}
#undef DO_UNI_FUNC
using std::string;
UINT64 GetAddressByExports(HMODULE base, const char* name) {
@@ -22,13 +28,17 @@ UINT64 GetAddressByExports(HMODULE base, const char* name) {
void InitIL2CPP() {
TCHAR szFileName[MAX_PATH];
GetModuleFileName(NULL, szFileName, MAX_PATH);
auto isCN = string(szFileName).contains("YuanShen.exe");
auto isCN = strstr(szFileName, "YuanShen.exe");//string(szFileName).contains();
auto hBase = GetModuleHandle("UserAssembly.dll");
auto bAddr = (UINT64)hBase;
auto cAddr = (UINT64)GetModuleHandle("UnityPlayer.dll");
#define DO_API(r, n, p) n = (r (*) p) GetAddressByExports(hBase, #n);
#include "il2cpp-api-functions.h"
#undef DO_API
#define DO_APP_FUNC(ca, oa, r, n, p) n = (r (*) p)(bAddr + (isCN ? ca : oa))
#include "il2cpp-functions.h"
#undef DO_APP_FUNC
#define DO_UNI_FUNC(ca, oa, r, n, p) n = (r (*) p)(cAddr + (isCN ? ca : oa))
#include "il2cpp-unity-functions.h"
#undef DO_UNI_FUNC
}

View File

@@ -0,0 +1,3 @@
using namespace Genshin;
DO_UNI_FUNC(0x00B7B980, 0x00B7B980, ByteArray*, UnityEngine_RecordUserData, (int32_t nType));

View File

@@ -13,6 +13,14 @@ string IlStringToString(Il2CppString* str, UINT codePage) {
#pragma endregion
#pragma region GC
UINT32 GCHandle_New(void* object, bool pinned) {
return il2cpp_gchandle_new((Il2CppObject*)object, pinned);
}
#pragma endregion
#pragma region ByteUtils
bool IsLittleEndian() {

View File

@@ -4,8 +4,12 @@ using std::string;
bool IsLittleEndian();
HWND FindMainWindowByPID(DWORD pid);
UINT32 GCHandle_New(LPVOID object, bool pinned);
string IlStringToString(Il2CppString* str, UINT codePage = CP_ACP);
#define cstring_new(str) il2cpp_string_new(str)
#define string_new(str) cstring_new((str).c_str())
#define ErrorDialogT(title, msg) MessageBox(unityWnd, msg, title, MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
#define ErrorDialog(msg) ErrorDialogT("YaeAchievement", msg)
#define Win32ErrorDialog(code) ErrorDialogT("YaeAchievement", ("CRITICAL ERROR\nError code: " + std::to_string(GetLastError()) + "-"#code"\n\nPlease take the screenshot and contact developer by GitHub Issue to solve this problem\nNOT MIHOYO/COGNOSPHERE CUSTOMER SERVICE").c_str())
@@ -22,3 +26,8 @@ static T ReadMapped(void* data, int offset, bool littleEndian = false) {
memcpy(&result, cData + offset, sizeof(result));
return result;
}
template<class T>
static T* GCHandle_GetObject(UINT handle) {
return (T*) il2cpp_gchandle_get_target(handle);
}