From bf63bdab4f3e0bc7ef0620b8b741cbd858cf9776 Mon Sep 17 00:00:00 2001 From: xerox Date: Mon, 10 Aug 2020 15:53:31 -0700 Subject: [PATCH] currently not working... moved some stuff from bypass.cpp to utils.h/.cpp and to shithook.h, this will allow for more modular code... --- anticheat/libtersafe.idb | Bin 42958862 -> 42958862 bytes anticheat/libtprt.idb | Bin 2043941 -> 2043941 bytes .../Includes/GameBase/Weapon.h | 6 + ligma-cheat/ligma-cheat/bypass/bypass.cpp | 116 +----------------- ligma-cheat/ligma-cheat/bypass/bypass.h | 16 +-- ligma-cheat/ligma-cheat/hooks/shithook.h | 67 +++++++++- ligma-cheat/ligma-cheat/hooks/xhook.h | 50 -------- ligma-cheat/ligma-cheat/libxhook.a | Bin 54554 -> 0 bytes ligma-cheat/ligma-cheat/ligma-cheat.vcxproj | 8 +- .../ligma-cheat/ligma-cheat.vcxproj.filters | 6 - .../ligma-cheat/ligma-cheat.vcxproj.user | 2 +- ligma-cheat/ligma-cheat/main.cpp | 66 ---------- ligma-cheat/ligma-cheat/utils/utils.cpp | 38 +++++- ligma-cheat/ligma-cheat/utils/utils.h | 7 +- 14 files changed, 114 insertions(+), 268 deletions(-) delete mode 100644 ligma-cheat/ligma-cheat/hooks/xhook.h delete mode 100644 ligma-cheat/ligma-cheat/libxhook.a diff --git a/anticheat/libtersafe.idb b/anticheat/libtersafe.idb index 79cbca4d2ea6d87464b763247e5c9746c0ae669c..f42df06af9299150e4bd7d435365569958acb3a2 100644 GIT binary patch delta 76610 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 )Xk?eI@gc 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 delta 74346 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 aiqdmSN6$%s^Mvz-3ljCEqvs}m?fQRSCcdQr diff --git a/anticheat/libtprt.idb b/anticheat/libtprt.idb index 5b979453548f96643c7357a1879b294d7e11c076..28e9f921b616326da0f3a71af15bc45fa909e118 100644 GIT binary patch delta 2791 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 diff --git a/ligma-cheat/ligma-cheat/SDK/Assembly-CSharp.dll/Includes/GameBase/Weapon.h b/ligma-cheat/ligma-cheat/SDK/Assembly-CSharp.dll/Includes/GameBase/Weapon.h index 30ec964e2..9521b3250 100644 --- a/ligma-cheat/ligma-cheat/SDK/Assembly-CSharp.dll/Includes/GameBase/Weapon.h +++ b/ligma-cheat/ligma-cheat/SDK/Assembly-CSharp.dll/Includes/GameBase/Weapon.h @@ -173,6 +173,12 @@ public: template T& m_weaponfiresound() { return *(T*)((std::uintptr_t)this + 0x11C); } + + void set_firespeed(float speed) + { + *(float*)((std::uintptr_t)this + 0x120) = speed; + } + template T& m_firespeed() { return *(T*)((std::uintptr_t)this + 0x120); } diff --git a/ligma-cheat/ligma-cheat/bypass/bypass.cpp b/ligma-cheat/ligma-cheat/bypass/bypass.cpp index 0645fb19f..dc375a23e 100644 --- a/ligma-cheat/ligma-cheat/bypass/bypass.cpp +++ b/ligma-cheat/ligma-cheat/bypass/bypass.cpp @@ -1,6 +1,4 @@ #include "bypass.h" -#include -#include namespace ligma { @@ -26,100 +24,16 @@ namespace ligma ligma::utils::on_image_load("libtersafe.so", [&](const std::uintptr_t module_base) { LOGI("libtersafe.so = %p", module_base); - ligma::hook::make_hook( - reinterpret_cast(module_base + offset_ischeat_packet), - reinterpret_cast(&tss_sdk_ischeatpacket) - ); - - ligma::hook::make_hook( - reinterpret_cast(module_base + offset_tencent_init), - reinterpret_cast(&Java_com_tencent_tp_TssSdk_init) - ); - - /*ligma::hook::make_hook( - reinterpret_cast(module_base + 0x0013F3C), - reinterpret_cast(&tp2_sdk_ioctl) - ); - - ligma::hook::make_hook( - reinterpret_cast(module_base + 0x0014178), - reinterpret_cast(&tp2_sdk_init) - ); - - ligma::hook::make_hook( - reinterpret_cast(module_base + 0x0013ECC), - reinterpret_cast(&tss_sdk_regist_tss_info_receiver) - );*/ - LOGI("installed libtersafe.so hooks!"); - }); - - // for some reason lubcubehawk.so is never loaded?? - ligma::utils::on_image_load("libcubehawk.so", [&](const auto module_base) - { - LOGI("libcubehawk.so = %p", module_base); - ligma::hook::make_hook( - dlsym(dlopen("libcubehawk.so", RTLD_NOLOAD), "Java_com_tencent_hawk_bridge_HawkNative_checkEmulator"), - reinterpret_cast(&Java_com_tencent_hawk_bridge_HawkNative_checkEmulator) - ); + LOGI("libtersafe.so handle = %p", dlopen("libtersafe.so", RTLD_NOLOAD)); }); fopen_ptr = dlsym(dlopen("libc.so", RTLD_NOLOAD), "fopen"); - dlopen_ptr = dlsym(dlopen("libdl.so", RTLD_NOLOAD), "dlopen"); system_prop_get = dlsym(dlopen("libc.so", RTLD_NOLOAD), "__system_property_get"); - ligma::hook::make_hook(dlopen_ptr, reinterpret_cast(&dlopen_hook)); ligma::hook::make_hook(fopen_ptr, reinterpret_cast(&fopen_hook)); ligma::hook::make_hook(system_prop_get, reinterpret_cast(&system_property_hook)); } - void tss_sdk_regist_tss_info_receiver(int a1) - { - LOGI("tss_sdk_regist_tss_info_receiver called!! a1 = %p", a1); - } - - int tp2_sdk_init(int a1) - { - LOGI("tp2 sdk init called! a1 = %p", a1); - return NULL; - } - - int tp2_sdk_ioctl(int a1, int a2) - { - LOGI("tp2_sdk_ioctl called! a1 = %p, a2 = %p", a1, a2); - return NULL; - } - - int Java_com_tencent_hawk_bridge_HawkNative_checkEmulator(int a1, int a2, int a3, int a4) - { - LOGI("check emulator called! a1 = 0x%x, a2 = 0x%x, a3 = 0x%x, a4 = 0x%x", a1, a2, a3, a4); - static const auto check_emulator = - reinterpret_cast( - dlsym(dlopen("libcubehawk.so", RTLD_NOLOAD), "Java_com_tencent_hawk_bridge_HawkNative_checkEmulator")); - const auto result = check_emulator(a1, a2, a3, a4); - LOGI("check emulator result = 0x%x", result); - return result; - } - - int tss_sdk_ischeatpacket(int a1) - { - LOGI("-------------- is cheat packet called! a1 = 0x%x -----------------", a1); - const auto result = - reinterpret_cast( - dlsym(dlopen("libtersafe.so", RTLD_NOLOAD), "tss_sdk_ischeatpacket"))(a1); - LOGI("is cheat packet result = 0x%x", a1); - return result; - } - - int Java_com_tencent_tp_TssSdk_init(int a1, int a2, int a3) - { - LOGI("----------- Java_com_tencent_tp_TssSdk_init called! a1 = 0x%x, a2 = 0x%x, a3 = 0x%x --------------", a1, a2, a3); - const auto result = - reinterpret_cast( - dlsym(dlopen("libtersafe.so", RTLD_NOLOAD), "Java_com_tencent_tp_TssSdk_init"))(a1, a2, a3); - LOGI("result = 0x%x", result); - return result; - } - // // dont let a single lua script load! // @@ -149,34 +63,6 @@ namespace ligma return result; } - // - // this is used to gain code execution exactly when a module is loaded (for the first time) - // - __attribute__((noinline)) - void* dlopen_hook(const char* filename, int flags) - { - dlopen_mutex.lock(); - ligma::hook::disable(dlopen_ptr); - const auto result = dlopen(filename, reinterpret_cast(RTLD_NEXT)); - if(ligma::utils::get_callbacks()->size()) - ligma::hook::enable(dlopen_ptr); - dlopen_mutex.unlock(); - - // - // if there is a callback for this module, call it and then remove it. - // - for (const auto& [file_key, callback] : *ligma::utils::get_callbacks()) - { - if (strstr(filename, file_key.c_str())) - { - ligma::utils::get_callbacks()->erase(file_key); - callback(ligma::utils::get_module_base(file_key.c_str())); - break; - } - } - return result; - } - // // spoof all hwids to "what do you call nuts on your chin? a dick down your throat you fucking retard!" // diff --git a/ligma-cheat/ligma-cheat/bypass/bypass.h b/ligma-cheat/ligma-cheat/bypass/bypass.h index 06fd63611..7f9524935 100644 --- a/ligma-cheat/ligma-cheat/bypass/bypass.h +++ b/ligma-cheat/ligma-cheat/bypass/bypass.h @@ -6,11 +6,7 @@ #include #include "../ligma.h" -#define HWID_VALUE "what do you call nuts on your chin? a dick down your throat you fucking retard!" -#define offset_emulator_check 0x000D7B4 -#define offset_ischeat_packet 0x00128E0 -#define offset_mshook_function 0x0010358 -#define offset_tencent_init 0x0021CAC +#define HWID_VALUE "NA" namespace ligma { @@ -18,21 +14,11 @@ namespace ligma { inline void* fopen_ptr = nullptr; inline void* system_prop_get = nullptr; - inline void* dlopen_ptr = nullptr; - // every shithook you make you will need a mutex. inline std::mutex fopen_mutex; inline std::mutex system_prop_mutex; - inline std::mutex dlopen_mutex; void init(const std::function& callback); - int tp2_sdk_ioctl(int a1, int a2); - int tp2_sdk_init(int a1); - void tss_sdk_regist_tss_info_receiver(int a1); - int tss_sdk_ischeatpacket(int a1); - int Java_com_tencent_hawk_bridge_HawkNative_checkEmulator(int a1, int a2, int a3, int a4); - int Java_com_tencent_tp_TssSdk_init(int a1, int a2, int a3); - void* dlopen_hook(const char* filename, int flags); FILE* fopen_hook(const char* path, const char* mode); int system_property_hook(const char* name, char* value); int load_bufferx_hook(void* L, const char* buff, size_t sz, const char* name, const char* mode); diff --git a/ligma-cheat/ligma-cheat/hooks/shithook.h b/ligma-cheat/ligma-cheat/hooks/shithook.h index bdeaaa5cb..57759f4ea 100644 --- a/ligma-cheat/ligma-cheat/hooks/shithook.h +++ b/ligma-cheat/ligma-cheat/hooks/shithook.h @@ -28,6 +28,8 @@ #include #include #include +#include +#include #define PAGE_START(ptr) reinterpret_cast(reinterpret_cast(ptr) >> 12 << 12) #define ARM_JMP_CODE 0xE51FF004 @@ -55,7 +57,7 @@ namespace ligma { if (hook_installed.load()) return; - + if (!mprotect(PAGE_START(hook_addr), getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC)) { memcpy((void*)((long)hook_addr), jmp_code, sizeof(jmp_code)); @@ -91,10 +93,15 @@ namespace ligma std::uint8_t org_bytes[sizeof(jmp_code)]; }; - // this is jank, but needed because the OS isnt initalizing statics/inlined globals... :| inline std::map>* get_hooks() { - static std::map> hooks{}; + static std::map> hooks; + return &hooks; + } + + inline std::map, void*>* get_dlsym_hook() + { + static std::map, void*> hooks{}; return &hooks; } @@ -109,7 +116,7 @@ namespace ligma addr_to_hook, jmp_to_addr, enable - ) } + )} ); } @@ -133,5 +140,57 @@ namespace ligma return; get_hooks()->erase(addr); } + + inline std::mutex dlsym_mutex; + inline void* dlsym_ptr = nullptr; + + __attribute__((noinline)) + void* dlsym_bypass(void* handle, const char* symbol) + { + dlsym_mutex.lock(); + ligma::hook::disable(dlsym_ptr); + const auto result = + reinterpret_cast(dlsym_ptr)(handle, symbol); + ligma::hook::enable(dlsym_ptr); + dlsym_mutex.unlock(); + return result; + } + + __attribute__((noinline)) + void* dlsym_handler(void* handle, const char* symbol) + { + for (const auto& [so_data, hook_ptr] : *get_dlsym_hook()) + if (strcmp(so_data.second.c_str(), symbol)) + if (dlopen(so_data.first.c_str(), RTLD_NOLOAD) == handle) + return hook_ptr; + + dlsym_mutex.lock(); + ligma::hook::disable(dlsym_ptr); + const auto result = dlsym(handle, symbol); + ligma::hook::enable(dlsym_ptr); + dlsym_mutex.unlock(); + return result; + } + + void dlsym_hook(std::pair symbol_data, void* function_ptr) + { + static std::once_flag once; + std::call_once(once, [&]() + { + make_hook( + dlsym(dlopen("libdl.so", RTLD_NOLOAD), "dlsym"), + reinterpret_cast(&dlsym_handler) + ); + + // + // this allows us to use "dlsym" anywhere in the code :) + // + make_hook( + reinterpret_cast(&dlsym), + reinterpret_cast(&dlsym_bypass) + ); + }); + get_dlsym_hook()->insert({ symbol_data, function_ptr }); + } } } diff --git a/ligma-cheat/ligma-cheat/hooks/xhook.h b/ligma-cheat/ligma-cheat/hooks/xhook.h deleted file mode 100644 index 93dd5b4cd..000000000 --- a/ligma-cheat/ligma-cheat/hooks/xhook.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2018-present, iQIYI, Inc. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -// Created by caikelun on 2018-04-11. - -#ifndef XHOOK_H -#define XHOOK_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#define XHOOK_EXPORT __attribute__((visibility("default"))) - -int xhook_register(const char *pathname_regex_str, const char *symbol, - void *new_func, void **old_func) XHOOK_EXPORT; - -int xhook_ignore(const char *pathname_regex_str, const char *symbol) XHOOK_EXPORT; - -int xhook_refresh(int async) XHOOK_EXPORT; - -void xhook_clear() XHOOK_EXPORT; - -void xhook_enable_debug(int flag) XHOOK_EXPORT; - -void xhook_enable_sigsegv_protection(int flag) XHOOK_EXPORT; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ligma-cheat/ligma-cheat/libxhook.a b/ligma-cheat/ligma-cheat/libxhook.a deleted file mode 100644 index 3212303e4dd060234f10c67d821a09e5c79c9280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54554 zcmc(|4}8_tegA*%{p52AA;JX$L=1XW)QEsVQPH7ZG$?-}L_o!jEeRz2X#?Csu(72Y zLJ+hfX=~MXI@67HwsReAUFWE_>^rym>)fiHZQW+q{NYxlZl#WPZgutde4WoZH=kSr z+PUBNcOE(SectE1&-=X3`}{wj&*z=9=QeFwv;La0i!(#rtjn&v{K`va)m$+vlc}*u z@!w2l&Xp0K$uyQ3W6m-r_{Q+QVze>C`Q}B&oXqe4FJt2VtK*D$`b$Iow?A)8X<56aW$XF^wr<1LwiYpOSOZa^s0b@6Y)Is=#YGf_0wZ*=NRPWhm(8zRdi}f= z3zsfwxN+IiTk7Z6He7dm!@Szs`AcdWZm64gqZyuJ;gTDco+^Fm4L2;GzoMabe%*?B z!_ze^n74dLLDavcb#23%^(|{YsL=YBrsha3idHK~MG9}&w4u!`YPzF|%4}@-(1trV zG(;`4q^WJg9W4u*HZ`}lY;lTwce+T$wYE9mEA{dX>z32f^@9!l?m1(P(7JgYon*u2 zEgRbIRIRqPZD?&++q!M*dMdZIZOb;>c^cLaX5;=crK8y`S*BP0d?2Z)nb}X>HoH zF5{||xol?5%u8!(YUVJtRIhH@+R~iayeU&xck4~Dqzhf8*O=?CT6N1-bhT=2)0Rz5 ztF~_5wq;Grsx2+K&0AMl#YDd*G1irp9Ik#k&WtfBmp{VCn=4)Z2%ltbACf-8{P~ddQKo$ezet}`CP$Ieocg9z zI@}G6DW^MJg9kTdLIkI=uaTQFF@n>ax~Dj`PNTvpl9FSiF_uI&wlRjDZj>ciVT_7S zBE~s_N)$v6)km;Y5IH1@pmdl-4zgM(QIp6~ z@Sh_(@VSDNqlrj(ogn3`boeSk%31I5Rzb?SND#i7wIuJ&g79e;B>#s6$#58 zZK5)?v~Or`x1451TaGO)ZYO0)R77zCORL@24W%5GS+vV6=H&OD5gSJn$+od+&4x{D zH^+q^#D^`y?I(xXIu;jua!OyLlT*yx#0GfgjZ1Esv9+yf%?D4Zzi2aDTzYJ?HwC5{u-Ix_x?xjGyk*vIY1&AHOWeGsuwc!k zi?ubaHZ!;0xlwRx)6C2CGh08G>gN*u%+gN{{rWw+FEA&>XZ0>7j32l;Of3BLsHsI^ z%_nlvo-7LMSM!D37JMUwMol!2-YK)GaPw)};Zg^Zb@V7w1(^3{_j`9veUKSDUpZ*Ghq%UgjT8^0m) zHOF`mEbx1~sJ^u^ek?Zye*XwvT)y?BNj}lYdHKFq#IG*KPs_Eh@1+sH!Z^ysc*OZ# zT*PlhjGvZw&+i?=arxT7C7<6}dHH@xTwH&vV*Iqd@cgob;b;65vYqfoymv~If5_?C z$G`3a4vI$3(?^&wqSM~NJ5TphB79hB|Ba9D_I%n;h>zE!nR-Z8%^TYB`+8hL*ykZ= z&IQrj;hj&LNkp9AgYau4PW&=>&+k>jJ`X|jTOe`Vht<{!d;P5f(O$$mrOAJkA3^Uv z8%K!rsOrRAr*2}M=oWee=;`h)YLCMts4sZu`@ycFdFXhozS6g^@0~^bR)T-lGXwf^ zw-xbQ!2;piqdLa#%h2&xaK}N?c=7S$BTd*XyM-Htce_uxq-M4b>$rEnPw2Sb7GJne zsHgN}i)XxE`QlCeL48l3sp;uUHum%-ay@-VuQvn6EFWNOlo@jy;akVEXD)lgJf1h^ z@z;#0A7BnG>n-5j`4n-?mG`}cWCcUpWWqJm){Jeqv==Iq-{j-YFXq%ab;H@{Faj2Pv#eNclP{_7=>JaH2AZ~~Z(rGh<0_*~GG%)PN-0}(RoTzwOEca1Oon_No%zyq zM_%-zeU&?wQWyS5!beb>`u}tI=FJ(lZ5h8$&FK0k)3lbmN#gA8tNOyLGUsibj+eIY z$FElar?x(}Akw#Vov0twGiTbew+p(gA7HCqcC3I$x}A+~rSIM}dNsEUgz28KCcQT= z9lwaKy`CAnM@w^qdXDStT#h_dUbl^2x3>;(@}!+_8DQNm^LkLbq|H5f#>8ZJTir14 zA2sAx{2pZaPT9KS(x-I3uj~e^bLlWA+0l2(>AM1br_pz1=AOK1?98WQ`YyElo@bA| zg^u39zkr`tSLgK|Z5-c4+a2U-#>+|9x$KPB)AViR=sT7e?6f_YG_VJ!rIjrGjr=hnJ z)8Wdn?K-&wnhwi*U#~HH^9l5K8hWb9bo7sMd?ZVNEUP3-x`*+%uUCDv-tw2+5zkui z*OzOol5V;d%Ry%QSbcJ+%o@8{#TCgc zS*6RW#$9>o!pod7^gVQ|xN_1;ZQe-tQ|mkOzFnDH%i{ew1h@S-6VcYB2m8;9YGZi% ze)C+R&FPQz9fws`rEC9cV8|FT_1*ba$;dqLU+=ub)yRs0sg#j({iB31`t56#y!6js zLc`wkXq(c}yW%8cYr2~`)$Af+O$bHp0l&XUsC@{GPu5u;nnPz}M@; zxbjeMSzJ$c&O^?BBF|gC-(=P2R}3&Ol^t>Yq^j}3dXT{kp=I1UkfMx#rHn^?UyPM;zbm7HGAhYi>B>mEGAb#f;@2o6D}Ibc-xeB^ zx$Lt?km+b0QqRR}0D*k!A`ZANQIgHo2U=MySUXCQYrrUN(|5?5ytG2p%fOfKT z0(*_Jl3Y*Uh#J~4`&FwuwRP^$?*8l2j~)?iTjLJMZXFPnq82jnn+! z))?u${ZMy)y7YB1$;Sce&;xo?#wd>9bHxXII`{QtJyl!Q*H+V=AJNzY+vS=E%UUy%6&Y%Fjzb+sGgBYWCo|-)>FhVT zo%z-b<>or`ITOu+ZMhCx2hB}dyV_j*+tigg{Ae^bZXNhO_$xs)eyf>ZH9mRrGQb|B z@_EG{V(zOUu6tjv#e4VlKBf4MeZBhy8RM#Zdrb%R{zN{3Zlg8tHmwz9?dD*n?T0$@t?+HH*+JbNVth)s z^#g<_w52;Hw2`lkwODc5s|jz-9V)dz}s zYRp%gJC_T{o)BYwp|d*(snmyQ1_`?!e5 z1C~cCJS3y#LES}L(%3V$J@+-}ZySFOd~z;+KY81;TCY|Ne2#DfvZzd}Yxl!Egv9^E_Y5)ziX@Mv~iq0%7nM(zG~Y>eXmOT z%t*#%wqLeq;6a%E+vN5}`ZDF%{=z;-eNyG*D5n*uatNPL&IQAia~|c?&w4x`)Toc| zgfD&EbmrSK$gTFw$ivgt3*DQj-xD`M>5{QEqrS3ifH3XaIiZa_%C9)h<-#>K1LkIp zO^vJGj2l-O#ueq|(jED;iGQ(Xs4O`ri|t!QviLD5S(Gk4<@tX2A8}pTQr%Ypu8YdBWOfuEH`H3 zZ>h}2eZ9{K=Jxd-5@h~*Mv(cd#N2E7q}_a^u|%0iE6ncxlJstu7R_Vy5zY?}*?Myx zBm9UBYu(pgI^7fPZ7Q>ad$subTIKc*edJY}9ozlvkvWos_Vjx|AJ19Xov9jHH*e0_ zHhZ4>KZiere+K_Fel}jt>SpPT*Z2PDrvCjU;;D0LcfKac8Hutg*=t`tdSCy4oE7QK z9MC@Gx9r}brhadKvZ`lb6zf&|{PTaP*LHYSb?@!Jpl5IYfA28#i+#Nn@LF%n*w>pT z+~~sPgqzV_TdaJYi+|3!p_#Z}y7K~S(g1fpN7Lr9e0esS^LYGZ`*E~>>}3u|z6@>1 zd?g*KuhBM>wP#WI)6l2W58M5V@K1nOxViBS^gA8i;^p(+OWtzg{J7CR)sP=q3N)cH z2Xz+A(e}oTub;z

