Skip to content

Commit

Permalink
Add plugin version (#1)
Browse files Browse the repository at this point in the history
  • Loading branch information
praydog committed Nov 15, 2023
1 parent 139a44c commit d229f0b
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 0 deletions.
64 changes: 64 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,67 @@ target_compile_definitions(aw2-cmdline-standalone PUBLIC
unset(CMKR_TARGET)
unset(CMKR_SOURCES)

# Target aw2-cmdline-plugin
set(CMKR_TARGET aw2-cmdline-plugin)
set(aw2-cmdline-plugin_SOURCES "")

list(APPEND aw2-cmdline-plugin_SOURCES
"plugin/Main.cpp"
)

list(APPEND aw2-cmdline-plugin_SOURCES
cmake.toml
)

set(CMKR_SOURCES ${aw2-cmdline-plugin_SOURCES})
add_library(aw2-cmdline-plugin SHARED)

if(aw2-cmdline-plugin_SOURCES)
target_sources(aw2-cmdline-plugin PRIVATE ${aw2-cmdline-plugin_SOURCES})
endif()

source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${aw2-cmdline-plugin_SOURCES})


target_compile_features(aw2-cmdline-plugin PUBLIC
cxx_std_20
)

target_compile_options(aw2-cmdline-plugin PUBLIC
"/GS-"
"/bigobj"
"/EHa"
"/MP"
)

target_include_directories(aw2-cmdline-plugin PUBLIC
"plugin/"
)

target_link_libraries(aw2-cmdline-plugin PUBLIC
kananlib
)

set_target_properties(aw2-cmdline-plugin PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELEASE
"${CMAKE_BINARY_DIR}/bin/${CMKR_TARGET}"
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO
"${CMAKE_BINARY_DIR}/bin/${CMKR_TARGET}"
LIBRARY_OUTPUT_DIRECTORY_RELEASE
"${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO
"${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
ARCHIVE_OUTPUT_DIRECTORY_RELEASE
"${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO
"${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
)

target_compile_definitions(aw2-cmdline-plugin PUBLIC
NOMINMAX
WINVER=0x0A00
)

unset(CMKR_TARGET)
unset(CMKR_SOURCES)

28 changes: 28 additions & 0 deletions cmake.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,32 @@ RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO = "${CMAKE_BINARY_DIR}/bin/${CMKR_TARGET
LIBRARY_OUTPUT_DIRECTORY_RELEASE = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
ARCHIVE_OUTPUT_DIRECTORY_RELEASE = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"

[target.aw2-cmdline-plugin]
type = "shared"
sources = ["plugin/**.cpp", "plugin/**.c"]
headers = ["plugin/**.hpp", "plugin/**.h"]
include-directories = [
"plugin/"
]
compile-options = ["/GS-", "/bigobj", "/EHa", "/MP"]
compile-features = ["cxx_std_20"]
compile-definitions = []
link-libraries = [
"kananlib"
]
cmake-after = """
target_compile_definitions(aw2-cmdline-plugin PUBLIC
NOMINMAX
WINVER=0x0A00
)
"""

[target.aw2-cmdline-plugin.properties]
RUNTIME_OUTPUT_DIRECTORY_RELEASE = "${CMAKE_BINARY_DIR}/bin/${CMKR_TARGET}"
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO = "${CMAKE_BINARY_DIR}/bin/${CMKR_TARGET}"
LIBRARY_OUTPUT_DIRECTORY_RELEASE = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
ARCHIVE_OUTPUT_DIRECTORY_RELEASE = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO = "${CMAKE_BINARY_DIR}/lib/${CMKR_TARGET}"
68 changes: 68 additions & 0 deletions plugin/Main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_sinks.h>

#include <utility/Module.hpp>
#include <utility/Patch.hpp>
#include <utility/RTTI.hpp>

bool ret1() {
return true;
}

bool g_already_patched = false;

void startup_thread() {
AllocConsole();
freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);

// Set up spdlog to sink to the console
spdlog::set_pattern("[%H:%M:%S] [%^%l%$] [cmdline-plugin] %v");
spdlog::set_level(spdlog::level::info);
spdlog::flush_on(spdlog::level::info);
spdlog::set_default_logger(spdlog::stdout_logger_mt("console"));

SPDLOG_INFO("Initializing...");

const auto vtable = utility::rtti::find_vtable(utility::get_executable(), "class std::_Func_impl_no_alloc<bool (__cdecl*)(void),bool>");

if (!vtable) {
SPDLOG_ERROR("Failed to find vtable");
return;
}

SPDLOG_INFO("Found vtable at 0x{:X}", *vtable);

auto vtp = (uintptr_t*)*vtable;

Patch::protect((uintptr_t)&vtp[2], sizeof(void*), PAGE_EXECUTE_READWRITE);
vtp[2] = (uintptr_t)ret1;

SPDLOG_INFO("Patched vtable[2] to 0x{:X}", vtp[2]);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
if (g_already_patched) {
return TRUE;
}

g_already_patched = true;
CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)startup_thread, nullptr, 0, nullptr);
}

return TRUE;
}

extern "C" __declspec(dllexport) void InitializeASI()
{
__try
{
if (!g_already_patched) {
g_already_patched = true;
startup_thread();
}
}
__except ((GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
}
}

0 comments on commit d229f0b

Please sign in to comment.