diff --git a/Makefile b/Makefile index a3437d6..03a20ea 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,14 @@ OUT = TAL -CC := clang +CC := x86_64-w64-mingw32-gcc +CXX := x86_64-w64-mingw32-g++ TARGET := x86_64-pc-windows-gnu SDL_TARGET := x86_64-w64-mingw32 -SRC = src/dllmain.c src/helpers.c src/poll.c src/boilerplate.c tomlc99/toml.c minhook/src/buffer.c minhook/src/hook.c minhook/src/trampoline.c minhook/src/hde/hde32.c minhook/src/hde/hde64.c -OBJ = ${addprefix ${TARGET}/,${SRC:.c=.o}} -CFLAGS = -std=c99 -Iminhook/include -ISDL/${SDL_TARGET}/include -ISDL/include -Itomlc99 -Wall -Ofast -target ${TARGET} -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=_WIN32_WINNT_WIN7 +SRC = src/dllmain.c src/helpers.c src/poll.c src/boilerplate.c src/card.cpp tomlc99/toml.c minhook/src/buffer.c minhook/src/hook.c minhook/src/trampoline.c minhook/src/hde/hde32.c minhook/src/hde/hde64.c +OBJ = ${addprefix ${TARGET}/,${subst .cpp,.o,${SRC:.c=.o}}} +CFLAGS = -std=c99 -Iminhook/include -ISDL/${SDL_TARGET}/include -ISDL/include -Itomlc99 -Wall -Ofast -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=_WIN32_WINNT_WIN7 +CXXFLAGS = -std=c++20 -Iminhook/include -ISDL/${SDL_TARGET}/include -ISDL/include -Itomlc99 -Wall -Ofast -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=_WIN32_WINNT_WIN7 LDFLAGS := -shared -static -static-libgcc -s -LIBS := SDL/${SDL_TARGET}/build/.libs/libSDL2.a SDL/${SDL_TARGET}/build/.libs/libSDL2main.a -lmingw32 -luuid -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lsetupapi -lversion +LIBS := SDL/${SDL_TARGET}/build/.libs/libSDL2.a SDL/${SDL_TARGET}/build/.libs/libSDL2main.a -lmingw32 -luuid -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lsetupapi -lversion -pthread DEPS = SDL all: options ${OUT} @@ -26,18 +28,21 @@ options: ${TARGET}/%.o: %.c @echo BUILD $@ @${CC} -c ${CFLAGS} $< -o $@ - @clang-tidy -header-filter=.* -system-headers $< -- ${CFLAGS} + +${TARGET}/%.o: %.cpp + @echo BUILD $@ + @${CXX} -c ${CXXFLAGS} $< -o $@ .PHONY: SDL SDL: @mkdir -p SDL/${SDL_TARGET} - @cd SDL/${SDL_TARGET} && ../configure --build=x86_64-linux-gnu --host=${SDL_TARGET} --disable-sdl2-config --disable-shared --enable-assertions=release --enable-directx --enable-haptic + @#cd SDL/${SDL_TARGET} && ../configure --build=x86_64-linux-gnu --host=${SDL_TARGET} --disable-sdl2-config --disable-shared --enable-assertions=release --enable-directx --enable-haptic @make -s -C SDL/${SDL_TARGET} .PHONY: ${OUT} ${OUT}: dirs ${DEPS} ${OBJ} @echo LINK $@ - @${CC} ${CFLAGS} -o ${TARGET}/$@.dll ${OBJ} ${LDFLAGS} ${LIBS} + @${CXX} ${CXXFLAGS} -o ${TARGET}/$@.dll ${OBJ} ${LDFLAGS} ${LIBS} .PHONY: fmt fmt: diff --git a/patches/8.18/dllmain.c b/patches/8.18/dllmain.c index 41a1599..0884a68 100644 --- a/patches/8.18/dllmain.c +++ b/patches/8.18/dllmain.c @@ -1,6 +1,13 @@ #define BASE_ADDRESS 0x140000000 #include "helpers.h" +HOOK_DYNAMIC (u8, __fastcall, qrVtable1, u64 a1) { return 1; } +HOOK_DYNAMIC (u8, __fastcall, qrReadFromCOM1, u64 a1) { + *(u32 *)(a1 + 40) = 1; + *(u32 *)(a1 + 16) = 1; + return 1; +} + i32 __stdcall DllMain (HMODULE mod, DWORD cause, void *ctx) { if (cause != DLL_PROCESS_ATTACH) return 1; @@ -28,5 +35,8 @@ i32 __stdcall DllMain (HMODULE mod, DWORD cause, void *ctx) { WRITE_MEMORY (amHandle + 0x148AF, u8, 0xEB); WRITE_MEMORY (amHandle + 0x14A1A, u8, 0xEB); + INSTALL_HOOK_DYNAMIC (qrVtable1, amHandle + 0x1BA00); + INSTALL_HOOK_DYNAMIC (qrReadFromCOM1, amHandle + 0x1BC20); + return 1; } diff --git a/src/card.cpp b/src/card.cpp new file mode 100644 index 0000000..8d5121d --- /dev/null +++ b/src/card.cpp @@ -0,0 +1,33 @@ +#include "card.h" +#include + +using namespace std::chrono_literals; + +void +attach (callbackAttach callback, i32 *data) { + std::thread t ([callback, data] () { + std::this_thread::sleep_for (250ms); + callback (0, 0, data); + }); + t.detach (); +} + +void +touch (callbackTouch callback, u64 data) { + std::thread t ([callback, data] () { + std::this_thread::sleep_for (250ms); + u8 cardData[168] + = { 0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x2E, 0x58, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x5C, 0x97, 0x44, 0xF0, 0x88, 0x04, 0x00, 0x43, 0x26, 0x2C, 0x33, 0x00, 0x04, + 0x06, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x42, 0x47, 0x49, 0x43, 0x36, + 0x00, 0x00, 0xFA, 0xE9, 0x69, 0x00, 0xF6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + memcpy (cardData + 0x2C, "7F5C9744F111111143262C3300040610", 33); + memcpy (cardData + 0x50, "30764352518498791337", 21); + callback (0, 0, cardData, data); + }); + t.detach (); +} diff --git a/src/card.h b/src/card.h new file mode 100644 index 0000000..bc2d2c7 --- /dev/null +++ b/src/card.h @@ -0,0 +1,10 @@ +#include "helpers.h" + +#ifdef __cplusplus +extern "C" { +#endif +void attach (callbackAttach callback, i32 *data); +void touch (callbackTouch callback, u64 data); +#ifdef __cplusplus +} +#endif diff --git a/src/dllmain.c b/src/dllmain.c index c2e4335..99da3d8 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -1,14 +1,13 @@ #include "boilerplate.h" +#include "card.h" #include "helpers.h" #include "poll.h" +#include bool testEnabled = false; u16 drumMax = 0xFFFF; u16 drumMin = 0xFFFF; -typedef i32 (*callbackAttach) (i32, i32, i32 *); -typedef void (*callbackTouch) (i32, i32, u8[168], u64); - #define ON_HIT(bind) IsButtonTapped (bind) ? drumMax == drumMin ? drumMax : (u16)(rand () % drumMax + drumMin) : 0 Keybindings EXIT = { .keycodes = { VK_ESCAPE } }; @@ -89,11 +88,6 @@ u16 __fastcall bnusio_GetCoin (i32 a1) { return coin_count; } -callbackAttach attach; -i32 *attachData; -callbackTouch touch; -u64 touchData; - u32 __stdcall bnusio_GetSwIn () { u32 sw = 0; sw |= (u32)testEnabled << 7; @@ -101,39 +95,17 @@ u32 __stdcall bnusio_GetSwIn () { sw |= (u32)IsButtonDown (DEBUG_DOWN) << 12; sw |= (u32)IsButtonDown (DEBUG_UP) << 13; sw |= (u32)IsButtonDown (SERVICE) << 14; - - if (attach != 0) { - attach (0, 0, attachData); - attach = 0; - } - if (touch != 0) { - u8 data[168] - = { 0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x2E, 0x58, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x5C, 0x97, 0x44, 0xF0, 0x88, 0x04, 0x00, 0x43, 0x26, 0x2C, 0x33, 0x00, 0x04, - 0x06, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x42, 0x47, 0x49, 0x43, 0x36, - 0x00, 0x00, 0xFA, 0xE9, 0x69, 0x00, 0xF6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - memcpy (data + 0x2C, "7F5C9744F111111143262C3300040610", 34); - memcpy (data + 0x50, "30764352518498791337", 22); - touch (0, 0, data, touchData); - touch = 0; - } return sw; } HOOK_DYNAMIC (u64, __stdcall, bngrw_attach, i32 a1, char *a2, i32 a3, i32 a4, callbackAttach callback, i32 *a6) { - attach = callback; - attachData = a6; + attach (callback, a6); return 1; } HOOK_DYNAMIC (i32, __stdcall, bngrw_reqWaitTouch, u32 a1, i32 a2, u32 a3, callbackTouch callback, u64 a5) { if (!IsButtonDown (CARD_INSERT)) return -1; - touch = callback; - touchData = a5; + touch (callback, a5); return 1; } diff --git a/src/helpers.h b/src/helpers.h index 2d3cfb9..23bea15 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -14,6 +14,8 @@ typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; +typedef i32 (*callbackAttach) (i32, i32, i32 *); +typedef void (*callbackTouch) (i32, i32, u8[168], u64); #ifdef BASE_ADDRESS #define ASLR(address, handle) ((u64)handle + (u64)address - (u64)BASE_ADDRESS)