2010-01-11

Hook api

Небольшой код для перехвата функций методом модификации импорта.

bool HookImport(DWORD Base, DWORD Org, DWORD Hook)
{
    PIMAGE_FILE_HEADER pFileHdr;
    PIMAGE_OPTIONAL_HEADER pOptHdr;
    PIMAGE_IMPORT_DESCRIPTOR pImpDesc;
    bool rv = false;

    pFileHdr = (PIMAGE_FILE_HEADER)(*(PDWORD)(Base+0x3c)+Base+4);
    pOptHdr = (PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHdr+sizeof(IMAGE_FILE_HEADER));
    pImpDesc = (PIMAGE_IMPORT_DESCRIPTOR)(Base +
                pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

    for ( int i=0;pImpDesc[i].Characteristics; i++ )
    {
        char * CurrentModuleName = (char*)(pImpDesc[i].Name + Base);
        PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(pImpDesc[i].FirstThunk + Base);
        for ( int j=0; pThunk[j].u1.Ordinal; j++ )
        {
            if (pThunk[j].u1.Function == Org)
            {
                pThunk[j].u1.Function = Hook;
                rv = true;
                goto Exit;
            }
        }
    }
    Exit:
    return rv;
}

2010-01-05

ASCII [псевдо] арт ;)

В прошлом году было нечем заняться, нарисовал что-то типа подписи, теперь повсюду в свои исходники кидаю, мне нравится )
Выглядет оно вот так:

2010-01-04

Двусвязные списки

Когда-то написал этот простой набор макросов, и юзаю практически везде где требуются двусвязные списки:

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

#define INIT_LIST_HEAD(head) \
  (head)->Flink = (head); \
  (head)->Blink = (head)

#define UNLINK_ENTRY(entry) \
  (entry)->Blink->Flink = (entry)->Flink; \
  (entry)->Flink->Blink = (entry)->Blink

#define ADD_ENTRY(head,entry) \
  (entry)->Flink=(head)->Flink; \
  (entry)->Blink=(head); \
  (head)->Flink->Blink = (entry); \
  (head)->Flink = (entry)

#define ADD_ENTRY_TAIL(head,entry) \
  (head)->Blink->Flink = (entry); \
  (entry)->Blink = (head)->Blink; \
  (entry)->Flink = (head); \
  (head)->Blink = (entry)

#define get_list_entry(type,entry)  (type)(entry)

#define list_for_each(pos, head) \
  for (pos = (head)->Flink; pos!=(head); pos = (pos)->Flink)

#define list_for_each_safe(pos, n, head) \
  for (pos = (head)->Flink, n = pos->Flink; pos != (head);\
    pos = n, n = (pos)->Flink)

#endif // LIST_H_INCLUDED

Архив