Update song limit patch
This commit is contained in:
parent
5d79fda758
commit
98915e09da
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -10,7 +10,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Install depends
|
- name: Install depends
|
||||||
run: sudo apt-get install -y mingw-w64 clang && rustup target add x86_64-pc-windows-gnu
|
run: sudo apt-get install -y mingw-w64 clang
|
||||||
- name: Make
|
- name: Make
|
||||||
run: make dist-no-7z
|
run: make dist-no-7z
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
|
3
Makefile
3
Makefile
@ -52,8 +52,6 @@ clean:
|
|||||||
plugins:
|
plugins:
|
||||||
make -C plugins/8.18
|
make -C plugins/8.18
|
||||||
make -C plugins/amauth
|
make -C plugins/amauth
|
||||||
cd plugins/8.18-song-limit && cargo build --release --target x86_64-pc-windows-gnu
|
|
||||||
cp plugins/8.18-song-limit/target/x86_64-pc-windows-gnu/release/song_limit_8_18.dll ${TARGET}
|
|
||||||
strip ${TARGET}/*.dll
|
strip ${TARGET}/*.dll
|
||||||
|
|
||||||
.PHONY: dist-no-7z
|
.PHONY: dist-no-7z
|
||||||
@ -63,7 +61,6 @@ dist-no-7z: options ${OUT} plugins
|
|||||||
mv out/${OUT}.dll out/bnusio.dll
|
mv out/${OUT}.dll out/bnusio.dll
|
||||||
cp ${TARGET}/patches.*.dll out/plugins
|
cp ${TARGET}/patches.*.dll out/plugins
|
||||||
cp ${TARGET}/amauth.dll out/plugins
|
cp ${TARGET}/amauth.dll out/plugins
|
||||||
cp ${TARGET}/song_limit_8_18.dll out/plugins
|
|
||||||
cp -r dist/* out/
|
cp -r dist/* out/
|
||||||
|
|
||||||
.PHONY: dist
|
.PHONY: dist
|
||||||
|
1
plugins/8.18-song-limit/.gitignore
vendored
1
plugins/8.18-song-limit/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
target/
|
|
67
plugins/8.18-song-limit/Cargo.lock
generated
67
plugins/8.18-song-limit/Cargo.lock
generated
@ -1,67 +0,0 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
version = 3
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitflags"
|
|
||||||
version = "1.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.135"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "mach"
|
|
||||||
version = "0.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "region"
|
|
||||||
version = "3.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"libc",
|
|
||||||
"mach",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "song-limit-8-18"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"region",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi"
|
|
||||||
version = "0.3.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
|
||||||
dependencies = [
|
|
||||||
"winapi-i686-pc-windows-gnu",
|
|
||||||
"winapi-x86_64-pc-windows-gnu",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-i686-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|
@ -1,12 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "song-limit-8-18"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["cdylib"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
libc = "0.2.133"
|
|
||||||
region = "3.0.0"
|
|
||||||
winapi = { version = "0.3.9", features = ["libloaderapi"] }
|
|
@ -1 +0,0 @@
|
|||||||
hard_tabs = true
|
|
@ -1,275 +0,0 @@
|
|||||||
#![allow(non_snake_case)]
|
|
||||||
use libc::*;
|
|
||||||
use std::arch::*;
|
|
||||||
use winapi::um::libloaderapi::*;
|
|
||||||
|
|
||||||
const SONG_DATA_SIZE: usize = 1024 * 1024 * 64;
|
|
||||||
static mut SONG_DATA: Option<*mut c_void> = None;
|
|
||||||
static mut HANDLE: Option<usize> = None;
|
|
||||||
|
|
||||||
pub unsafe fn gen_jmp(to: usize) -> Box<[u8]> {
|
|
||||||
// MOV RAX, {TO}
|
|
||||||
// JMP RAX
|
|
||||||
Box::new([
|
|
||||||
0x48,
|
|
||||||
0xB8,
|
|
||||||
to as u8,
|
|
||||||
(to >> 8) as u8,
|
|
||||||
(to >> 16) as u8,
|
|
||||||
(to >> 24) as u8,
|
|
||||||
(to >> 32) as u8,
|
|
||||||
(to >> 40) as u8,
|
|
||||||
(to >> 48) as u8,
|
|
||||||
(to >> 56) as u8,
|
|
||||||
0xFF,
|
|
||||||
0xE0,
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! primitive_ptr {
|
|
||||||
($function:expr) => {
|
|
||||||
$function as *mut ()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! set_crown_data {
|
|
||||||
($offset:literal, $value:literal) => {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"mov rax, qword ptr [rsp + 0x40]",
|
|
||||||
"push rcx",
|
|
||||||
"add rax, r14",
|
|
||||||
"lea rcx, [rax + rax * 8]",
|
|
||||||
concat!("cmp dword ptr [rdx + rcx * 8 + 0x300], ", $value),
|
|
||||||
"jge 1f",
|
|
||||||
concat!("mov dword ptr [rdx + rcx * 8 + 0x300], ", $value),
|
|
||||||
"1:",
|
|
||||||
"pop rcx",
|
|
||||||
"jmp rcx",
|
|
||||||
in("rdx") SONG_DATA.unwrap(),
|
|
||||||
in("rcx") HANDLE.unwrap() + $offset,
|
|
||||||
)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_crown_data_1() {
|
|
||||||
set_crown_data!(0x2F3AF1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_crown_data_2() {
|
|
||||||
set_crown_data!(0x2F3A27, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_crown_data_3() {
|
|
||||||
set_crown_data!(0x2F3C25, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! set_score_rank {
|
|
||||||
($offset:literal, $value:literal) => {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"push rcx",
|
|
||||||
"lea rcx, [0xB + RBX * 4]",
|
|
||||||
"add rcx, rsi",
|
|
||||||
"add rcx, rbx",
|
|
||||||
"lea rax, [rcx + rcx * 8]",
|
|
||||||
concat!("cmp dword ptr [rdx + rax * 8], ", $value),
|
|
||||||
"jge 1f",
|
|
||||||
concat!("mov dword ptr [rdx + rax * 8], ", $value),
|
|
||||||
"1:",
|
|
||||||
"pop rcx",
|
|
||||||
"jmp rcx",
|
|
||||||
in("rcx") HANDLE.unwrap() + $offset,
|
|
||||||
in("rdx") SONG_DATA.unwrap(),
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_1() {
|
|
||||||
set_score_rank!(0x306613, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_2() {
|
|
||||||
set_score_rank!(0x306547, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_3() {
|
|
||||||
set_score_rank!(0x30647B, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_4() {
|
|
||||||
set_score_rank!(0x3068D3, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_5() {
|
|
||||||
set_score_rank!(0x306807, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_6() {
|
|
||||||
set_score_rank!(0x30673B, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_score_rank_7() {
|
|
||||||
set_score_rank!(0x3069D0, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_unknown_data_1() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"lea rcx, [rsi + rsi * 4]",
|
|
||||||
"add rcx, rdi",
|
|
||||||
"lea rax, [rcx + rcx * 8]",
|
|
||||||
"jmp r15",
|
|
||||||
in("rdx") SONG_DATA.unwrap(),
|
|
||||||
in("r15") HANDLE.unwrap() + 0x31376A,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_unknown_data_2() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"lea rcx, [rdi + rdi * 4]",
|
|
||||||
"add rcx, rbx",
|
|
||||||
"lea rax, [rcx + rcx * 8]",
|
|
||||||
"jmp rsi",
|
|
||||||
in("rdx") SONG_DATA.unwrap(),
|
|
||||||
in("rsi") HANDLE.unwrap() + 0x313A20,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_unknown_data_3() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"lea rcx, [rdi + rdi * 4]",
|
|
||||||
"add rcx, rbx",
|
|
||||||
"lea rax, [rcx + rcx * 8]",
|
|
||||||
"jmp r10",
|
|
||||||
in("rdx") SONG_DATA.unwrap(),
|
|
||||||
in("r10") HANDLE.unwrap() + 0x313B61,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_unknown_data_4() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"lea rdx, [rdi + rdi * 4]",
|
|
||||||
"add rdx, rbx",
|
|
||||||
"lea rdx, [rdx + rdx * 8]",
|
|
||||||
"jmp rax",
|
|
||||||
in("r8") SONG_DATA.unwrap(),
|
|
||||||
in("rax") HANDLE.unwrap() + 0x313C57,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_unknown_data_other() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"lea rcx, [rdi + rdi * 4]",
|
|
||||||
"lea rax, [rbx + 0xB]",
|
|
||||||
"add rcx, rax",
|
|
||||||
"lea rax, [rcx + rcx * 8]",
|
|
||||||
"jmp r10",
|
|
||||||
in("rdx") SONG_DATA.unwrap(),
|
|
||||||
in("r10") HANDLE.unwrap() + 0x313D51,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_crown_data_other() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"lea rdx, [rdi + rdi * 4]",
|
|
||||||
"add rdx, rbx",
|
|
||||||
"lea rax, [rdx + rdx * 8]",
|
|
||||||
"jmp rcx",
|
|
||||||
in("r8") SONG_DATA.unwrap(),
|
|
||||||
in("rcx") HANDLE.unwrap() + 0x3140EC,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn set_song_data() {
|
|
||||||
asm!(
|
|
||||||
"add rsp, 0x28",
|
|
||||||
"movsxd rax, edi",
|
|
||||||
"lea rdx, [rax + rax * 4]",
|
|
||||||
"movsxd rax, ebx",
|
|
||||||
"add rdx, rax",
|
|
||||||
"lea rax, [rdx + rdx * 8]",
|
|
||||||
"lea rbx, [r8 + rax * 8]",
|
|
||||||
"jmp rcx",
|
|
||||||
in("r8") SONG_DATA.unwrap(),
|
|
||||||
in("rcx") HANDLE.unwrap() + 0x31369A,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn Init() {
|
|
||||||
let handle = GetModuleHandleA(0 as *const i8) as usize;
|
|
||||||
HANDLE = Some(handle);
|
|
||||||
SONG_DATA = Some(malloc(SONG_DATA_SIZE));
|
|
||||||
memset(SONG_DATA.unwrap(), 0, SONG_DATA_SIZE);
|
|
||||||
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_crown_data_1) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x2F3AC8), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_crown_data_2) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x2F39FE), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_crown_data_3) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x2F3BFC), bytes);
|
|
||||||
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_1) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x3065EA), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_2) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x30651E), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_3) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x306452), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_4) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x3068AA), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_5) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x3067DE), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_6) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x306712), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_score_rank_7) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x3069A2), bytes);
|
|
||||||
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_unknown_data_1) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x313755), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_unknown_data_2) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x313A0B), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_unknown_data_3) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x313B4C), bytes);
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_unknown_data_4) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x313C42), bytes);
|
|
||||||
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_unknown_data_other) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x313D38), bytes);
|
|
||||||
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_crown_data_other) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x3140D7), bytes);
|
|
||||||
|
|
||||||
let bytes = gen_jmp(primitive_ptr!(set_song_data) as usize);
|
|
||||||
write_bytes(primitive_ptr!(handle + 0x31367B), bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn BeforeCard1Insert() {
|
|
||||||
memset(SONG_DATA.unwrap(), 0, SONG_DATA_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn BeforeCard2Insert() {
|
|
||||||
memset(SONG_DATA.unwrap(), 0, SONG_DATA_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn write_bytes<T>(location: *mut T, bytes: Box<[u8]>) -> Option<()> {
|
|
||||||
region::protect(
|
|
||||||
location,
|
|
||||||
bytes.len(),
|
|
||||||
region::Protection::READ_WRITE_EXECUTE,
|
|
||||||
)
|
|
||||||
.ok()?;
|
|
||||||
memcpy(
|
|
||||||
location as *mut libc::c_void,
|
|
||||||
std::ptr::addr_of!(*bytes) as *mut c_void,
|
|
||||||
bytes.len(),
|
|
||||||
);
|
|
||||||
Some(())
|
|
||||||
}
|
|
@ -1,8 +1,9 @@
|
|||||||
OUT = patches.8.18
|
OUT = patches.8.18
|
||||||
CC := clang
|
CC := clang
|
||||||
TARGET := x86_64-pc-windows-gnu
|
TARGET := x86_64-pc-windows-gnu
|
||||||
SRC = dllmain.c
|
SRC = dllmain.c song_limits.s
|
||||||
OBJ = ${addprefix ../../${TARGET}/plugins/8.18/,${SRC:.c=.o}}
|
OBJ_NO_PREFIX = dllmain.o song_limits.o
|
||||||
|
OBJ = ${addprefix ../../${TARGET}/plugins/8.18/,${OBJ_NO_PREFIX}}
|
||||||
EXTERN_SRC = src/helpers.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
|
EXTERN_SRC = src/helpers.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
|
||||||
EXTERN_OBJ = ${addprefix ../../${TARGET}/,${EXTERN_SRC:.c=.o}}
|
EXTERN_OBJ = ${addprefix ../../${TARGET}/,${EXTERN_SRC:.c=.o}}
|
||||||
CFLAGS = -std=c99 -I../../src -I../../minhook/include -I../../tomlc99 -Wall -Ofast -target ${TARGET} -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=_WIN32_WINNT_WIN7
|
CFLAGS = -std=c99 -I../../src -I../../minhook/include -I../../tomlc99 -Wall -Ofast -target ${TARGET} -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=_WIN32_WINNT_WIN7
|
||||||
@ -23,7 +24,11 @@ options:
|
|||||||
|
|
||||||
../../${TARGET}/plugins/8.18/%.o: %.c
|
../../${TARGET}/plugins/8.18/%.o: %.c
|
||||||
@echo BUILD $@
|
@echo BUILD $@
|
||||||
@${CC} -c ${CFLAGS} $< -o $@
|
@bear -- ${CC} -c ${CFLAGS} $< -o $@
|
||||||
|
|
||||||
|
../../${TARGET}/plugins/8.18/%.o: %.s
|
||||||
|
@echo BUILD $@
|
||||||
|
@${CC} -m64 -masm=intel -Wall -Ofast -target ${TARGET} -c $< -o $@
|
||||||
|
|
||||||
.PHONY: ${OUT}
|
.PHONY: ${OUT}
|
||||||
${OUT}: dirs ${OBJ}
|
${OUT}: dirs ${OBJ}
|
||||||
|
@ -1,6 +1,24 @@
|
|||||||
#define BASE_ADDRESS 0x140000000
|
#define BASE_ADDRESS 0x140000000
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
|
|
||||||
|
const u64 song_data_size = 1024 * 1024 * 64;
|
||||||
|
void *song_data;
|
||||||
|
|
||||||
|
extern void set_song_data_rdx ();
|
||||||
|
extern void set_song_data_r8 ();
|
||||||
|
|
||||||
|
#define GENERATE_CALL(to) \
|
||||||
|
0x48, 0xB8, (u8)(u64)(to), (u8)((u64)(to) >> 8), (u8)((u64)(to) >> 16), (u8)((u64)(to) >> 24), (u8)((u64)(to) >> 32), (u8)((u64)(to) >> 40), \
|
||||||
|
(u8)((u64)(to) >> 48), (u8)((u64)(to) >> 56), 0xFF, 0xD0
|
||||||
|
|
||||||
|
#define NOPS_NEEDED(start, return_location) WRITE_NOP ((u64)(start) + 12, (u64)(return_location)-1 - (u64)(start)-11)
|
||||||
|
|
||||||
|
#define HOOK_SONG_DATA(function, start_loc, ret_loc, handle) \
|
||||||
|
{ \
|
||||||
|
WRITE_MEMORY (ASLR (start_loc, handle), u8, GENERATE_CALL (function)); \
|
||||||
|
NOPS_NEEDED (ASLR (start_loc, handle), ASLR (ret_loc, handle)); \
|
||||||
|
}
|
||||||
|
|
||||||
HOOK_DYNAMIC (u8, __fastcall, qrVtable1, u64 a1) { return 1; }
|
HOOK_DYNAMIC (u8, __fastcall, qrVtable1, u64 a1) { return 1; }
|
||||||
HOOK_DYNAMIC (u8, __fastcall, qrReadFromCOM1, u64 a1) {
|
HOOK_DYNAMIC (u8, __fastcall, qrReadFromCOM1, u64 a1) {
|
||||||
*(u32 *)(a1 + 40) = 1;
|
*(u32 *)(a1 + 40) = 1;
|
||||||
@ -56,6 +74,31 @@ PreInit () {
|
|||||||
WRITE_MEMORY (ASLR (0x140314F46, handle), i32, 9000);
|
WRITE_MEMORY (ASLR (0x140314F46, handle), i32, 9000);
|
||||||
WRITE_MEMORY (ASLR (0x140314F97, handle), i32, 9000);
|
WRITE_MEMORY (ASLR (0x140314F97, handle), i32, 9000);
|
||||||
|
|
||||||
|
song_data = malloc (song_data_size);
|
||||||
|
memset (song_data, 0, song_data_size);
|
||||||
|
|
||||||
|
// Song data
|
||||||
|
HOOK_SONG_DATA (set_song_data_r8, 0x140313678, 0x140313685, handle);
|
||||||
|
// Crown data
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x1402F3AC2, 0x1402F3AD0, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x1402F39F8, 0x1402F3A06, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x1402F3BF6, 0x1402F3C04, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_r8, 0x1403140D4, 0x1403140E1, handle)
|
||||||
|
// Score ranks
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x1403065E6, 0x1403065F4, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x14030651A, 0x140306528, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x14030644E, 0x14030645C, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x1403068A6, 0x1403068B4, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x1403067DA, 0x1403067E8, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x14030670E, 0x14030671C, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x14030699E, 0x1403069B1, handle);
|
||||||
|
// Unknown
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x140313752, 0x14031375F, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x140313A08, 0x140313A15, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x140313B49, 0x140313B56, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_rdx, 0x140313D35, 0x140313D42, handle);
|
||||||
|
HOOK_SONG_DATA (set_song_data_r8, 0x140313C3F, 0x140313C4C, handle);
|
||||||
|
|
||||||
// Save settings cross session without F:/ and G:/ drive
|
// Save settings cross session without F:/ and G:/ drive
|
||||||
WRITE_MEMORY (ASLR (0x140B5C528, handle), char, "./Setting1.bin");
|
WRITE_MEMORY (ASLR (0x140B5C528, handle), char, "./Setting1.bin");
|
||||||
WRITE_MEMORY (ASLR (0x140B5C538, handle), char, "./Setting2.bin");
|
WRITE_MEMORY (ASLR (0x140B5C538, handle), char, "./Setting2.bin");
|
||||||
|
10
plugins/8.18/song_limits.s
Normal file
10
plugins/8.18/song_limits.s
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.global set_song_data_rdx
|
||||||
|
.global set_song_data_r8
|
||||||
|
|
||||||
|
set_song_data_rdx:
|
||||||
|
mov rdx, qword ptr song_data [rip]
|
||||||
|
ret
|
||||||
|
|
||||||
|
set_song_data_r8:
|
||||||
|
mov r8, qword ptr song_data [rip]
|
||||||
|
ret
|
Loading…
x
Reference in New Issue
Block a user