00001 #include <CoreServices/CoreServices.h>
00002 #include "mach_override.h"
00003
00004
00005 int original( int input );
00006 int override( int input );
00007 void* myMalloc( size_t size );
00008
00009
00010 typedef int (*OriginalFunctionPtrType)( int );
00011 OriginalFunctionPtrType gOriginalReentry;
00012 typedef void* (*mallocFunctionPtrType)( size_t );
00013 mallocFunctionPtrType gMalloc;
00014
00015 int main (int argc, const char * argv[]) {
00016
00017
00018
00019
00020 printf( "*** normal:\n" );
00021 original( 10 );
00022
00023
00024 kern_return_t err = mach_override( "_original", NULL, &override, (void**) &gOriginalReentry );
00025 if( err )
00026 return err;
00027
00028
00029 printf( "*** overriden:\n" );
00030 original( 10 );
00031
00032
00033
00034
00035
00036 err = mach_override( "_malloc", NULL, &myMalloc, (void**) &gMalloc );
00037 if( err )
00038 return err;
00039
00040
00041 printf( "*** malloc overriden:\n" );
00042 malloc( 22 );
00043
00044
00045 return 0;
00046 }
00047
00048 int original( int input ) {
00049 printf( "original input: %d\n", input );
00050 int result = input + 1;
00051 printf( "original result: %d\n", result );
00052 fflush( 0 );
00053 return result;
00054 }
00055
00056 int override( int input ) {
00057 printf( "override input: %d\n", input );
00058 fflush( 0 );
00059 int result = (gOriginalReentry( input + 20 )) - 10;
00060 printf( "override result: %d\n", result );
00061 fflush( 0 );
00062 return result;
00063 }
00064
00065 void* myMalloc( size_t size ) {
00066 void *result = gMalloc( size );
00067 printf( "myMalloc( size: %ld ); result: %p\n", size, result );
00068 return result;
00069 }