Changeset 4655


Ignore:
Timestamp:
Sep 22, 2010, 11:21:52 PM (8 years ago)
Author:
Sam Hocevar
Message:

Add a mechanism for Win32 diversions.

Location:
zzuf/trunk/src/libzzuf
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/libzzuf/lib-load.h

    r4253 r4655  
    4242             * as the process is launched. */ \
    4343        } while(0)
     44
     45typedef struct
     46{
     47    char const *lib, *name;
     48    void **old;
     49    void *new;
     50}
     51zzuf_table_t;
     52
     53#   define DIVERT(x) { "kernel32.dll", #x, &x##_orig, x##_new }
     54#   define DIVERT_END { NULL, NULL, NULL, NULL }
     55
     56extern zzuf_table_t table_stream[];
     57
    4458#endif
    4559
  • zzuf/trunk/src/libzzuf/lib-stream.c

    r4375 r4655  
    11471147#endif
    11481148
     1149/* Win32 function table */
     1150zzuf_table_t table_stream[] =
     1151{
     1152    DIVERT(fopen),
     1153    DIVERT(fread),
     1154    DIVERT(fclose),
     1155    DIVERT_END
     1156};
  • zzuf/trunk/src/libzzuf/sys.c

    r4652 r4655  
    3434
    3535#include "sys.h"
     36#include "lib-load.h"
    3637
    3738#if defined HAVE_WINDOWS_H
     
    9192static void insert_funcs(void *module)
    9293{
    93     struct { char const *lib, *name; void **old; void *new; }
    94     diversions[] =
     94    static zzuf_table_t *list[] =
    9595    {
    96 #define DIVERT(x) { "kernel32.dll", #x, &x##_orig, x##_new }
    97         DIVERT(LoadLibraryA),
    98         DIVERT(AllocConsole),
    99         DIVERT(AttachConsole),
     96        table_stream
    10097    };
    10198
     99    zzuf_table_t *diversion;
    102100    unsigned long dummy;
    103101    import_t import;
     
    111109        return;
    112110
    113     for (k = 0; k < sizeof(diversions) / sizeof(*diversions); k++)
     111    for (k = 0; k < sizeof(list) / sizeof(*list); k++)
    114112    {
    115         void *lib = GetModuleHandleA(diversions[k].lib);
    116         *diversions[k].old = (void *)GetProcAddress(lib, diversions[k].name);
     113        for (diversion = list[k]; diversion->lib; diversion++)
     114        {
     115            void *lib = GetModuleHandleA(diversion->lib);
     116            *diversion->old = (void *)GetProcAddress(lib, diversion->name);
    117117
    118         for(j = 0; import[j].Name; j++)
    119         {
    120             char *name = (char *)module + import[j].Name;
    121             if(lstrcmpiA(name, diversions[k].lib) != 0)
    122                 continue;
    123 
    124             thunk = (thunk_t)((char *)module + import->FirstThunk);
    125             for(i = 0; thunk[i].u1.Function; i++)
     118            for(j = 0; import[j].Name; j++)
    126119            {
    127                 void **func = (void **)&thunk[i].u1.Function;
    128                 if(*func != *diversions[k].old)
     120                char *name = (char *)module + import[j].Name;
     121                if(lstrcmpiA(name, diversion->lib) != 0)
    129122                    continue;
    130123
    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, &diversions[k].new,
    135                                    sizeof(diversions[k].new), NULL);
     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                }
    136137            }
    137138        }
Note: See TracChangeset for help on using the changeset viewer.