Changeset 4656


Ignore:
Timestamp:
Sep 23, 2010 12:06:46 AM (4 years ago)
Author:
sam
Message:

CreateFile?() diversion proof of concept.

Location:
zzuf/trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/configure.ac

    r4372 r4656  
    5555AC_CHECK_FUNCS(__open64 __lseek64 __fopen64 __freopen64 __ftello64 __fseeko64 __fsetpos64) 
    5656AC_CHECK_FUNCS(__fgets_chk __fgets_unlocked_chk __fread_chk __fread_unlocked_chk __read_chk __recv_chk __recvfrom_chk) 
     57AC_CHECK_FUNCS(CreateFile) 
    5758 
    5859AC_CHECK_TYPES(sighandler_t, [], [], 
  • zzuf/trunk/msvc/config.h

    r4653 r4656  
    2626#define HAVE_BIND 1 
    2727#define HAVE_CONNECT 1 
     28#define HAVE_CREATEFILE 1 
    2829/* #undef HAVE_DLFCN_H */ 
    2930#define HAVE_DUP 1 
  • zzuf/trunk/msvc/libzzuf.vcxproj

    r4137 r4656  
    127127    <ClCompile Include="..\src\libzzuf\lib-signal.c" /> 
    128128    <ClCompile Include="..\src\libzzuf\lib-stream.c" /> 
     129    <ClCompile Include="..\src\libzzuf\lib-win32.c" /> 
    129130    <ClCompile Include="..\src\libzzuf\libzzuf.c" /> 
    130131    <ClCompile Include="..\src\libzzuf\network.c" /> 
  • zzuf/trunk/src/libzzuf/lib-load.h

    r4655 r4656  
    5454#   define DIVERT_END { NULL, NULL, NULL, NULL } 
    5555 
    56 extern zzuf_table_t table_stream[]; 
     56extern zzuf_table_t table_stream[], 
     57                    table_win32[]; 
    5758 
    5859#endif 
    59  
  • zzuf/trunk/src/libzzuf/sys.c

    r4655 r4656  
    9494    static zzuf_table_t *list[] = 
    9595    { 
    96         table_stream 
     96        table_stream, 
     97        table_win32, 
    9798    }; 
    9899 
    99100    zzuf_table_t *diversion; 
     101    void *lib; 
    100102    unsigned long dummy; 
    101103    import_t import; 
     
    109111        return; 
    110112 
    111     for (k = 0; k < sizeof(list) / sizeof(*list); k++) 
     113    for (k = 0, diversion = NULL; k < sizeof(list) / sizeof(*list); ) 
    112114    { 
    113         for (diversion = list[k]; diversion->lib; diversion++) 
     115        if (!diversion) 
     116            diversion = list[k]; 
     117 
     118        if (!diversion->lib) 
    114119        { 
    115             void *lib = GetModuleHandleA(diversion->lib); 
    116             *diversion->old = (void *)GetProcAddress(lib, diversion->name); 
     120            k++; 
     121            diversion = NULL; 
     122            continue; 
     123        } 
    117124 
    118             for(j = 0; import[j].Name; j++) 
     125        lib = GetModuleHandleA(diversion->lib); 
     126        *diversion->old = (void *)GetProcAddress(lib, diversion->name); 
     127 
     128        for(j = 0; import[j].Name; j++) 
     129        { 
     130            char *name = (char *)module + import[j].Name; 
     131            if(lstrcmpiA(name, diversion->lib) != 0) 
     132                continue; 
     133 
     134            thunk = (thunk_t)((char *)module + import->FirstThunk); 
     135            for(i = 0; thunk[i].u1.Function; i++) 
    119136            { 
    120                 char *name = (char *)module + import[j].Name; 
    121                 if(lstrcmpiA(name, diversion->lib) != 0) 
     137                void **func = (void **)&thunk[i].u1.Function; 
     138                if(*func != *diversion->old) 
    122139                    continue; 
    123140 
    124                 thunk = (thunk_t)((char *)module + import->FirstThunk); 
    125                 for(i = 0; thunk[i].u1.Function; i++) 
    126                 { 
    127                     void **func = (void **)&thunk[i].u1.Function; 
    128                     if(*func != *diversion->old) 
    129                         continue; 
    130  
    131                     /* FIXME: The StarCraft 2 hack uses two methods for function 
    132                      * diversion. See HookSsdt() and HookHotPatch(). */ 
    133                     VirtualProtect(func, sizeof(func), PAGE_EXECUTE_READWRITE, &dummy); 
    134                     WriteProcessMemory(GetCurrentProcess(), func, &diversion->new, 
    135                                        sizeof(diversion->new), NULL); 
    136                 } 
     141                /* FIXME: The StarCraft 2 hack uses two methods for function 
     142                    * diversion. See HookSsdt() and HookHotPatch(). */ 
     143                VirtualProtect(func, sizeof(func), PAGE_EXECUTE_READWRITE, &dummy); 
     144                WriteProcessMemory(GetCurrentProcess(), func, &diversion->new, 
     145                                    sizeof(diversion->new), NULL); 
    137146            } 
    138147        } 
     148 
     149        diversion++; 
    139150    } 
    140151} 
Note: See TracChangeset for help on using the changeset viewer.