Small refactoring & cleanup

This commit is contained in:
Zeex
2014-10-04 17:33:01 +07:00
parent 6f864d4877
commit 9e84a215c1
4 changed files with 19 additions and 11 deletions

View File

@@ -29,7 +29,7 @@
#include <unistd.h>
#include <sys/mman.h>
void *subhook_unprotect(void *address, size_t size) {
void *subhook_unlock(void *address, size_t size) {
intptr_t pagesize;
pagesize = sysconf(_SC_PAGESIZE);

View File

@@ -33,6 +33,6 @@ struct subhook {
void *dst;
};
void *subhook_unprotect(void *address, size_t size);
void *subhook_unlock(void *address, size_t size);
#endif /* SUBHOOK_PRIVATE_H */

View File

@@ -26,7 +26,7 @@
#include <stddef.h>
#include <windows.h>
void *subhook_unprotect(void *address, size_t size) {
void *subhook_unlock(void *address, size_t size) {
DWORD old;
if (VirtualProtect(address, size, PAGE_EXECUTE_READWRITE, &old) == 0)

View File

@@ -72,15 +72,21 @@ SUBHOOK_EXPORT int SUBHOOK_API subhook_install(subhook_t hook) {
return -EINVAL;
if (!hook->unlocked) {
subhook_unprotect(hook->src, sizeof(jmp_instr));
hook->unlocked = 1;
subhook_unlock(hook->src, sizeof(jmp_instr));
hook->unlocked = 1;
}
memcpy(((struct subhook_x86 *)hook)->code, hook->src, sizeof(jmp_instr));
memcpy(hook->src, &jmp_instr, sizeof(jmp_instr));
memcpy(((struct subhook_x86 *)hook)->code,
hook->src,
sizeof(jmp_instr));
memcpy(hook->src,
&jmp_instr,
sizeof(jmp_instr));
offset = (intptr_t)hook->dst - ((intptr_t)hook->src + sizeof(jmp_instr));
memcpy((void *)((intptr_t)hook->src + sizeof(jmp_opcode)), &offset,
offset = (intptr_t)hook->dst - (
(intptr_t)hook->src + sizeof(jmp_instr));
memcpy((void *)((intptr_t)hook->src + sizeof(jmp_opcode)),
&offset,
sizeof(jmp_instr) - sizeof(jmp_opcode));
hook->installed = 1;
@@ -91,7 +97,8 @@ SUBHOOK_EXPORT int SUBHOOK_API subhook_remove(subhook_t hook) {
if (!hook->installed)
return -EINVAL;
memcpy(hook->src, ((struct subhook_x86 *)hook)->code,
memcpy(hook->src,
((struct subhook_x86 *)hook)->code,
sizeof(jmp_instr));
hook->installed = 0;
@@ -106,7 +113,8 @@ SUBHOOK_EXPORT void *SUBHOOK_API subhook_read_dst(void *src) {
if (opcode != jmp_opcode)
return NULL;
memcpy(&offset, (void *)((intptr_t)src + sizeof(jmp_opcode)),
memcpy(&offset,
(void *)((intptr_t)src + sizeof(jmp_opcode)),
sizeof(offset));
return (void *)(offset + (intptr_t)src + sizeof(jmp_instr));
}