nh}7I%!e?bN~Y&PtCf20lc-I4@(m*t?oC$)P<0dmHvldu@M` zygDCgujl)R&J81+ETS6`lU?Uh!&)j@Pjd_O(vjkp5su1HKfSqc3G^k*2cC8j=^1!V z&+P3_B=;WqefogfxvVD2A0W>K=7-@HQy*N5o~D@}vL@9JWXxlzq&~Px{XR=Q8h7=U zz?&?i+clFa}*blr|kf9Vh#*d{NiO!Cr!;$c#>mDuX zMvjE~*6n@jYpgxrj_Z=aQkF1T_DbJ>t&BYy^U!3Irf*QDN&n4jw(sP=pZ_h^Lg}?a zI(O}-GnD$j?^lw&xL>VeEv?E)cef4vJ90@kemvMVrkpPk&-v8qyDfIUsOBt~pgtz8 z^TUpQ?IHd7;X=wj)%k%tr6K1B)x)13)Ia0r2P!e_`GE#HdNHq)t+{wBZ$4eTu_?FJ zK8N{r&J^FHZu^;s_A{qfW*$QikH3~kv&PtUOXrz->HI$3dF*lbTJ$~J|GSB+85iZz ze3LNsy?cMOH+gK|v!&AA+ReF^O_?GIGi#eRw6-u+&@wPSuYJaO(^}gz=gr=lIZtp} z`&D>g^Ld+~X@#a4zY5>VM5lefdjv4-_U`gjCcZCklJJl*N3 zP6_6jF1w!X>z&RXL3a{bi+tOwPpyaUXZEfknpeZ9zu&il_!a1+gt4T%DEf}gr*`pk zX$^NfJ}f!x8gBb9<*}|SO*A@VZ^yUe8}SS9Yns~Dtj{c8c;oWEJ(R!;TRy{2JI>5k2$*=KiXtlS*UIk`{g6OEjKDAS}LD$JjZ&4Zd#+0)X8nePPC zpP(i}W)8iTbc0I`mdo6 z&XkSPJ$z|TlVi_avzs$Mb4m@ov(oF}*;Qql`Y!gPgXK!^DmO>Dt*%_czjnDf%5CEu znylxn>Drn-DAP85kN(o$*kRXMyFYb(G|l~_K`$DA(O#wAp1HTX@z{Qf@u<0RRUuzD zy0G{0_t|k(^I(2~o1;Sdq{c9ME3B1i?!}n9>^xp89}kX75bt5JxNAT4whc6UetOT&s#DD1VY%^>mxz7htzkLOtn2`)G0=D7ng_kBxs)m4E z;?m@>obGp=Ld_`h)grz<8EyllXhxHXC6p=Jb7=hr(}0{PiohQuF~4kb7(_P z1eEq_M^}n&cW_V1uCOarJGv%%kJ6J#v$dns4 z8d*E~l@ik9^-vG6_4v50=a910D~78_Tu$|vTFKd!H1W1j4;m(K?P!MVTWm0+S`GJ3 zxt-=_t|31zL;1h|1;mG5u;9u`b@|O5%so>$nBI4f+ z6RF_z&TwL|;h;s&Ozi}AhE=343d2+|c2PL)#xT4o9Je40>%z%5gyE9tcX4v+_;6&f z`CuwIeAmHbZR`#9uTXqxS!uS*migCrCFj~Qzv;@HnCent6m?ElSWan~MPd0Oq^b)m z4uxS*-Wg7gO6#D^ohm1>D;4}fQ7K<6Q7OTV2gC4qSb97RzZq5_>aMWjZV5ax_}A^p zsgR^PgGcV}49`pjM~zCcRjZ)%(8o5Ir;i+5N}ZIq+*>hO%98Tx0#(}L69q++N%wJSWAgpoT_!M8rz zDQ*9C2@3oAM-L`f#uWA~Ta~(SWa%}OR=pz}xp;9n5xxj}7Lrb`3ri)}W82kCltG!N z2Zw{wwy=VVA77jbKKIdsV*d|RF$}s(XxZS{M>|u&pWJ;=k-+5igbOLAlbAOtAjp?2 z3e!6gcTqUGlZeG(cvmnIAs_r`>D=Ir62;Y(9tp?olsHNb+B<{OAlNN}|2zr7sDuBW z3V!*KgUOm$J-=%bVWMo2q$+*Vi&ZDFBu*sYL4{^3PNCAnj_gebDU#|WXOAPXlc3Gm zoA6ajW(y(9R~7eUf>sd=JdKYjsK};R3D$cFlr}UbS)EAEjn!&TmevfS6*Ol-Q>BhTlN~Ff`De6KS~h`Ra4miD?$WkY&}&du&)ubSd7nH{ z_(J5RAQ4uU-9$H76po@RgsFqU7q+XRf`1CoqS|vBX{V*03DZy8;0#g~agS~2k*Pi5 zxeMuKH+_9^I4anv9z{VDJL$S@AVK+?so+!FJCoC6r5;Eo!ZXW)(WOs@6X}nsH-m3} ztdsJCZzVNVyczrjC?fn-lI9D?1{b2IaLRGiLJp0RDny#Yh&Wq1SQL&;1$TCa(}IZy z2{HrN;qlVPY@gNe30|ZxCw7IigTGH|)=D#=su>Jv2Eh4?!YQfUVdawWj2rZ;xXDDo zD0p$ZDjM9&V6ME!=5i_0`M*YqUnBACVD-VUf|Ao3WL@Fd#bJ5yrMnL%r%w#W-Wygu z8%`o|40Y-ZzVNYw;iTXPNtLoVoU|hxLz0c}3{Ou5|CnSr{1MeJC%A|j9}ml!-J(%d zO)He&6jtBJFYWp<6g>dZ$lc+D$0bW+#s4myHmZkK zfIY?a*u$i{O`R(d(9ov^?bL(e%u4y)k1ZN9$lpRCXO%re2VN9jNC#sTu^skI4VU$_ z*gGF%5t*F|b|zha20e}5KDYEsbdg121^86DnP!RE#7_ZME(&L)m~8C;n8A>+Ywic> zA@6+b&8Qw)&ttBFy?}T6X6w(`SdU?k6S=GrzQdy?!Z#P;Hx}XCLpc}Gd(61}e^!Wy z(qAgVe^!L|70L5hQThu->6aDZPZr_7SA;Jw!u>Aa%lkkq{mbZM&;{m?hv1XUM~2{M zn3Y5Dv&@ts__^knG5s5Jf$12MKEnJVc)2!>)?HxQhNNF)mJPu#Hq}G$OHFDBeuep+ zA^0eB?ht$o=RjYU;CS;1@TrCR2j=78+{rmN$!q{0+>f4NZUnFO$$ZFO4t}J7pR0#L z<}G_3Q{)9^7wHei>bC~`i30saW)k=#1^iO;bMn7Yz^^cyN!R%>awE)5;5x}gZj>1Z z?oVlY6aN_bOWom8_4^M;$+I|&c4XDTQ6dZ9N5-i! z{GXgGM~F-E1y`1I@$&S)r2y__e9~NMKH+q6+~QXljvJO%#j5;20atk*Ur&C8J--eK z9>YHZeRT|Pb^S|ciKMyMeB0qVBPFT-1&-G9`@WM$XP6|Z+%MbnickMb_@ra}kGb-7 zE=rnnjlLC7|M2uJq-SFIP2e2$qVqcX8!<%wtIbuU$(6t_!JAMYgx_@GcVNsJMq7<2rqZzLo`Z1vq;{ni^?Bdiz0ge z&8*L_Z?C))zm6h#nv2qB6yd*FRNh%GUH2dQhW84`F9Yv!d?|B=qt_k7IKH|5flJq& z%Q(K|I_~tNIdL3cPR(%RNo(FXdeHq2C%dix)FOS}tpw*(pBTBN|4EU&>!GP?q~3xb zitg5{hbOst-cv@NU8Dc!x<4x>sEM5y1^S^K|iA%T!;kXDuuTN=|)mqWB6y z@`K;j%U*KS!gY^!sa8TdUh>zT~rGxsJ z1Fm{x1*sn*nW|RCvmpAhdO|OUgahkU->lOU?WF#w_TmcHRBh!wA&0-a&V6zeB`FpM|%q4`c_j= z>!)CagOv_eIhb*9s)N-I>RUzSt8s9)gSMQTsT%>czr~kDdyB$2SRUzr3i{1LFog%w zwLtM(Ah;-M2jOzlRz&M+6&w0;@Twg1xghO9&{TcEm>xm&_@s+JAb6c?KjL3?>2CqW z_iYCa?IgU!!BPjy9ZWk2xtVs0>o+ZtoK?-yGm5G$(Yw)AcT!L2t1hR%3WDbZ8Q)!k zjPLz|*G4z?>Ib&JWO={e#rFylZ^sw#xNthD#*d)JLsfg!AF9@|=M)ZnQShU*2lJZb z(RwHOng!R8zXV7*nkU77x`TReL-RtnU=wly8&^{=pxWzI2YUt4(_sgBm}}ej4Tm2S zWPF#<57h43y9!r76F<3Ww?^LsR(*JIKH5%vRi~Q=ftm+ZuG&%MsU6iHo&t*R)576< z*rfx^wA-S+m-KD%mC^foDhJiu`q9-))s=332R;I>avl|=oE|~S*$-4XRu0N}(WL{- zwA&m?A#8D(crs*7R}0 ziJU0dz(Z!i(AkRkZJk8G(e-pe+7=NFcVvbxXOhfo*9eYhzu<6GW86uiSZd52 zf+P7RQm`!2OR_#{2ia)&gyO+J=irwe{DxrCn7CP=$q5$wE|NVWr?r zw1tBi!6o#62df3qm(?S%MmY7I?cf|i>ND5Dtl+X}o)TOje0ela36j+$nUwgm5YbJN z`GTgkuu+iuHaoapkj80sFegYR^;5xiLHgTv2Rj7mKV1%13jWSu{jv_P6{McF9MWw$ z)X(Mv-=lPd?Q!(`1*zwA4u4*d`n~M%R|KiwVTT_Pq>^ttT=S>unGuBlR6*)l=Wwl; zs;AaTrMC)Fzxy5DEl52zFDm^BLFzd}{As@@1*y+C#Z!+T3L^hs(+4H@?=l7??>7aJ zQ!iskKHWt~u1-PZ+02-d98U{U{uPWhmD?dmd3tVMZ2T*3-=bk7#z@)+pRQYM=IX6m zu__WhaQ81Wv~0qpNn}f6h=G%a2HtXz{VQLNY@K+cCom}(P|LNg--3xXxNd50_;3>@ z)nMJSG1qn{cEikCtc`i2C{1lmGiTN{+|;sVT}$(gt(#XjwUQ)T8SmMCN}X(6oWu-B zR4@P8=@8Q$!zGZej6^<3O$yBvy%1$BCq}PB*|(j1tXHF*bQ-p8YTb;j zo}rO8>b;rsiJH&pU>L!Mq@1KqL+tdNsNf;VzI%GDyRNup+onw$Hpw#Q&|$x}wP~H% zx^+#{rnQAS>ZR%evWDrft;MWe)4F-9Gu(3$DWd@~Ocmn^r!oRmEL&7B4Qsx$Z!sIT zZp}5VX)*EcvTj?`mgYjG)L#mSodqyE%HU|&+&UOvq?oo1gGuTEyio1sh+cwoksF&@ zX>~t;*q{dKNpw+E$l7h2$a=z{9*&CIwzRj%43cdq-mxe)gmkLj@8_|?i+JwEvlGic zCFMzKbwVEZF5G+I?kJ}=&zyCo;n)6LGRInQvcLA{k}H%p%l_J*OD?w*_SgPga+$FU zfAPvYa~8&-$ZCK2!8(*R6gA8K^3y!?5{yPcVSgk0QIP>D`^yg$7?Xk``lY=#H*1k+ z4xJU5nYyILN@IU(*tWb^cP9HBwnhc_{8h$$t+aq@8)u#Ns|xE}A~!n%gDdKnFl0p4( zJS*^%O~<%=ZScE)82Kg;7uVm@@H++{$u}m(?>}J1UqL|SI{ub9?4t_dQdgu9#g)YvoI>zq|h`oG2iuy}Ie|wyKqLK6b{<)~X)WrBradeVz z6T-#i>xLi4zJl}oJ^)c%zB%x#hDz;m7T(KuUBs^-U$2u-G;*HbHAVayWAdHt=p^4! zCKgBw?Rx}%y8H9a^ZPM$arxH6uLB~+g>ueg*kT7>p`MG;*Hb9~ANHh{-p@ z(J9~BXg(;kZ#n!P9cKPpT{Iu;iSfHQ#_y7dUqQYn7`Q4&G;&_PnMM4%WBi!<3-!H) z3~~J(fZxlOQ}pBc-Ao{^zei&FV=650n;r2h$k)YWAo)Zi=lRtX@jDWe?=nZHd>=3B zfA_=hxEML-`Ry+1FUR0F2O72S6?oB!UrSN{>tHfdylCV+zosI7)ewkI{H}C#!XM&C z`eV7WZV&tzS_P*xdDThuu(hrmx)LQg=ga*nxT529bm@XiyU?Ekefj9Mz?*2ZD#INubBTAJ^^c4A zt>hdaVa4wzyytg5d1KwktgMEP4kFU^+14Z3kX~fxyT{VD#(%7s0H{ zFROX4wgXoo8?InG@B)>d?&-VxvXTLV{g1lKYX^QB=*pLGLo+Xh39}52j@6g?O>&Y<-%f0uQh^FZ(D8ooW`ThRpH7?$KdMa$h5j3X_BZI&e8p<>7C zs`e3&=YMK#6-M7j%kBe1{l4`VJf3ePP4dfA}V5Ngq4q`LG#@9HQ zad4`GvmG>t_*S!{XJC%SKa-z?9A{Ji(%ioOBxQ}reDbvs$2xm;Hq|=H|XduzH(iEfV~gSE>@;dF_|=e zp2vIWdCW#%s-N0qHGDn^pOVJU#LoVD${O*Z&fb-@c{%+(*}Hoi4|U{6HTLvX9C|EYliQnD`_z(`M~6pCIzE%1)6tPuv zXY$qLVSPP12ipc3i%jX0#aC^`*g5Luu7Z!+Rq~%teQ#BLojx<9sqK}4;YqxK3te(M`dxE$x#%#1`j7~u2ZfhfKkTwl%*SU}9w-fKjbt!blFb2>? zjbY3Xp6(#F2nI|KV@&uV!j1S2JT?GW=V`i|2hbVtcLvZc@V0>qEL=8lF|fv{e)R(@ z3Cqrj!VQG0kT+p&hmYR+isYl8V&klS;I&`9bKgqRA9D4%nl{;AROf$z=8%l(rXs(FvW$2orTNR_b5W2ZVbl--q2D<7P9rZbCZ5lfHB-zZo|F8-}!% z#FtQ)P008Z^IZ?#Jju*}R3Gl!iuIGydI>{-M+Yf`)%P zPzdwitMnhN<|$s++nJ?{^*w*48qZ&S-HNNu+m@-leTl%lCAG_zF03VZA*@Y3yjNqL zX=CQHTpc z{oTWv?LqIDthJwzxcSqs$*$&H>Ri?M*?cDV*?gFMn0nvS z8@JEQezdHXI)*oQTYA}qx)?cBw-xZ)Pnq@bTnP{9<1A!JWO@c>r%dlzH6{Itv7g39 zQBU8vprbF5Hj<@JYmj6?hkcT#&gGR%DRWC-C3ARf$7l12Y!~{U-)lbf$ZH9+o4Ty% zqlqVH$Xg|u#(e@?Jsm^j)qXHxCiN#wra!Fj=>0crJIH23Kt6-qDogl(C#ZLpFm@(< z-AB?kyrt2rdZ<0gQ$C@)udZ6Q%(f{*mvsL691#j7wo=u!|FqOQk z&ED7NruX)ziMKjR?@O1_c2-YW>1@To7ZYakT-K)%jrY*T^#ghIKHbSQl`?9IWO^la zqD+&WOtin1N$crwGCe|G$;3HiU^tnq3{I{i$gz`l)AL{+d}>}}ZjvQno~tF+QV0~0Uk>>H8W-5)eYcEHS`-hnLfN$}YR9_X)H zchA_f*aLv?5P!+A0N&UP>Z4ChOPHPgStFkRkiVPpC7$CQPea?uu8A>@XBvCRlXgV> z(mgxckWFo_eG%_=9aVXDKSCV;e99_ZITr3Q%2H1>zc1Dpet4ZXR*slcfrZP(j7 zVD~fFi_)H_j{dTW_QwWRALrP~S;CsDYPDY1MD<9LmPt?t>=kDvOXG|AyG@EZOdLpG zvD4}$VWK)@i3SqRioGtsl7Vo=pe!1P2pYOZkCtH1Irq##l72dIec9jmX8CN#Qb9vwA#IupUt9DAO z??y6?cRZzgwbO7s+u>PmM)sFe23Kp7JJh!bcQa4K`-EiQqjIp{W&4+rE~5T0(f6-{ zF6awpuzzi*|JpugcJywyeM{$Q{%-(v0S^^U^lCm*zdL>4cd6eB^=c^fpjySeo~4~m^%l{m7dbk*kkX}H!ogpqsooO-ndCSqB+TxyPbR*e+h6?)2sQ# zju&voONZ4@J2Z*({r#(Y+0R0^5}6tg$Ob0!1G=mxeFXg~VIrE9#8(op{d*N@lD8Fl z?X&FOD&3ja8P%>?8P*@dTCigcWICHA66R*8Tm%D$_9^9|zI-{^xy00$tcwRQL{2uJF|9aw)WyEeG`XwHai3l{2%>^h&) zRm#$_azbRHE8JIdHfO|GzZ$gD7S;JktS@SBi7fZMLY!5T*(q@H(uhWbK=|h!}zE1hwySF zSx^5pC3yD0M*lCDOK!cTQrS;znXHrTL zVe_559J*o65DKo$*$Q&%wJ)U>s!m@0qnGG)uQL0#R@2N}EAI*Gy)7STnhDD&$_JWe zy7PDx?UB_Rnzq{iOsoTOO_^y~kFpDA=G+jBSB&@II(6C@}!_vhxx*9$+;~M?a8PpKlHnp_p_*dL5&6zC{u?3Z~Id+n(z9=ku zr*z)?`?taN`NXefu}&{}>VG=h=525-+pzl1hPFF%Ee%mub`L&IPUi`13wvbk243lo zwsPX9w}ySvx=q^});HPzK5kzH_qfbZe{frl|7yOrnA9ct=y-00i;{~O(uoIIGH^C* z!tymQ6*lk!;+7`b)|%n-%!ehQ4ciI?ygu8~d@2@OTU%Dox?~PDS+kjcAU=eBaoW3c zes>D{68*X@n^E4{4K1zBTfL}mp5UKpNArY_*SPaxJL02|z;-;BDki~yZY$YKpq!EwnRqH;QhNwk{YPQtI^=O}S4 zdMWuNA-$wmp_pSq_%M)7yGi^kuxXF_v|mMOPblr3AoVElkiw%%MtlzVio%~C@p-^o z3Vxwf!53+P1wy}QQhy9gQ)HsNWaI(Dx^7IoV#yw4*{v7ZS1p5jr95R*=CBE>Rmz`R zRIim;^q?iw>X>-W*rX#VS5%)xA1QU{k1b_~DBo~RZMCdQ%Y_qB)+0*(dtxMTFVd95 zZ4Q1t{wch7>j~_~ONp=8_Ki}cV8u7XNZ*tmz@IE#ty7#XevPrb5m&xjLZ+$scD(LU zz0?0ncpCq<;*i-py`PfB*Wz|@g%Vni28fFzLFHS#9dNt|O@ij3$9*4dL`q}t7c<<7bH5Z@7uf%(Ih=BGa zb@&JIPvCXG9e1q`@#EKzBj3_d^7~pQ=PiKA|HeO`Ps69!_9FYT|l7O-eeI*AR! z#_AZI>UE$G}bN-YziR^I;0+FRH|n}mI-u=LunqAQ$$ zS-Bg-v`lYZxj4KC1{mdirD=<>}2=OGr~~f3&FuKd#|M&!>{PM0ho9&Ri5cedn7YM!x{$*p&*pWb-iRb@^O~!M5LPSHFYiE0}3Zf1R-)OJ@ti^pbGYLOS*h;RV4Q ztfZ0aEHZWm57GTDqtWSpYV5HXzLXiv8&Y?{Mac(gq2N~-i93(v(-&d(?xyha8^bf} zY)8I~o`5m7@e9HUn7M>vv>SZW(eG4ndhR%ArY;0XJM@6JFb_B@6+D35I~6&DBIg3< zr0%BIEDEn%6xJ*XYvCh7Dlqt_aY2>JvE26R_JhIxU=grWa($j5f~~yin1jP&9%Sdk zMC0(Z)S=);S#>+dHZbNlQOo#L@NXlqNT*3+G3L)!!T$_QhN{`U+n$SC&vUohBO^~cEqA^{O)2l-;dZJ6wNa^73{z$+lidU1h2M}9PEcj znt}MvhYw1wdrL9NhFrmaeAqVeA7Y>M=HSQlfwc%pUdQ1xD zDmb6s9bmMyYS&IXBZVk*%!0+?xcOmNAC6lRPFN5w3#Kt&1h*~<%Sz`#zV+1PA}S5O zBa4qu-gPi|InfF13}>c-?_+N=K`W!OMZp(|!;aot2H}S6YjIByEeFDQ8?*Yb++IyCDU8x;Bd?#uMGa$you7kP6ZXFh_AB_U=Q+J)b$)X zP%s8Ni@TT_@1nw(KTW{zcke<4??I_|GAj&Vl~R-1wKDVh@LkrZ;VBxUGWaPOCIp|d z0{yF@3!NK`RKNPjqVVj+;Tb!^DNDmM76%`B)1nK*s-V1-wW%%LaWp*JX zE4NI%U)f%I7?Yi>yrn_scA18ps0Moz)sy-KYl;^Ezo!}akJ}GYf#8P$Ex8ys;fzpb^!~`88*ObE zOfAThvbI~+$M7*j=*!G&q{)s;43gzNW2+kl0JwM2o{YMfrR9CU%ntc+Zp&P{&UoXfpW@|o z-W^9Ti)FX`_QfK^{}Yxv`Vp=>3-5%>P2(Z^3&5(y(OrSyTvRKlzTQ}mtiXUyHQV7j z`wQ=OaKDRx!r{+2T+iP`_naUPr=EB5FSz&@1uy5hn~T>oJJG)?cp3LHE?&>`6n{jJ z4)=zOKjz|fw;)?ZZ@G9q0~Ea;RLI6q2~hRWw~&gLP19g5^>XnQF1}K54t00&85ciQ zkcVh;)2@wd$Vfjgf(urm_o_wQVF=c7-{SBC4jyyyyw_#Z4-1md+Mr@VdW-&E1$<*< z1T{xV-jzVfyUO8>4sUk&dWW|J$%z_MhzJcqlbj#TOGzg5bA(?XefO87Z=q6?q)(_zBu6?MQ}hdllC@EF zqagTg4z3d*NCJWCT~dg>CKWX!#S+|NEB$Wz`=2_oDhf@6(&OfVg- z1<5hS{E={`yC(%%48AN_&bK*&S!2E-$V+A45=4%FaPUVC{zNbvJ^K?pjdl~A=5pcI z1{F|qx#Dkh@wYjAjf0yVR`Kr+a2t1u*<=22Q}W3S=SGMkD3U7!oepU zJmBC{4jyvwIR~G2@C657aqv|KdmTLN;1LJkaPTb$-*!+7Q8J6Z9ZWl@`9SfN4r-nh zo^f!hgEbD$c5se^a~;e&sCh;C>m6L-p!O7sU*({l5(sZ~Fy~;KgB=cbIk?Bc`yG5l za31<~u*bpu4(ei6>9!vOpBB#Gf5yQ>g7mxR9DH67d0uevMZtN|x4wdv2E3O3EC`=! zhff!TPrbue2xg-_r06>gIQcCd`93Nf`jJ6I_tOzkx}Mz)vElV=o8hw0*-x}Qq6fnE z;ouM}BZXLs-PX2&e@(_SW4+JNp!XSgcrAHsf*vLhN%-|_bm`&$@In=AS~;s%Jj5Ty z!jzRdW79ufjoZlnt zw?!v@f}UR;%;NIBLZZ%l-g$ltAd2(rfuAyppU6GG=@Gwz{enTHzA+pfz`R|=?+N%lO}yk|Yg&-+J4N!{&t_ZliAK)L_qRp-8rf`% zPW;l2PPoogk`G|rgYfe_6yd{vUPSlEN$8r3=pH=@-2+8*Jtv|2F}jj`97Cn>nZ@UX9xOB3B8egwVyhAvNH&ZluqIDxKx7`mz=ewUxYd8VjbWvhfP z-e1XwLmZ;!FC;vPA_&iGdxF)ce^J!lsj;71`B+)JO2+-4Y7V&!-x}F%F z?|-_Njo0@W_ZwO0RNr&(zP?+E__bw>`KlD_oG({)fa3gQ|0M&B_)W!oezR%ISaX`{ z3n`Z~t@zyF=ro?#0DNH6hWBo-;L^)x&&gQVSf+PD6A3Swcvlzn18dV9$zQNnaIQ^V zHjv1e@yY0YN6ZwRcw}bG)XiQyec&7ydE)Dc(0xUt9wT&b@CkB@s?8o5&NSPOe_) zY%cmd9<-ND9P%p34E-~_iF$HAgz~aPcwRg@;vWB%tuF8M{Ad&t0M~NPjW@zIW+E5i z9+O415u^_~UJ)FEk1+ooA zQ|4eqV9p#w2n8lnxGz@w>3@yva`LIY^uI<{xgj3mW6Zw|!Gps8UJ_%`oFA*7@WV=Q zPIzTey86r%9fon!+~hXJRbv_(7@N-eY16qsvpDx<76(ZY(EXR!J}WP3x}yn0rW+eRwBgPT4fb9Bh9ymH z8}4XXz)QWYyop?F?fJdth#N}H_ z+Hm^&D0Fdt{{Q4je@vYPepg5Q3i7QdO>&Dy&dYaY5kI{L?d!`DQQ&tg!o}swkv5!s zdKMd(Pw!KEep(_02m^_X-g{tTesXalR*trM*lzUXMKpE?L!XT6cXt zbpDO=)17}cao+i~nMB0->HYL9apI@-*7N&o!aff{`(8mD_hD@x6!!YN9b~w3;X}mx zJmU9o9C17puU!*kHK(wg=oUsn`|GoPtEfGCNmvo1Q$6JV3c7fG--^{&W%>I0`wN?i zpV{Qw;Sr!O_p3$x<}g`gNIwTJ==tfHDSrj`G)Om0#K-r)G+`!b9v!^*bK$H@uekiZ zo(p>;0Sf2BG^J~9dtav>C-DF997pN?HUnKr8Fn`)=-vC0?tgkFg`CY-2Q26y-#Cl%+Oe~k}X5i=H z6_)PgPPQizjlAb6x_Aru@G?i|=RTcBhFd!xadZIdKJNn#diiwJ@?j;3PIH8JK24LO z4=e3!`1onlr?nCvpZj!&tTjPvWqeOk3-0p}9AeK`xKI1-SXl8|n|zvZAHK+iyRm#3|kDMS5q@ z=s{v(a(*`(qq8rY9hn%-y!)M9tp+ZaFRGhbMR#_xiE!_aZt6FU*fzqZT#&`aMn_Ly zvR>cUKmHmkNIsK{Y(nrhOMb_gef?*jxv$@T>(96QvZJ?!twd>dZ$6XV+duxm-u|lY zz5SIvd;3#nPcOWzO$mLspRB@;O2*kL;G6qK`v~Kf0j{U54S_H{m_~molf8rwoMr7K z^o=B68QL$|vaq>@C># z!v+NN%2AL144bfYjHCYsoSS|;pE*aiN9Y6C4oRkO?!EU%dz08vEmhtM3b~kP|7$MR zzpuHNe^s*8&=1Uc?K946&zv`VYi4k+Qy)*#b_v?BB(f86l&EN|Etv7T;)66c+|nJr zXPLi!?X2|QQs%sZeK2Es0<$M7SN)NqSr~aoKmc#@;n2v8)oS4PmK*rAis?JHi zPkdeqiKe8ej;eA+6turterrdUK9Jxau*c~{^ILSPq{$FEaj!JkWF!|ZoB3F86dy+L z*-|*Mjt?W=3~ub?m3}Fl{7hH_GAb4DF_DtX zQ{NmWI+$-ib@&^@S0)GfMv3q8{vW;vnP$Iv_&QKgf(L^?yZfM$Uph(hpOBl6CcaN{ z7?kU?v%5zj|)_@*QkeCFz0brUUN72jfM2_M);tM z@WH+4c(ZdzdSI{t8FM2{+Yo$|**pXvW9|ZH>i=D+{*4^m zS2;*_Q@HSvpl5uM3{2nv+q+ zWsm+l-_YB5dzd)!n9KdU{ZDQFPM+7vbTMB;M|^Ltfw2{zg`eTjw}&|I=+@S0=qar6 zDmOalnz5#A%#M9?@xR|1BPVxlW+mgUF_MFSFX#d!0!pdarqvFAH%=kJiq6T)rore4>%_{60)L z&hMERKgEkq{50>x<$DT#S>n9&{4`I+`8`Kw)#DsI(^!GuMTFz>9e47HM$YrQfN-4O z%Q5*ht$F#zkv}fq+u)jOz4QF^JwTk_t1*7+OP=4qz$`AG{->Pu;HLV5eE$SdoZsOX zKYu5xe42;(E8Hnp!f!LUcS@7jx2J;M?e-nYMffyNAE%4g*VBD~fDemS|Ks_5p9$#G zWalSdk2ernqxBqo{7(MjB7T1fzv^N5>HCj3zbcTdsjA}@K!vxU$E#FdIad{zFEZ2+Qo^{dG`7)C0^fEvHEKJ;p_XS zMf~0%p}`jxEBB9!_&o~04C!hQLCYE@V^o-OL&aq}u0l?rNyzJztHi~i=_oqYLbA6Z14{BJty zL>ATAaX$Fq*|6LQU*w6AUihFZH}i(zftfo5Pnk=G;3Lfy;F{ATmooYueh`n(0-9r( zWn%8c=OD%O96Dkyuus+oBLcp;k2`&%{5cn)cF|c&Yp|T!O5gk*5`xR%$GKTbXCpbC zi7X_uojO=l#Yblyd*)$s(fohXccI{;Ip#f|d00UG8At0z;oT?XnB(xdf(TLL_+Bqa z`fs{;zv~|UEb|`TaT@+3px8e$_a(%3{U_VvpJe;(m_;weoOob~m4yYwR{mN0aBm2m z>JTt=8$LL-o$z9ezAA~{j^RHd{}0}d;ap7rj`!kj8vF+0yz@crjTBZtlA9fY!ms*? z-0$Lx>D1@E^K_pe0=mK;I}5IH=4J78dx?vWBK^Nk(Q%z%`=;oGFTuylT>!2z;+^ML zOGLa}?R}Ns*UQsoiHnyjTMoY5_+I=Vbn$WqfuB^{w2l2z@dzU1q131OdypwTy<83mm4X*0p&{3>DK`Nj9*o1pV~#6sVM#&I7m z-gDkU!f<=emy7s)$}4Ek$&ct3dIad{-in2l{3;2x3OFad$Q{SW>$@OU zU#$|NQ$IL@_q++(|J74`_E7v`e4Jl94768Qd+6N(&+j~##rK@uAX(y6hSzhN@c#?# CLUb - - - - @@ -297,6 +293,8 @@ adb shell am start -n com.activision.callofduty.shooter/com.tencent.tmgp.cod.Per pch.h c++1z Enabled + gnu11 + false @@ -323,6 +321,8 @@ adb shell am start -n com.activision.callofduty.shooter/com.tencent.tmgp.cod.Per pch.h c++1z Enabled + gnu11 + false diff --git a/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.filters b/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.filters index 962b26bd4..6d53f559f 100644 --- a/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.filters +++ b/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.filters @@ -33,7 +33,6 @@ source\utils - @@ -48,10 +47,5 @@ headers - - headers\hooks - - - \ No newline at end of file diff --git a/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.user b/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.user index 966b4ffb6..5df420f57 100644 --- a/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.user +++ b/ligma-cheat/ligma-cheat/ligma-cheat.vcxproj.user @@ -1,6 +1,6 @@  - true + false \ No newline at end of file diff --git a/ligma-cheat/ligma-cheat/main.cpp b/ligma-cheat/ligma-cheat/main.cpp index 8580ff30e..66de01915 100644 --- a/ligma-cheat/ligma-cheat/main.cpp +++ b/ligma-cheat/ligma-cheat/main.cpp @@ -4,77 +4,11 @@ #include #include "bypass/bypass.h" -// -// ALL OF THIS CODE STINKS! THIS CODE IS JUST TEST CODE AND PROBABLY WILL NOT WORK! YOU NEED TO GET GAME STATE/ROUND STATE/ROUND CHANGE IN ORDER NOT TO CRASH! -// -namespace dogshit -{ - bool is_pointer_valid(void* p) { - /* get the page size */ - size_t page_size = sysconf(_SC_PAGESIZE); - /* find the address of the page that contains p */ - void* base = (void*)((((size_t)p) / page_size) * page_size); - /* call msync, if it returns non-zero, return false */ - return msync(base, page_size, MS_ASYNC) == 0; - } - - using namespace std::chrono_literals; - void test() - { - LOGI("sleeping 10 seconds...."); - sleep(10); - std::atomic is_in_game; - while (true) - { - const auto game_base = gameengine::gameplay::get_game(); - const auto local_pawn = gameengine::gameplay::get_localpawn(); - LOGI("local_pawn = %p, game_base = %p", local_pawn, game_base); - - if (is_pointer_valid(local_pawn) && is_pointer_valid(game_base)) - { - if (!is_in_game.exchange(true)) - { - sleep(10); - LOGI("sleeping 10 seconds...."); - } - - const auto enemy_pawns = game_base->enemypawns*>(); - if (is_pointer_valid(enemy_pawns)) - { - LOGI("enemy_pawns = %p", enemy_pawns); - const auto pawns = enemy_pawns->get_items(); - if (is_pointer_valid(pawns)) - { - LOGI("pawns = %p", pawns); - for (auto idx = 0u; idx < enemy_pawns->get_size(); ++idx) - { - if (!is_pointer_valid(enemy_pawns) || !is_pointer_valid(pawns)) - break; - - const auto target = pawns[idx]; - if (is_pointer_valid(target) && is_pointer_valid(local_pawn)) - { - LOGI("target = %p", target); - local_pawn->set_location(target->get_headposition()); - } - } - } - } - } - else - is_in_game.exchange(false); - std::this_thread::sleep_for(0.1s); - } - } -} - __attribute__((constructor)) void init() { ligma::bypass::init([&](const std::uintptr_t il2cpp_base) { LOGI("il2cpp base address = %p", il2cpp_base); - if (il2cpp::attach()) - std::thread(&dogshit::test).detach(); }); } \ No newline at end of file diff --git a/ligma-cheat/ligma-cheat/utils/utils.cpp b/ligma-cheat/ligma-cheat/utils/utils.cpp index 4f0e04de7..56ab70507 100644 --- a/ligma-cheat/ligma-cheat/utils/utils.cpp +++ b/ligma-cheat/ligma-cheat/utils/utils.cpp @@ -1,5 +1,4 @@ #include "utils.h" -#include namespace ligma { @@ -7,6 +6,13 @@ namespace ligma { void on_image_load(const std::string& module_name, const std::function& callback) { + static std::once_flag once; + std::call_once(once, [&]() { + ligma::hook::make_hook( + dlsym(dlopen("libdl.so", RTLD_NOLOAD), "dlopen"), + reinterpret_cast(&dlopen_handler) + ); + }); get_callbacks()->insert({ module_name, callback }); } @@ -16,11 +22,6 @@ namespace ligma return &callback_map; } - void iterate_memory(const std::function&, const std::string& protection)>& callback) - { - - } - std::uintptr_t get_module_base(const char* module_name) { const auto maps_handle = fopen("/proc/self/maps", "r"); @@ -39,5 +40,30 @@ namespace ligma fclose(maps_handle); return NULL; } + + __attribute__((noinline)) + void* dlopen_handler(const char* filename, int flags) + { + dlopen_hook.second.lock(); + ligma::hook::disable(dlopen_hook.first); + const auto result = dlopen(filename, reinterpret_cast(RTLD_NEXT)); + if (ligma::utils::get_callbacks()->size()) + ligma::hook::enable(dlopen_hook.first); + dlopen_hook.second.unlock(); + + // + // if there is a callback for this module, call it and then remove it. + // + for (const auto& [file_key, callback] : *ligma::utils::get_callbacks()) + { + if (strstr(filename, file_key.c_str())) + { + ligma::utils::get_callbacks()->erase(file_key); + callback(ligma::utils::get_module_base(file_key.c_str())); + break; + } + } + return result; + } } } \ No newline at end of file diff --git a/ligma-cheat/ligma-cheat/utils/utils.h b/ligma-cheat/ligma-cheat/utils/utils.h index 614b8c715..a2af3b307 100644 --- a/ligma-cheat/ligma-cheat/utils/utils.h +++ b/ligma-cheat/ligma-cheat/utils/utils.h @@ -2,14 +2,19 @@ #include #include #include +#include +#include +#include "../hooks/shithook.h" namespace ligma { namespace utils { + inline std::pair dlopen_hook; std::uintptr_t get_module_base(const char* module_name); auto get_callbacks() -> std::map>*; - void iterate_memory(const std::function&, const std::string& protection)>& callback); void on_image_load(const std::string& module_name, const std::function& callback); + void dlsym_hook(const std::string& symbol_name, void* function_ptr); + void* dlopen_handler(const char* filename, int flags); } } \ No newline at end of file