📚 OpenRCE is preserved as a read-only archive. Launched at RECon Montreal in 2005. Registration and posting are disabled.








Flag: Tornado! Hurricane!

 Forums >>  Brainstorms - General  >>  detouring by function rebasing - are there any problems with this approach?

Topic created on: April 12, 2010 11:45 CDT by woporo .

Hi,

I wanted a very simple detour (hook) mechanism, for doing obvious stuff like:

BOOL hook_GetCursorPos(POINT *p)
{
  printf("GetCursorPos called\n");

  return real_GetCursorPos(p);
}

The approaches I found were all a bit too big for my taste (EasyHook is nice but very large, microsoft detours approach (e.g. have an additional trampoline code stub) is okay but also a tad too much overhead imho) and rewriting my code with something like:

BOOL hook_GetCursorPos(POINT *p)
{
  BOOL foo;

  printf("GetCursorPos called\n");

  restore_old_code();

  foo = real_GetCursorPos(p);

  put_the_jmp_in_again();

  return foo;
}

is not an option.

So I thought I could just load a DLL, allocate some memory (preferable close to the original image base of the loaded one), copy the image, fixup the base relocation and there you go. Now we have the DLL in memory in a different spot and I can compute the proc address by the difference from the original proc adress in the real DLL. The upside is that I can now just overwrite the original funcs with a bunch of jmps and don't need to restore them because I can call the original function in the second DLL. Nor do I have to rewrite stuff for trampolines (since you'd still have to do some dissasm to make sure the trampoline would work), etc. This all works nicely, I tested it (quickly) on XP through to win7 both on 32 and 64 bit.

Now my question; are there things I'm missing? e.g. are there potential problems? Since I'm only fixing up the base relocation all the other pointers in the DLL still point to the original DLL - but I don't think this is a problem ... or is it? I'm not sure but I have a feeling I could be missing something here so feedback is highly appreciated!

Thanx

  xeon     April 13, 2010 02:36.21 CDT
Hi, I do that in a custom DLL. I inject it in the target process and the DLLMain() of the DLL hook Win32 functions in the target process, by patching the IAT.
No problem with this approach, I think it's very clean.

Note: Registration is required to post to the forums.

There are 31,328 total registered users.


Recently Created Topics
[help] Unpacking VMP...
Mar/12
Reverse Engineering ...
Jul/06
let 'IDAPython' impo...
Sep/24
set 'IDAPython' as t...
Sep/24
GuessType return une...
Sep/20
About retrieving the...
Sep/07
How to find specific...
Aug/15
How to get data depe...
Jul/07
Identify RVA data in...
May/06
Question about memor...
Dec/12


Recent Forum Posts
Finding the procedur...
rolEYder
Question about debbu...
rolEYder
Identify RVA data in...
sohlow
let 'IDAPython' impo...
sohlow
How to find specific...
hackgreti
Problem with ollydbg
sh3dow
How can I write olly...
sh3dow
New LoadMAP plugin v...
mefisto...
Intel pin in loaded ...
djnemo
OOP_RE tool available?
Bl4ckm4n


Recent Blog Entries
halsten
Mar/14
Breaking IonCUBE VM

oleavr
Oct/24
Anatomy of a code tracer

hasherezade
Sep/24
IAT Patcher - new tool for ...

oleavr
Aug/27
CryptoShark: code tracer ba...

oleavr
Jun/25
Build a debugger in 5 minutes

More ...


Recent Blog Comments
nieo on:
Mar/22
IAT Patcher - new tool for ...

djnemo on:
Nov/17
Kernel debugger vs user mod...

acel on:
Nov/14
Kernel debugger vs user mod...

pedram on:
Dec/21
frida.github.io: scriptable...

capadleman on:
Jun/19
Using NtCreateThreadEx for ...

More ...


Imagery
SoySauce Blueprint
Jun 6, 2008

[+] expand

View Gallery (11) / Submit