From 2048bdb6e17fc147f5d0ff3cdac7d1bd35ec286b Mon Sep 17 00:00:00 2001 From: aaaaaa aaaaaaa Date: Wed, 3 Jan 2018 21:35:00 +0100 Subject: [PATCH] simplify _loop so that the "prologe" is shorter and the jump is back into the first < 5 bytes --- test_cases/backwards.asm | 15 ++++++--------- test_cases/backwards.h | 5 ++--- test_cases/main.cpp | 8 ++++---- tester/mhook.cpp | 4 ++-- tester/mhook.h | 4 ++-- tester/minhook.cpp | 4 ++-- tester/minhook.h | 4 ++-- tester/polyhook.cpp | 4 ++-- tester/polyhook.h | 4 ++-- tester/typedefs.h | 2 +- 10 files changed, 25 insertions(+), 29 deletions(-) diff --git a/test_cases/backwards.asm b/test_cases/backwards.asm index 63b9a9c..0851ce8 100644 --- a/test_cases/backwards.asm +++ b/test_cases/backwards.asm @@ -6,16 +6,13 @@ use64 public _loop _loop: - xor eax, eax - inc eax - mov rbx, rdx ; RDX is overwritten by mul -@again: - cmp rbx, 0 - je @loop_end + mov rax, rcx +@loop_loop: mul rcx - dec rbx - jmp @again -@loop_end: + nop + nop + nop + loop @loop_loop ; lol ret public _tail_recursion diff --git a/test_cases/backwards.h b/test_cases/backwards.h index 683e046..7bf289f 100644 --- a/test_cases/backwards.h +++ b/test_cases/backwards.h @@ -1,12 +1,11 @@ #pragma once extern "C" { /** - * Raises @num @cnt times + * $$ x*x * (x-1)! $$ * - * @param num * @param cnt */ - uint32_t _loop(uint32_t num, uint32_t cnt); + uint32_t _loop(uint32_t x); /** * Computes factorial diff --git a/test_cases/main.cpp b/test_cases/main.cpp index 62e3686..d09b1be 100644 --- a/test_cases/main.cpp +++ b/test_cases/main.cpp @@ -32,10 +32,10 @@ TEST_CASE("Advanced instruction functions work as expected, unhokked") { } TEST_CASE("Loops & tail recursion work as expected, unhook") { - REQUIRE(_loop(2, 3) == 8); - REQUIRE(_loop(5, 3) == 125); - REQUIRE(_loop(5, 0) == 1); - REQUIRE(_loop(5, 1) == 5); + REQUIRE(_loop(1) == 1); + REQUIRE(_loop(2) == 4); + REQUIRE(_loop(3) == 18); + REQUIRE(_loop(5) == 25*24); REQUIRE(_tail_recursion(0) == 1); REQUIRE(_tail_recursion(1) == 1); diff --git a/tester/mhook.cpp b/tester/mhook.cpp index aefc4e9..ccba903 100644 --- a/tester/mhook.cpp +++ b/tester/mhook.cpp @@ -49,10 +49,10 @@ uint32_t MHook_Hooks::hookRDRAND(void) { return trueRDRAND(); } -uint32_t MHook_Hooks::hookLoop(uint32_t num, uint32_t cnt) { +uint32_t MHook_Hooks::hookLoop(uint32_t x) { g_mhook->loop = true; - return trueLoop(num, cnt); + return trueLoop(x); } uint32_t MHook_Hooks::hookTail_recursion(uint32_t x) { diff --git a/tester/mhook.h b/tester/mhook.h index 0707d17..fa5177e 100644 --- a/tester/mhook.h +++ b/tester/mhook.h @@ -6,7 +6,7 @@ namespace MHook_Hooks { uint64_t hookRip_relative(void); void hookAVX(float num, void* res); uint32_t hookRDRAND(void); - uint32_t hookLoop(uint32_t num, uint32_t cnt); + uint32_t hookLoop(uint32_t x); uint32_t hookTail_recursion(uint32_t x); }; @@ -25,6 +25,6 @@ public: friend void MHook_Hooks::hookAVX(float num, void* res); friend uint32_t MHook_Hooks::hookRDRAND(void); - friend uint32_t MHook_Hooks::hookLoop(uint32_t num, uint32_t cnt); + friend uint32_t MHook_Hooks::hookLoop(uint32_t x); friend uint32_t MHook_Hooks::hookTail_recursion(uint32_t x); }; \ No newline at end of file diff --git a/tester/minhook.cpp b/tester/minhook.cpp index 718990f..4c8416c 100644 --- a/tester/minhook.cpp +++ b/tester/minhook.cpp @@ -50,10 +50,10 @@ uint32_t MinHook_Hooks::hookRDRAND(void) { return trueRDRAND(); } -uint32_t MinHook_Hooks::hookLoop(uint32_t num, uint32_t cnt) { +uint32_t MinHook_Hooks::hookLoop(uint32_t x) { g_MinHook->loop = true; - return trueLoop(num, cnt); + return trueLoop(x); } uint32_t MinHook_Hooks::hookTail_recursion(uint32_t x) { diff --git a/tester/minhook.h b/tester/minhook.h index 27efb4d..eaf58be 100644 --- a/tester/minhook.h +++ b/tester/minhook.h @@ -6,7 +6,7 @@ namespace MinHook_Hooks { uint64_t hookRip_relative(void); void hookAVX(float num, void* res); uint32_t hookRDRAND(void); - uint32_t hookLoop(uint32_t num, uint32_t cnt); + uint32_t hookLoop(uint32_t x); uint32_t hookTail_recursion(uint32_t x); }; @@ -28,6 +28,6 @@ public: friend void MinHook_Hooks::hookAVX(float num, void* res); friend uint32_t MinHook_Hooks::hookRDRAND(void); - friend uint32_t MinHook_Hooks::hookLoop(uint32_t num, uint32_t cnt); + friend uint32_t MinHook_Hooks::hookLoop(uint32_t x); friend uint32_t MinHook_Hooks::hookTail_recursion(uint32_t x); }; \ No newline at end of file diff --git a/tester/polyhook.cpp b/tester/polyhook.cpp index 7ed3418..ce4df06 100644 --- a/tester/polyhook.cpp +++ b/tester/polyhook.cpp @@ -49,10 +49,10 @@ uint32_t PolyHook_Hooks::hookRDRAND(void) { return trueRDRAND(); } -uint32_t PolyHook_Hooks::hookLoop(uint32_t num, uint32_t cnt) { +uint32_t PolyHook_Hooks::hookLoop(uint32_t x) { g_PolyHook->loop = true; - return trueLoop(num, cnt); + return trueLoop(x); } uint32_t PolyHook_Hooks::hookTail_recursion(uint32_t x) { diff --git a/tester/polyhook.h b/tester/polyhook.h index ad25688..e45c3c2 100644 --- a/tester/polyhook.h +++ b/tester/polyhook.h @@ -6,7 +6,7 @@ namespace PolyHook_Hooks { uint64_t hookRip_relative(void); void hookAVX(float num, void* res); uint32_t hookRDRAND(void); - uint32_t hookLoop(uint32_t num, uint32_t cnt); + uint32_t hookLoop(uint32_t x); uint32_t hookTail_recursion(uint32_t x); }; @@ -58,6 +58,6 @@ public: friend void PolyHook_Hooks::hookAVX(float num, void* res); friend uint32_t PolyHook_Hooks::hookRDRAND(void); - friend uint32_t PolyHook_Hooks::hookLoop(uint32_t num, uint32_t cnt); + friend uint32_t PolyHook_Hooks::hookLoop(uint32_t num); friend uint32_t PolyHook_Hooks::hookTail_recursion(uint32_t x); }; \ No newline at end of file diff --git a/tester/typedefs.h b/tester/typedefs.h index ccfcc10..9dc0d10 100644 --- a/tester/typedefs.h +++ b/tester/typedefs.h @@ -11,6 +11,6 @@ typedef void (*TypeAVX)(float num, void* res); typedef uint32_t (*TypeRDRAND)(void); -typedef uint32_t (*TypeLoop)(uint32_t num, uint32_t cnt); +typedef uint32_t (*TypeLoop)(uint32_t num); typedef uint32_t (*TypeTailRecursion)(uint32_t x); \ No newline at end of file