Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import core.sys.windows.windows, core.sys.windows.dll;
- import std.concurrency : spawn, yield;
- import std.file : exists, isFile;
- import std.path : dirName;
- import core.runtime;
- import llmo, inifiled;
- __gshared HINSTANCE g_hinst;
- extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID)
- {
- g_hinst = hInstance;
- final switch (ulReason)
- {
- case DLL_PROCESS_ATTACH:
- Runtime.initialize();
- spawn({
- 0A8D: 0@ = read_memory 0xC8D4C0 size 4 virtual_protect false
- repeat
- wait 0
- until 0@ < 9
- 0AB1: call_scm_func @yield 0
- 0AB1: call_scm_func @init 0
- });
- dll_process_attach(hInstance, true);
- break;
- case DLL_PROCESS_DETACH:
- 0AB1: call_scm_func @uninit 0
- Runtime.terminate();
- dll_process_detach(hInstance, true);
- break;
- case DLL_THREAD_ATTACH:
- dll_thread_attach(true, true);
- break;
- case DLL_THREAD_DETACH:
- dll_thread_detach(true, true);
- break;
- }
- return true;
- }
- /// Uninitialize plugin: restore original code
- :uninit
- // Enable background
- 0A8C: write_memory 0x57B7CC size 4 value 0x019C840F virtual_protect false
- 0A8C: write_memory 0x57B7D0 size 2 value 0 virtual_protect false
- 0A8C: write_memory 0x57B9BB size 4 value 0x1AC1A0E8 virtual_protect false
- 0A8C: write_memory 0x57B9BF size 1 value 0 virtual_protect false
- 0A8C: write_memory 0x576E14 size 1 value 0xFF virtual_protect false
- 0A8C: write_memory 0x576E29 size 1 value 0xFF virtual_protect false
- 0A8C: write_memory 0x57B9CA size 2 value 0x3674 virtual_protect false
- // Enable background for map
- 0A8C: write_memory 0x57549D size 4 value 0x1B26BEE8 virtual_protect false
- 0A8C: write_memory 0x5754A1 size 1 value 0 virtual_protect false
- 0A8C: write_memory 0x575458 size 4 value 0x1B26F2E8 virtual_protect false // 0x575469 in 1.00 Hoodlum
- 0A8C: write_memory 0x57545C size 1 value 0 virtual_protect false
- // Disable render world
- 0A8C: write_memory 0x53E9B3 size 4 value 0x0160850F virtual_protect false
- 0A8C: write_memory 0x53E9B7 size 2 value 0 virtual_protect false
- // Restore pause
- 0A8C: write_memory 0x561AF0 size 4 value 0xCB4905C6 virtual_protect false
- 0A8C: write_memory 0x561AF4 size 2 value 0x00B7 virtual_protect false
- 0A8C: write_memory 0x561AF6 size 1 value 1 virtual_protect false
- // Remove hook
- 0A8C: write_memory 0x53E9F9 size 4 value 0x016CE2E8 virtual_protect false
- 0A8C: write_memory 0x53E9FD size 1 value 0 virtual_protect false
- 0AB2: cleo_return 0
- /// Initialize plugin: set hacks and load settings
- :init
- // Disable background
- 0A8C: write_memory 0x57B7CC size 4 value 0x90909090 virtual_protect false
- 0A8C: write_memory 0x57B7D0 size 2 value 0x9090 virtual_protect false
- 0A8C: write_memory 0x57B9BB size 4 value 0x90909090 virtual_protect false
- 0A8C: write_memory 0x57B9BF size 1 value 0x90 virtual_protect false
- 0A8C: write_memory 0x576E14 size 1 value 0 virtual_protect false
- 0A8C: write_memory 0x576E29 size 1 value 0 virtual_protect false
- 0A8C: write_memory 0x57B9CA size 2 value 0xEB36 virtual_protect false // jmp 0057BA02
- // Disable background for map
- 0AF0: 0@ = read_int_from_ini_file "cleo\TransparentMenu.ini" section "Map settings" key "map"
- if 0@ <> 0
- then
- 0A8C: write_memory 0x57549D size 4 value 0x90909090 virtual_protect false
- 0A8C: write_memory 0x5754A1 size 1 value 0x90 virtual_protect false
- 0A8C: write_memory 0x575469 size 4 value 0x90909090 virtual_protect false
- 0A8C: write_memory 0x57546D size 5 value 0x90 virtual_protect false
- end
- // Render world
- 0A8C: write_memory 0x53E9B3 size 2 value 0x4475 virtual_protect false // jne 0053E9F9
- 0A8C: write_memory 0x53E9B5 size 4 value 0x90909090 virtual_protect false
- // No pause
- 0AF0: 0@ = read_int_from_ini_file "cleo\TransparentMenu.ini" section "Game settings" key "game"
- if 0@ == 0
- then
- 0A8C: write_memory 0x561AF0 size 4 value 0x90909090 virtual_protect false
- 0A8C: write_memory 0x561AF4 size 2 value 0x9090 virtual_protect false
- 0A8C: write_memory 0x561AF6 size 1 value 0x90 virtual_protect false
- end
- // Hook render 2D stuff
- auto hook = callToNull;
- immutable hookCallerOffset = hook.length;
- hook ~= callToNull;
- hook ~= callReturn;
- auto hookCaller = cast(ubyte*)(cast(size_t) hook.ptr + hookCallerOffset);
- fixNull(hook.ptr, cast(void*) 0x5556E0);
- fixNull(hookCaller, &render2dStuff);
- setMemoryProtection(hook.ptr, hook.length);
- simpleCallHook(0x53E9F9, cast(void*) hook.ptr, 5);
- 0AB2: cleo_return 0
- /// Hook of Idle for enable/disable game function render2dstuff
- :render2dStuff
- // bak 2@ 3@
- // oldMenuId 4@
- // oldState 5@
- 0A8D: 0@ = read_memory 0xBA68A5 size 1 virtual_protect false // 0@ menuId
- 0A8D: 1@ = read_memory 0xBA67A4 size 1 virtual_protect false // 1@ immutable state
- if 803B: NOT 1@ == 5@ // if (state != oldState) {}
- then
- if 1@ <> 0 // if (state) {}
- then
- // lockMouse();
- 0A8C: write_memory 0x53F44C size 4 value 0x9090D231 virtual_protect false // Lock X
- 0A8C: write_memory 0x53F453 size 4 value 0x9090C031 virtual_protect false // Lock Y
- else
- // unlockMouse();
- 0A8C: write_memory 0x53F44C size 4 value 0x0824548B virtual_protect false
- 0A8C: write_memory 0x53F453 size 4 value 0x0C24448B virtual_protect false
- end
- end
- if and
- 003B: 0@ == 4@ // menuId == oldMenuId
- 003B: 1@ == 5@ // state == oldState
- then
- 0AB2: cleo_return 0
- end
- 0A8D: 2@ = read_memory 0x53EB12 size 1 virtual_protect false // bak
- if and
- 0@ == 5
- 2@ <> 0x90
- then
- 0A8D: 2@ = read_memory 0x53EB12 size 4 virtual_protect false // bak
- 0A8D: 3@ = read_memory 0x53EB16 size 1 virtual_protect false // bak
- 0A8C: write_memory 0x53EB12 size 4 value 0x90909090 virtual_protect false
- 0A8C: write_memory 0x53EB16 size 1 value 0x90 virtual_protect false
- else
- if or
- 4@ == 5
- 1@ == 0
- then
- 0A8C: write_memory 0x53EB12 size 4 value 2@ virtual_protect false
- 0A8C: write_memory 0x53EB16 size 1 value 3@ virtual_protect false
- end
- end
- 0085: 4@ = 0@
- 0085: 5@ = 1@
- 0AB2: cleo_return 0
Add Comment
Please, Sign In to add comment