
Originally Posted by
why06
Well not the only way. You could scan for every call register opcode and replace it with a jmp to code that would read the specific registers and a compare them with the address of the function your looking for... yeh that wouldn't cause MASSIVE amounts of overhead or a bottleneck. 
Ofcourse there's ways of optimizing such a technique, to "release" or revert back to normal the calls from locations that are consitently not the address your looking for. I suppose it could all get very complex very quickly, my point is simply with significant pattern recognition and a clever enough approach there is a way without setting a breakpoint.
Also I believe this is the third time this was mentioned. Once by me, once by you o_O, and now once more by you again...
I agree, there are ways you can check what the registers contain, but if you write a jmp instruction to check what it is, it then defeats the purpose of having a "new" method of hooking, you may as well just write a jmp over the call instead.
Even using the method I mentioned ( setting a breakpoint to check the contents ), breakpoints can be used for setting hooks as well, so that also defeats the purpose of releasing this "new" method. He has to some how read whats inside the registers without modifying too much code, or not modifying anything at all.
Also, continuing with what I said before about calling using a register as an operand. I took this from my directx9 test environment as an example:
Code:
00403425 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
00403427 |. 50 PUSH EAX
00403428 |. FF91 A8000000 CALL DWORD PTR DS:[ECX+A8]
Without modifying code or setting breakpoints, you won't be able to figure out what the registers contain.
Just like you mentioned, you CAN read the op-codes to see what the instruction is doing but you can't do anything more. So you would take 8B08, convert it into the instruction, now you know what its moving into what register, but you won't be able to find out what it's moving.