From 7f629d1d7c001d2c68ecef8ef7f081dd3d055165 Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Mon, 21 Aug 2017 17:16:46 +0200 Subject: [PATCH] Implement raw assembly cheat code support --- meta/meta.xml | 2 +- src/system/raw_assembly_cheats.h | 40 +++++++++++++++++++++++++++++++ src/tcp_gecko.cpp | 36 +++++++++++++++++++++------- tcpgecko.elf | Bin 234276 -> 235468 bytes 4 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 src/system/raw_assembly_cheats.h diff --git a/meta/meta.xml b/meta/meta.xml index ad8ce39..23a6b12 100644 --- a/meta/meta.xml +++ b/meta/meta.xml @@ -3,7 +3,7 @@ TCP Gecko BullyWiiPlaza, wj44, dimok, Chadderz, Marionumber1 - 2.4 + 2.5 WiiU RAM Hacking A memory editor that does magical things to your games. In order to develop and apply real-time cheats use JGecko U. diff --git a/src/system/raw_assembly_cheats.h b/src/system/raw_assembly_cheats.h new file mode 100644 index 0000000..b991df2 --- /dev/null +++ b/src/system/raw_assembly_cheats.h @@ -0,0 +1,40 @@ +#pragma once + +#include "kernel.h" + +#define ENDING_ADDRESS 0x10000000 +unsigned int assemblySize = 0; + +unsigned int getStartAddress() { + return ENDING_ADDRESS - assemblySize; +} + +void persistAssembly(unsigned char buffer[], unsigned int size) { + assemblySize = size; + + // Write the assembly to an executable code region + unsigned int startAddress = getStartAddress(); + kernelCopyData((unsigned char *) startAddress, buffer, assemblySize); +} + +void executeAssembly() { + int startAddress = getStartAddress(); + log_printf("[Execute assembly] Start address: %i\n", startAddress); + void (*function)() = (void (*)()) startAddress; + function(); + log_print("[Execute assembly] Executed!\n"); +} + +void clearAssembly() { + log_printf("[Clear assembly] Assembly size: %i\n", assemblySize); + unsigned char buffer[assemblySize]; + log_print("[Clear assembly] Buffer allocated\n"); + memset((void *) buffer, 0, assemblySize); + log_print("[Clear assembly] Memory set\n"); + int startAddress = getStartAddress(); + log_printf("[Clear assembly] Start address: %i\n", startAddress); + kernelCopyData((unsigned char *) startAddress, buffer, assemblySize); + log_print("[Clear assembly] Kernel copy done\n"); + assemblySize = 0; + log_print("[Clear assembly] Assembly size 0\n"); +} \ No newline at end of file diff --git a/src/tcp_gecko.cpp b/src/tcp_gecko.cpp index 301ddd3..21db4cd 100644 --- a/src/tcp_gecko.cpp +++ b/src/tcp_gecko.cpp @@ -20,6 +20,7 @@ #include "system/pause.h" #include "utils/sd_ip_reader.hpp" #include "patcher/function_patcher_gx2.h" +#include "system/raw_assembly_cheats.h" void *client; void *commandBlock; @@ -74,6 +75,8 @@ struct pygecko_bss_t { #define COMMAND_RUN_KERNEL_COPY_SERVICE 0xCD #define COMMAND_IOSU_HAX_READ_FILE 0xD0 #define COMMAND_GET_VERSION_HASH 0xE0 +#define COMMAND_PERSIST_ASSEMBLY 0xE1 +#define COMMAND_CLEAR_ASSEMBLY 0xE2 #define CHECK_ERROR(cond) if (cond) { bss->line = __LINE__; goto error; } #define errno (*__gh_errno_ptr()) @@ -84,7 +87,7 @@ struct pygecko_bss_t { #define ONLY_ZEROS_READ 0xB0 #define NON_ZEROS_READ 0xBD -#define VERSION_HASH 0xC9D0452 +#define VERSION_HASH 0x7FB223 ZEXTERN int ZEXPORT deflateEnd OF((z_streamp @@ -157,23 +160,25 @@ static int sendByte(struct pygecko_bss_t *bss, int sock, unsigned char byte) { return sendwait(bss, sock, buffer, 1); } -void receiveString(struct pygecko_bss_t *bss, - int clientfd, - unsigned char *stringBuffer, - int bufferSize) { +unsigned int receiveString(struct pygecko_bss_t *bss, + int clientfd, + unsigned char *stringBuffer, + unsigned int bufferSize) { // Receive the string length unsigned char lengthBuffer[4] = {0}; - int ret = recvwait(bss, clientfd, lengthBuffer, 4); + int ret = recvwait(bss, clientfd, lengthBuffer, sizeof(int)); ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (string length)") - int stringLength = ((int *) lengthBuffer)[0]; + unsigned int stringLength = ((unsigned int *) lengthBuffer)[0]; - if (stringLength >= 0 && stringLength <= bufferSize) { + if (stringLength <= bufferSize) { // Receive the actual string ret = recvwait(bss, clientfd, stringBuffer, stringLength); ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (string)") } else { OSFatal("String buffer size exceeded"); } + + return stringLength; } // ########## End socket_functions.h ############ @@ -1389,6 +1394,17 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) { break; } + case COMMAND_PERSIST_ASSEMBLY: { + unsigned int length = receiveString(bss, clientfd, (unsigned char *) buffer, DATA_BUFFER_SIZE); + persistAssembly(buffer, length); + + break; + } + case COMMAND_CLEAR_ASSEMBLY: { + clearAssembly(); + + break; + } default: { reportIllegalCommandByte(ret); @@ -1492,6 +1508,10 @@ static int startTCPGeckoThread(int argc, void *argv) { usleep(9000); // log_print("Running code handler...\n"); codeHandlerFunction(); + + if (assemblySize > 0) { + executeAssembly(); + } } } else { log_print("Code handler not installed...\n"); diff --git a/tcpgecko.elf b/tcpgecko.elf index 703d973d469eef113042836e0c6d0d88e4da3d4e..a48a1f497cc2e39e142e0256e27493d56dd00c7f 100644 GIT binary patch delta 36643 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%0AkVbAVZ$yYTBN<<;KbuO=Ku6JLpSHOM_1g^bXn z4O-nRfV0ctw+U$}kgt9$NtfTN@mywSf7(VeNFK?xvrl$YS+2ZIh@OzO1hN|C=G%lM zmAKvh_|33G$LVg~y^tofP0<<#XUOYzFfd?~qiL zudK1@Yj$+VVVi^pjXQc(ping7z}*g$7 zV-?&5>KNR@`v&ph61l$`ep8(&C+@;XSC4q|cL^C&#K)sNHIE4&K?$p;e7EqfLF9Ii z{R!bmf+(Mshh$-gk=yW*)y-PCk&AW2O+OqmyLql$TaVT3x*|_=z3`Yp+|}bT?-#ZU zVjY(|4hZ*)b+^lj2PxkwH!Asca?$??F>+d?kT2F)1gMLi; z4@t8a`I8?DonqY|<;Z7*h4L?3h3mBfbU*84?L@m3b_JCK(6^ICh=b8 z>G-LT6d>+BC=WbGrus42?|yObeR41I;Jw#t)vr(uaF>T#dt63`W90Wer1f{?`VQd< zkv}UZ|4jHFH0&ApnQ)^Z?tMzOzCe90^>n--q@j)LFv%5++OS^Z{gdxZ#Vnk zf;=IwV|t5wJLS|juvGGLx%&-Rk2^d=ZwNof*o?>>zY;bC@3rEG27g)WeWOOs|DAA^ zEWIUM=2_n>bif*sa?snb#@;a5{kHI=_-LeTdI$4rua`#dMRD&-^2j@6_}|For-b*# zy|2r8zeZbo&&vJ37Cs8z`>_QfGTbVN+-jcu`*-0ad;ct(e*>HE{n9h|8{uxuteZSV zeL@yY`VG0^1Jxj5XH^^9@l!T{ld?Kv3&f`AB9H(#P8R5YW`RFC{TQ|OD?}4 zM2k;3J+&8vn9Ibc+MjC|gGKSF0Z*4GW(3S^h_YZ|wrp(-K{U71vfgj|;)uA;mzL%fmlWQ&@+ zEn*6lJ1po8@*t~tCvs1jRooyD(48rs6vW0>xi%XLw^qs>+2V4_N3vlMj+i#H6+hBp;n~>1@JZH4%hsn&p28f_C{U$}<W#Ilc`xRv?$GKz(d!)hl4)qYa*}72S+0%E6cw1ofp~l@gtZ)1E+=0B)(r~nK_X5^$ z*>I@Va^}!^PvJ%yjHeSlWw(iE0>wiea^7Z)#-Seh#Afj^)b<|4Z#Wwwth)qu2w&a1 z&bEJ6bygRC?DFoRR!{j|BK9OO50{Fch=&?I{aeH|!Kl`<9SCr^1Xf`MclsK{1Sby- zc#`iCvx3A!?Vj@Qh%W|+g!!KMcL8Wq z9b%8tE5<~X~H-xV96sa z;Qp7NY%}h;bOf!h@)X1j~h_|HlggbHVgonU1pAeDv)Nn70LRmW; zyb*~XTNa@luhQSBmWvOLM_LLWT?@xb z{P;@bfrGH!3kEs25&2k&+}J4o!FbfH9UR=wEk|3m0|mm~qfBmkT6~xID-Vg=#Wx~7 zBZtJ$sp64BPsoqNj9_w7d%K7mH@I(!2P<5wQ*QOZjgi|r#Q&juxI_F1xu@@EVjR{U zr)+pZ{3+!fFNl8-$4cdw3MTd8fRi%fU;u|3H%d6GHwEG9Rl~2>Y-~uoq1*tb#cc3caI?;BfJk z6L>!X;{vZb{q;N-*VV@VV#3!8yQ*V?Ck~eTcVy&dYh!zrfmMZd(KDnFB&_PUB@@ll zyF6frDW$)_JK7H)_z;e)zzu-IC#QZ4Q-8Bgm))BJ;(~X;;@e@-qYk-!Q^1(;?!@knM=D0jm19c+(qgEtWTUz|8_KA6Pc>3KQl(r8z6^!W4Zd0* zzGmhsgRHW0=Gu-nw>z2ZUaETvxK`%+RwD8|&-s#o7*Qetu09BFR+ZUdV6Lr{!Y{78 ztrB<$s_ea~BE8~)^3Atz`PN_^N6Joa=qt*S596g8&~bWBLJ3Bi-sv3+J%RkZniH(2>17&C8; z>A+XzCNO?g>Q!msx!$pGC_#MTXgHi?U82rxGw`5Aqocw<-U5Zz0M^YNp12f;UUzPZikq7|L7P(wSW{q5h<9wh!#j3`-7iW0h_5NnFHi-{uh(*n=|w`n zMusoH;AkjdLNBA7YBIqx1e+R>;*ro(o%U7vd{}sXkHRO7&2L7b=Ibl@3Y+hv zfR3LZ_OHoM>tXy&r%|yT35qC*V4q}!rj&ef|1ntdY3M&Cl$5nJdB@T_)MPe!$1)s9 zR^Ty2=5X)Wwf)|)v|;a`HxkTu4T#q?c*jzqRI1H8c6A{Vgr%HAD)){pt410@ zf`H^YB>O~KiaKAFR)LR_PG1S1S=ol<@JeH=AaGT)cPytw&24BGFGSCWrC;%?UUz}I=QB*utNmcut8m?N&@dtE@ zh6BfQh7&~9zIxzDo|>z;CTesFkWEUiB3l6m1E=OHt^+tIxlhee0NjngFtL_1CIIdM z4p!LLC+FWE5WQyK0LrAWnydVSz>zF9SLjayMM`Qpm8zZ$!C#Don#-5JA?7TsdeQ_W z6xMPS0LSAmET-o2(bvSeQq_}YAkngxV|)SIfSZbzoeB+qfV1N-XyY1^@B-jwj^~Og z_tIFSw_1(@=%x5ea@AbLk^fD@cY>Z&0Kx%w;xA09Ok-vtwo%Y%a9@R|A!(8Q5W(aN{c7@tB}bJF_LDECd!?S&}!`_Rv!JbvZZ`)e9qR|Lec#(*Ah8q*O?Agx{u$uL3R2Zi>L!)Xod3qv^^TZQ7k|)-RD;y#9ovfib1QcEt?fvsyXSpg)xF z9eX%dOBGsPf}HR+BngcWlahLoBkk%!f@ycbJIcdUBYJN5{YA`tjT+AmHI z15Zh(`NBHx5y;hHNe9Mr2O1jq|CXdnH`WLR{=X!Q|D_sws2@Y||079X(MWZaI?lU> zCdOMCclg1$L+Ot7f5@f(q_BTOmh>O(&A+Yy#{VBy!W@6N9@B3S>6{8bJc2c$baL8t z0`$`p^j(Q4ha;KbUrr>@t5VfejVWGTr@>Mq3avI-=1> zA)uxiDIYNMM}io4>xGMwK;d*cYlRx(;a1H!JA8xD9oyQ z+C+hHu^j(UK&bRF)IOK2rjOevU>&FDXNtUIA44*g&!9^mwyE$(2H??)uS>cdzg!w` zTqnG5g>ZD2%6hKT6kL-^Blx|63D}qCJ(yZA_uD669XFA~?h^&{qS!n3zD;eI8dnsE zQgJ%pM<>)eAN4_j^QhD19s4Lu!-1Fh-t$qizspnqaKO7$1Ao)Us#+T5ipK+11)jzZ z-O?m?DKO!i<&aw7-$QuV(kd4!Fn0BpHo1x5_YqdMw9A9F0UM-3gdYXvh#n9=2+$#XnZnhyd&VkYIs^zc+ z;dfYBRV#9&9i>*bqY;tOp%Jg0y@tatgZ; pwjC*D0S|S{rE)+_@X