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.