Ignore:
Timestamp:
Sep 23, 2010, 12:06:46 AM (10 years ago)
Author:
Sam Hocevar
Message:

CreateFile?() diversion proof of concept.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.