Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Небольшие полезные коды
<< . 1 . 2 . 3 . >>
Посл.ответ Сообщение

Ранг: 47.1 (посетитель), 2thx
Активность: 0.030
Статус: Участник

Создано: 09 февраля 2010 18:42 · Поправил: Vol4ok
· Личное сообщение · #1

Часто во время написания проектов возникают небольшие, но при этом довольно общие задачи, которые потом могут быть использованы в будущем, вот эта тема как раз для этого. В этой теме предлагаю размещать небольшие фрагменты кода, которые могут применятся в повседневной практике системного программирования.

В этом топике можно
- размещать только свои коды, а не копировать из общедоступных источников
- желательно хорошо протестировать код, прежде чем разместить его. Если вы не уверены, что код работает точно будет работать так как надо на всех ОС и всех процах, то надо пометить - где и каким образом тестировался этот код, или вообще написать что код не тестирован (хорошо подумав при это, стоит ли вообще такой код размещать).
- нормально его оформить, чтобы тот кому этот код пригодится смог разобраться в нем быстрее чем писать это же с нуля. Обязательно должны быть описания входных и выходных данных. Крайне приветствуются цели создания кода, основные требования которым он удовлетворяет, и описание того как работает этот код.

Также приветствуются багфиксы, замечания по коду и варианты оптимизации.

Итак начну с себя. Недавно столкнулся с необходимостью делать высокоточные паузы в работе кода, в моем случае необходимо было достигать точности десятых милисекунд. В итоге я написал микросекундный таймер

Code:
  1. #define YIELD_LOOP 200
  2. #define get_interval_in_us(_t1_,_t2_,_fq_) (int)((_t2_.QuadPart - _t1_.QuadPart)*1000000 / _fq_.QuadPart)
  3.  
  4. static int g_sleep_error = 1000;
  5.  
  6. void precision_sleep(int timeout)
  7. {
  8.          int i;
  9.          int sleep_time;
  10.          int real_sleep_time;
  11.  
  12.          LARGE_INTEGER t2;
  13.          LARGE_INTEGER t1;
  14.          LARGE_INTEGER fq;
  15.  
  16.          QueryPerformanceCounter(&t1);
  17.          QueryPerformanceFrequency(&fq);
  18.  
  19.          if (timeout > g_sleep_error) {
  20.                  sleep_time = timeout - g_sleep_error;
  21.                  Sleep(sleep_time/1000);
  22.          }
  23.  
  24.          QueryPerformanceCounter(&t2);
  25.  
  26.          real_sleep_time = get_interval_in_us(t1,t2,fq);
  27.  
  28.          if (timeout < real_sleep_time)
  29.                  g_sleep_error += (real_sleep_time - timeout)/2;
  30.          else if (g_sleep_error > 2000)
  31.                  g_sleep_error -= min((timeout - real_sleep_time)/2, g_sleep_error/2);
  32.  
  33.          while (get_interval_in_us(t1,t2,fq) < timeout) {
  34.                  for (i=0;i<YIELD_LOOP;i++)
  35.                         YieldProcessor();
  36.                  //Sleep(0);
  37.                  QueryPerformanceCounter(&t2);
  38.          }
  39. }

- timeout - время таймаута в микросекундах

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

#include <Mmsystem.h>
...
timeBeginPeriod(1);
precision_sleep(timeout);
timeEndPeriod(1);

Код делает таймауты с микросекундой точностью. Как извесно простой Sleep имеет огромную погрешность, допутим Sleep(1) - в нормальных условиях выполнется около 10-15мс (1,5-2мс при установке timeBeginPeriod(1)). Высокая точность достигается за счет использования цикла опроса высокоточного системного таймера (период <1нс - на современных компах и 300-400нс на более старых). Минимальная погрешность данной функции равна времени вызова QueryPerformanceCounter - которое на современных компах равно 200-300нс, на компах по старше может доходить до микросекунды. Ес-но в условиях нехватки процессорного времени погрешность может значительно возрастать.

Конечно такой метод измерения сильно грузит проц, поэтому при ожидании более 1мс будет использоваться обыкновенный слип, но поскольку он имеет большую погрешность, то динамически в при многократном вызове, precision_sleep проводит пересчет предельной погрешности слипа, подгоняя его под оптимальное значение, при котором будет сохранена хорошая точность при минимальной нагрузке на процессор. Однако не смотря на это всегда имеется вероятность того что слип превысит предельное время и внесет дополнительную погрешность.

Код тестировался на 2х ядероном компе с процом core2duo и на старом одноядерном Celeron-е
При тестировании интервалов больших 3мс загрузка процессора скачет 1% до 15%, при интервалах больих 10мс в средем чтото около 2-3%. Хуже всего дело обстоит с таймаутами порядка 1мс и менее, загрузка может быть очень большой, так как слип в этом случае не работает, чуть чуть улутшить положение можно если заменить
for (i=0;i<YIELD_LOOP;i++)
YieldProcessor();
на Sleep(0), будет небольшая потеря точности, на моем компе Sleep(0) работает примерно за 1-2мкс (на старых компах может быть еще больше) когда YIELD_LOOP работает < 1 мкс

Данный код может быть использован при написании сетевых приложений, например для того чтобы точно регуоировать скорость выходного трафика.



Ранг: 13.9 (новичок), 9thx
Активность: 0.010
Статус: Участник

Создано: 11 апреля 2010 20:17 · Поправил: ADACH
· Личное сообщение · #2

Самовыгружение dll из памяти.
Ф-я принимает параметром ImageBase модуля который необходимо выгрузить.
Warning! Поток в чьём контексте исполняется код, будет закрыт.
Code:
  1. void __declspec(noreturn) unloadLibrary(HMODULE hDll)
  2. {
  3.          /*
  4.          _start:
  5.          push edi
  6.          call near esi
  7.          test eax,eax
  8.          je _start
  9.          mov eax,ebx
  10.          pop ebx
  11.          pop esi
  12.          pop edi
  13.          jmp near eax
  14.          */
  15.          const char dllUnloadCode [] = {0x57, 0xFF, 0xD6, 0x85, 0xC0, 0x74, 0xF9, 0x8B, 0xC3, 0x5B, 0x5E, 0x5F, 0xFF, 0xE0};
  16.          char * memAddr = (char *)VirtualAllocEx(GetCurrentProcess(),
  17.                  NULL,
  18.                  1,
  19.                  MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  20.          memcpy(memAddr,dllUnloadCode,sizeof(dllUnloadCode));
  21.          _asm
  22.          {
  23.                  push ebx
  24.                  push esi
  25.                  push edi
  26.                  mov edi,[hDll]
  27.                  mov esi,[FreeLibrary]
  28.                  mov ebx,[ExitThread]
  29.                         jmp [memAddr]
  30.          }
  31.  
  32. };




Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 12 апреля 2010 09:41
· Личное сообщение · #3

> Самовыгружение dll из памяти.
а потом ещё сам процесс упадёт скорее всего

-----
Shalom ebanats!





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 12 апреля 2010 12:57
· Личное сообщение · #4

SLV пишет
а потом ещё сам процесс упадёт скорее всего


Не, не упадет. Я пробовал, только по-другому: со снятием хуков, ведущей на эту dll, а потом выгрузка...

-----
IZ.RU




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 12 апреля 2010 16:05
· Личное сообщение · #5

ADACH
FreeLibraryAndExitThread() ?



Ранг: 13.9 (новичок), 9thx
Активность: 0.010
Статус: Участник

Создано: 12 апреля 2010 22:08
· Личное сообщение · #6

[OFFTOPIC]
SLV пишет:
> Самовыгружение dll из памяти.
а потом ещё сам процесс упадёт скорее всего

Нет не упадёт, произойдёт корректная остановка потока с помощью ExitThread.

Clerk пишет:
ADACH
FreeLibraryAndExitThread() ?

да

[/OFFTOPIC]



Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 15:10 · Поправил: punxer
· Личное сообщение · #7

Code:
  1. void DebugPrintF(const char* Format,...)
  2. {
  3.          va_list args;
  4.          int len;
  5.          char * buffer;
  6.  
  7.          va_start( args, Format );
  8.          len = _vscprintf( Format, args ) + 1;
  9.          buffer =(char*) malloc( len * sizeof(char) );
  10.          vsprintf( buffer, Format, args );
  11.          OutputDebugString(buffer);
  12.          free( buffer );
  13.          va_end(args);
  14.          return;
  15. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 16:00
· Личное сообщение · #8

Code:
  1.  
  2. void GenerateKey ( WORD vk)
  3. {
  4.          KEYBDINPUT  kinpt={0};
  5.          INPUT            inpt={0};
  6.          // generate down 
  7.          inpt.type=INPUT_KEYBOARD;
  8.          kinpt.wVk=vk;
  9.          kinpt.time=NULL;
  10.          kinpt.dwExtraInfo=NULL;
  11.          kinpt.wScan=NULL;
  12.          kinpt.dwFlags=NULL;
  13.          inpt.ki=kinpt;
  14.  
  15.          SendInput(1,&inpt,sizeof(inpt));
  16.          kinpt.dwFlags=KEYEVENTF_KEYUP;
  17.          Sleep(200);
  18.          SendInput(1,&inpt,sizeof(inpt));
  19.          return;
  20. }
  21.  
  22.  
  23. void GenerateKbdEvent (WORD vk)
  24. {
  25.          keybd_event((BYTE)vk,NULL,NULL,NULL);
  26.          keybd_event((BYTE)vk,NULL,KEYEVENTF_KEYUP,NULL);
  27.  
  28.          return;
  29. }
  30.  
  31.  
  32. void PostVkeyMessage(HWND hWnd,WORD vk)
  33. {
  34.          PostMessage(hWnd,WM_KEYDOWN,VK_RETURN,NULL);
  35.          Sleep(100);
  36.          PostMessage(hWnd,WM_KEYUP,VK_RETURN,NULL);
  37.  
  38.          return;
  39. }
  40.  
  41. void SendVkeyMessage(HWND hWnd,WORD vk)
  42. {
  43.          SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,NULL);
  44.          Sleep(100);
  45.          SendMessage(hWnd,WM_KEYUP,VK_RETURN,NULL);
  46.  
  47.          return;
  48. }
  49. void GenerateKbdUPEvent (WORD vk)
  50. {
  51.          
  52.          keybd_event((BYTE)vk,NULL,KEYEVENTF_KEYUP,NULL);
  53.          return;
  54. }
  55.  
  56.  
  57.  




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 16:01
· Личное сообщение · #9

Code:
  1.  
  2. DWORD HookCOM(PVOID* lplpI,DWORD offs,DWORD new_fn,DWORD vtbl_size)
  3. {
  4.          DWORD   ret=               NULL;
  5.          DWORD*  ppvtbl=      NULL;
  6.          DWORD*  pvtbl=      NULL;
  7.          DWORD   flOldProtect=      NULL;
  8.          DWORD   flNewProtect=      NULL;
  9.          DWORD   flDontCare=               NULL;
  10.          DWORD*  pOldFN=            NULL;
  11.  
  12.          MEMORY_BASIC_INFORMATION mbi;
  13.          
  14.          ppvtbl = (DWORD*)*lplpI;
  15.          pvtbl = (DWORD*) *ppvtbl;
  16.          
  17.          
  18.  
  19.             
  20.          VirtualQuery( (void*)pvtbl, &mbi, sizeof(mbi) );
  21.  
  22.          // remove ReadOnly and ExecuteRead attributes, add on ReadWrite flag
  23.          flNewProtect = mbi.Protect;
  24.          flNewProtect &= ~(PAGE_READONLY | PAGE_EXECUTE_READ | PAGE_EXECUTE);
  25.          flNewProtect |= (PAGE_READWRITE);
  26.  
  27.          if ( !VirtualProtect(   (void*)pvtbl, sizeof(PVOID)*vtbl_size,
  28.                                flNewProtect, &flOldProtect) )
  29.          {
  30.                  return false;
  31.          }
  32.  
  33.          //Hook Vtbl
  34.          pOldFN = MakePtr(DWORD*,pvtbl,offs);
  35.          ret=*pOldFN;
  36.          *pOldFN=(DWORD) new_fn;
  37.  
  38.          VirtualProtect((void*)pvtbl, sizeof(PVOID), flOldProtect, &flDontCare);
  39.  
  40.          return ret;
  41.  
  42.  
  43. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 16:03
· Личное сообщение · #10

Code:
  1. void    WinErrDebugOut ( void)
  2. {
  3.     CHAR    *Buffer;
  4.     DWORD    LangId    = 0x400; // Default.
  5.  
  6.     FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  7.         NULL, GetLastError(), LangId,  Buffer, 0, NULL );
  8.  
  9.          DebugPrintF("%s", Buffer);
  10.          LocalFree( Buffer);
  11.          return;
  12.  
  13. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 26 мая 2010 14:34
· Личное сообщение · #11

Делает текущего пользователя владельцем файла

Code:
  1.  
  2. bool GetOwnership (LPCSTR p)
  3. {
  4.          HANDLE hToken=NULL;
  5.          PTOKEN_USER ptuUser=NULL;
  6.          DWORD dwSize=NULL;
  7.          SECURITY_DESCRIPTOR sdSID;
  8.          int bWasEnabled;
  9.          bool ret1=false,ret2=false;
  10.  
  11.  
  12.          RtlAdjustPrivilege(SE_TAKE_OWNERSHIP_PRIVILEGE,TRUE,FALSE,(PBOOLEAN)& bWasEnabled);
  13.          OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hToken);
  14.          ptuUser=(PTOKEN_USER)malloc(0x200);
  15.  
  16.          GetTokenInformation(hToken,(TOKEN_INFORMATION_CLASS)1,ptuUser,0x200,& dwSize);
  17.  
  18.          InitializeSecurityDescriptor (&sdSID,SECURITY_DESCRIPTOR_REVISION);
  19.          SetSecurityDescriptorOwner (&sdSID,ptuUser->User.Sid,false);
  20.          CloseHandle(hToken);
  21.          ret1=SetFileSecurityA(p,OWNER_SECURITY_INFORMATION,&sdSID);
  22.          if (!ret1) return false;
  23.          ret2=SetFileSecurityA(p,DACL_SECURITY_INFORMATION,&sdSID);
  24.          if (!ret2) return false;
  25.          return true;
  26. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 26 мая 2010 14:37
· Личное сообщение · #12

Добавляет ДЛЛ в таблицу импорта

Code:
  1.   
  2. int infectByDLL (PCHAR path,PCHAR OUR_DLL_NAME,PCHAR OUR_FUNC_NAME )
  3. {
  4.          IMAGE_DOS_HEADER* mz_head;
  5.          IMAGE_FILE_HEADER* pe_head;
  6.          IMAGE_OPTIONAL_HEADER* pe_opt_head;
  7.          IMAGE_SECTION_HEADER* sect;
  8.          HANDLE hFile=NULL;
  9.          HANDLE hMap=NULL;
  10.          PVOID hMapFile=NULL;
  11.          DWORD size=0;
  12.          DWORD sizehi=0;
  13.          char pe[] = "PE\0\0";
  14.          PVOID tmp=NULL;
  15.  
  16.          
  17.          hFile=CreateFile(path, GENERIC_READ | GENERIC_WRITE,
  18.                         FILE_SHARE_WRITE, NULL,
  19.                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  20.          if (!hFile) 
  21.          {
  22.                  printf("File open failed");
  23.                  return 0;
  24.          }
  25.  
  26.          hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
  27.          if (!hMap) 
  28.          {
  29.                  printf("Map object is not created");
  30.                  CloseHandle(hFile);
  31.                  return 0;
  32.          }
  33.          hMapFile=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
  34.          if (!hMapFile) 
  35.          {
  36.                  printf("File Mapping not success");
  37.                  CloseHandle(hMap);
  38.                  CloseHandle(hFile);
  39.                  return 0;
  40.          }
  41.          mz_head=(IMAGE_DOS_HEADER*)hMapFile;
  42.          pe_head =(IMAGE_FILE_HEADER*)((char*)hMapFile + mz_head->e_lfanew);
  43.  
  44.  
  45.     if ( strcmp(pe,(const char *)pe_head) != 0)
  46.         {
  47.                         printf("It is not PE File");
  48.                         UnmapViewOfFile(hMapFile);
  49.                         CloseHandle(hMap);
  50.                         CloseHandle(hFile);
  51.                         return 0;
  52.         }
  53.          pe_head =(IMAGE_FILE_HEADER*)((char*)hMapFile + mz_head->e_lfanew+sizeof(DWORD));
  54.          pe_opt_head =( IMAGE_OPTIONAL_HEADER*)((DWORD)pe_head + sizeof(IMAGE_FILE_HEADER));
  55.     
  56.          int sect_num = -1;
  57.          DWORD ImportRVA = pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddres s;
  58.          sect = (IMAGE_SECTION_HEADER*)((DWORD)pe_opt_head + sizeof(IMAGE_OPTIONAL_HEADER));
  59.          
  60.     for ( int i=0; i<pe_head->NumberOfSections; i++)
  61.     {
  62.         if ( ImportRVA < sect->VirtualAddress )
  63.         {
  64.             sect--;
  65.             sect_num=i-1;
  66.             break;
  67.         }
  68.         sect++;
  69.      }
  70.          if (sect_num == -1)
  71.     {
  72.                  printf("Import Data not presented");
  73.                  UnmapViewOfFile(hMapFile);
  74.                  CloseHandle(hMap);
  75.                  CloseHandle(hFile);
  76.                  return 0;
  77.     }
  78.     sect++;
  79.     DWORD AfterImportSecBeg = (DWORD)hMapFile + sect->PointerToRawData;
  80.     sect--;
  81.          printf("Import table:");
  82.  
  83.     LPVOID ImportSecBeg;
  84.     ImportSecBeg = (LPVOID)((DWORD)hMapFile + sect->PointerToRawData);
  85.  
  86.     LPVOID ImportTable;
  87.     ImportTable = (LPVOID)(ImportRVA - sect->VirtualAddress);
  88.     ImportTable = (LPVOID)((DWORD)ImportSecBeg+ (DWORD)ImportTable);
  89.  
  90.     IMAGE_IMPORT_DESCRIPTOR *DLLInfo = (IMAGE_IMPORT_DESCRIPTOR *)ImportTable;
  91.     PCHAR DLLName;
  92.     DWORD DLLCounter = 0;
  93.          printf("Import Table Entries:\n");
  94.     while (DLLInfo->Name != NULL)
  95.     {
  96.                  DLLCounter++;
  97.                  DLLName = (PCHAR)((DWORD)DLLInfo->Name - sect->VirtualAddress);
  98.                  DLLName = (PCHAR)((DWORD)ImportSecBeg + (DWORD)DLLName);
  99.                  printf("%d:->%s\n",DLLCounter,DLLName);
  100.                  DLLInfo++;
  101.     }
  102.  
  103.     //
  104.     //Counting needed size in bytes for new import table
  105.     DWORD NewImportTableSize = sizeof(IMAGE_IMPORT_DESCRIPTOR)*(DLLCounter+2);
  106.  
  107.     //Получаем файловый указатель на конец секции импорта
  108.     LPBYTE pos;
  109.     pos = (LPBYTE)AfterImportSecBeg-1;
  110.  
  111.     DWORD maxFree = 0;
  112.     DWORD prevPtr;
  113.     LPBYTE FreePtr = NULL;
  114.  
  115.     //Ищем свободное место в секции...
  116.     while ( pos >= ImportSecBeg )
  117.       {
  118.       if ( *(BYTE *)pos == 0x00  )
  119.          {
  120.          prevPtr =(DWORD) pos;
  121.          while (*(BYTE *)pos == 0x00)
  122.             pos -= 4;
  123.          if ( ((DWORD)prevPtr - (DWORD)pos) > maxFree )
  124.             {
  125.             maxFree = ((DWORD)prevPtr - (DWORD)pos);
  126.             FreePtr = pos + 4;
  127.             }
  128.          }
  129.       pos -= 4;
  130.       }
  131.  
  132.    //Модифицируем полученный указатель на свободный блок, т.к.
  133.    //он может указывать на завершающий нулевой DWORD какой-либо структуры
  134.    FreePtr +=4;
  135.    maxFree -=4;
  136.  
  137.          printf("Free Size Ptr:->%x\n",FreePtr-(LPBYTE)hMapFile);
  138.          printf("Free Size:->%d\n",maxFree);
  139.          printf("Analizing free size...\n");
  140.    //Проверяем объем свободного места
  141.          if ( maxFree < NewImportTableSize )
  142.     {
  143.                  printf("Don't have enough free size\n");
  144.                  UnmapViewOfFile(hMapFile);
  145.                  CloseHandle(hMap);
  146.                  CloseHandle(hFile);
  147.                  return 0;
  148.     }
  149.          else
  150.                  printf("Free size presented\n");
  151.  
  152.  
  153. ///////
  154.  
  155.    //1. Копируем старую таблицу импорта в новое место
  156.    memcpy(FreePtr, ImportTable, sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter);
  157.  
  158.    //2.1 Сохраняем строку с именем нашей DLL в старой таблице импорта
  159.    //(для экономии места)
  160.    memcpy(ImportTable, OUR_DLL_NAME, lstrlenA(OUR_DLL_NAME));
  161.  
  162.    BYTE* zeroPtr;
  163.    zeroPtr =(BYTE*) ((DWORD)ImportTable + lstrlenA(OUR_DLL_NAME));
  164.  
  165.    //2.2 Сохраняем структуру IMAGE_IMPORT_BY_NAME в старой таблице импорта.
  166.    //(так же для экономии места)
  167.    IMAGE_IMPORT_BY_NAME myName;
  168.    myName.Hint = 0x00;
  169.    myName.Name[0] = 0x00;
  170.  
  171.    WORD Hint = 0;
  172.    char* myFuncName = OUR_FUNC_NAME;
  173.  
  174.    hackRec patch;
  175.    patch.ZeroDword = NULL;
  176.    patch.IAT = ImportRVA + lstrlenA(OUR_DLL_NAME) + sizeof(hackRec);
  177.    patch.IATEnd = NULL;
  178.  
  179.    DWORD IIBN_Table;
  180.  
  181.    memcpy(zeroPtr, &patch, sizeof(patch));
  182.    zeroPtr += sizeof(patch);
  183.    memcpy(zeroPtr, &Hint, sizeof(WORD));
  184.    zeroPtr += sizeof(WORD);
  185.    memcpy(zeroPtr, myFuncName, lstrlenA(myFuncName)+1 );
  186.    zeroPtr += lstrlenA(myFuncName)+1;
  187.    memcpy(zeroPtr, &myName, sizeof(IMAGE_IMPORT_BY_NAME) );
  188.  
  189.    //2.3. Заполняем структуру IMAGE_IMPORT_BY_NAME данными о нашей DLL
  190.    IMAGE_IMPORT_DESCRIPTOR myDLL;
  191.  
  192.    //Вычисляем указатель на нашу структуру IMAGE_IMPORT_BY_NAME: 
  193.    //это адрес начала старой таблицы импорта + длинна строки с именем 
  194.    //нашей DLL + нулевой DWORD
  195.    IIBN_Table = ImportRVA + lstrlenA( OUR_DLL_NAME ) + sizeof(DWORD);
  196.  
  197.    //Указатель на таблицу Characteristics
  198.    myDLL.Characteristics = IIBN_Table;
  199.    myDLL.TimeDateStamp = NULL;
  200.    myDLL.ForwarderChain = NULL;
  201.  
  202.    //Записываем адрес строки с именем файла нашей DLL
  203.    myDLL.Name = ImportRVA;
  204.  
  205.    //Указатель на таблицу FirstThunk
  206.    myDLL.FirstThunk = IIBN_Table;
  207.  
  208.    //Записываем в новую таблицу импорта запись о нашей DLL
  209.    LPBYTE OldFreePtr = FreePtr;
  210.    
  211.    FreePtr +=sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter;
  212.    memcpy(FreePtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR));
  213.  
  214.    //Создаем "финальную" нулевую запись со всеми полями равными нулю
  215.    myDLL.Characteristics = NULL;
  216.    myDLL.TimeDateStamp = NULL;
  217.    myDLL.ForwarderChain = NULL;
  218.    myDLL.Name = NULL;
  219.    myDLL.FirstThunk = NULL;
  220.    
  221.    //И записываем её в конец новой таблицы импорта.
  222.    FreePtr +=sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter;
  223.    memcpy(FreePtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR));
  224.  
  225.    //3. Устанавливаем указатель на нашу таблицу импорта.
  226.    // Вычисляем RVA нашей таблицы
  227.    DWORD NewImportTableRVA = (DWORD)OldFreePtr - (DWORD)ImportSecBeg +
  228.                               sect->VirtualAddress;
  229.  
  230.    // Заносим его в DataDirectory
  231.    pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddres s =
  232.                               NewImportTableRVA;
  233.    pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size =
  234.             (DLLCounter +1) * sizeof(IMAGE_IMPORT_DESCRIPTOR);
  235.  
  236.    //Additional changes 28.11.2002
  237.    pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Virtual Address = 0;
  238.    pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
  239.  
  240.    pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = 0;
  241.    pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = 0;
  242.  
  243.          printf("with God help it must be working...\n");
  244.          getch();
  245. //////////////////
  246.  
  247.          UnmapViewOfFile(hMapFile);
  248.          CloseHandle(hMap);
  249.          CloseHandle(hFile);
  250.          return 0;
  251. }
  252.  
  253.  
  254.  




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 26 мая 2010 14:45
· Личное сообщение · #13

Code:
  1. bool path_exist(PCHAR path)
  2. {
  3.          DWORD ret=NULL;
  4.  
  5.          ret=GetFileAttributesA(path);
  6.          if (ret==INVALID_FILE_ATTRIBUTES)
  7.                  return false;
  8.          
  9.  
  10.          return true;
  11. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 26 мая 2010 14:54
· Личное сообщение · #14

Простенькое обратимое шифрование ксором с ключом
Code:
  1. void decode_mem(PCHAR mem,int size)
  2. {
  3.          int i=NULL;
  4.          do
  5.                  *(BYTE *)(i++ + (DWORD)mem) ^= calc_xor_arg();
  6.          while ( i < size );
  7. }
  8.  
  9. DWORD calc_xor_arg()
  10. {
  11.          DWORD xor_arg=NULL;
  12.          xor_arg = 214013 * key + 2531011;
  13.          key = xor_arg;
  14.          return xor_arg >> 24;
  15. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 26 мая 2010 14:59 · Поправил: punxer
· Личное сообщение · #15

Оборачиваем чужой сокет в SSL
Код выдернут из проекта так что много лишнего но суть ясна
Code:
  1.  
  2. int WINAPI MyConnect(IN SOCKET s,IN sockaddr* name,IN int namelen)
  3. {
  4.          char       buff[255];
  5.  
  6.          int        ret=             NULL;
  7.          int        wr_ret=       NULL;
  8.          int        read_ret=  NULL;
  9.          int            len=             NULL;
  10.          au_packet        tmpp;
  11.          au_packet        pack;
  12.          bool       optval=       true;
  13.  
  14.  
  15.          //OutputDebugString("MyConnect called with data:");
  16.          //sprintf(tmp,"SOCKET=%d name->sa_family=%d",
  17.                  //(DWORD)s,name->sa_family);
  18.          //OutputDebugString(tmp);
  19.  
  20.          if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval))==-1)
  21.          {
  22.                  //OutputDebugString("Cant change to SO_KEEPALIVE");
  23.          
  24.          }
  25.          ///////////////////////////SSL//////////////////////
  26.          SSL_library_init();
  27.          ///
  28.          ret=pConnect(s,name,namelen);
  29.          ///
  30.          
  31.          meth=SSLv23_client_method();
  32.          ctx =SSL_CTX_new(meth);
  33.          ssl=SSL_new(ctx);
  34.          SSL_set_fd(ssl, (int)s);
  35.          ////////////////////////////////////////////////////
  36.     
  37.          if(SSL_connect(ssl)<=0)
  38.          {
  39.          err_exit("SSL connect error");
  40.          }
  41.          //OutputDebugString("SSL_connect succesfull");
  42.  
  43.          //////////////////////////////////////////////////////
  44.          for (int i=0;i<=2;i++)
  45.          {
  46.                  read_ret=SSL_read(ssl,&tmpp,sizeof(tmpp));
  47.                  switch (SSL_get_error(ssl,read_ret))
  48.                  {
  49.                         case  SSL_ERROR_NONE:
  50.                               break;
  51.                         default:
  52.                               err_exit("Cant SSL_read");
  53.                  };
  54. return ret;
  55. }
  56. int WINAPI MySend(IN SOCKET s, IN const char* buf, IN int len, IN int flags)
  57. {
  58.  
  59.                  DWORD wr_ret=SSL_write(ssl,buf,sizeof(ss_packet));
  60.                  switch (SSL_get_error(ssl,wr_ret))
  61.                  {
  62.                  case  SSL_ERROR_NONE:
  63.                         break;
  64.                  default:
  65.                         err_exit("Cant SSL_write");
  66.                  };
  67. return wr_ret;
  68. }
  69. int WINAPI MyRecv(IN SOCKET s, OUT char* buf, IN int len, IN int flags)
  70. {        
  71.  
  72.          int        read_ret=  NULL;;
  73.          read_ret=SSL_read(ssl,buf,len);
  74.  
  75.          switch (SSL_get_error(ssl,read_ret))
  76.          {
  77.          case  SSL_ERROR_NONE:
  78.                  break;
  79.          default:
  80.                  err_exit("Cant SSL_read");
  81.          };
  82. return read_ret;
  83. }
  84.  




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 27 мая 2010 05:42 · Поправил: HiEndsoft
· Личное сообщение · #16

punxer
прям прорвало тебя
Вот старье от меня, прямо перед сисколом помена в ntdll на свой обработчик
Code:
  1. /////////////////////////////////////////////////////////////////    ////////////////////////////////////
  2. //Сплайс функ NTDLL.DLL///////////////////////////////////////////////////////////// /////////////
  3. //////////////////////////////////////////////////////////////////////    ///////////////////////////////
  4. //pNFUNC - NEW-функция-обработчик
  5. //FunName - имя функции ntdll.dll
  6. //Ordinal - ординал функции ntdll.dll
  7. //Возвращает указатель на TRUE-функцию
  8. //Когда-то не палился этот метод
  9. //GetProcAdrLibFunc - думаю понятно что делает
  10. LPVOID NTSPLIS(LPVOID pNFUNC,OPTIONAL PCSZ FunName,OPTIONAL WORD Ordinal)
  11. {
  12. DWORD aFunc=0;
  13. if(GetProcAdrLibFunc((PVOID*)&aFunc,NtDll,FunName,0))
  14. {
  15.            SIZE_T RegionSize=15;
  16.            LPVOID pBridg=NULL;
  17.                  if(NT_SUCCESS(NtAllocateVirtualMemory(INVALID_HANDLE_VALUE,&pBridg,0    ,&RegionSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE)))
  18.            {     
  19.                         DWORD P=0;
  20.                         DWORD tFunc=aFunc;
  21.                         if(NT_SUCCESS(NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&    tFunc,&RegionSize,PAGE_EXECUTE_READWRITE,&P)))
  22.                         {
  23.                               memcpy(pBridg,(LPVOID)aFunc,RegionSize);
  24.                               _asm
  25.                               {
  26.                                    push ebx
  27.                                    push eax
  28.                                    mov ebx,aFunc
  29.                                    mov eax,pNFUNC
  30.                                    mov [ebx+6],eax//JMP EDX
  31.                                    mov[ebx+11],0x000000E2
  32.                                    pop eax
  33.                                    pop ebx
  34.                               }
  35.                               tFunc=aFunc;
  36.                               NtProtectVirtualMemory(INVALID_HANDLE_VALUE,(PVOID*)&tFunc,&Region    Size,P,&P);
  37.                               return pBridg;
  38.                         }
  39.            }
  40. }
  41. return NULL;
  42. }
  43. //////////////////////////////////////////////////////////////////////    ////////////////////////////


-----
продавец резиновых утёнков




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 27 мая 2010 14:56
· Личное сообщение · #17

немного макросов и их применения
Code:
  1. #define min(a, b)  (((a) < (b)) ? (a) : (b))
  2. #define max(a, b)  (((a) > (b)) ? (a) : (b))
  3. #define MakePtr(cast, ptr, addValue ) (cast)( (DWORD)(ptr)+(DWORD)(addValue))


Code:
  1. __forceinline bool InRect(RECT rc,POINT pt)
  2. {
  3.          if (min(rc.left,pt.x)==rc.left &&
  4.                  min(rc.right,pt.x)==pt.x   &&
  5.                  min(rc.top,pt.y)==rc.top   &&
  6.                  min(rc.bottom,pt.y)==pt.y) 
  7.                         return true;
  8.  
  9.          return false;
  10. }
  11.  




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 27 мая 2010 14:58
· Личное сообщение · #18

Немного DDraw
Code:
  1.  
  2. LPDIRECTDRAWSURFACE7 LoadResBitmap(int id)
  3. {
  4.          HBITMAP          hbm     =     NULL;
  5.          BITMAP bmp;
  6.          LPDIRECTDRAWSURFACE7 temp;
  7.  
  8.          hbm= (HBITMAP)LoadImageA(g_hInst,MAKEINTRESOURCE(id),IMAGE_BITMAP,0,0,LR_CR EATEDIBSECTION);
  9.          DebugPrintF("HBITMAP hbm=%d",(DWORD)hbm);
  10.  
  11.          GetObject(hbm,sizeof(BITMAP),&bmp);
  12.          DebugPrintF("WIDTH =%d HEIGHT=%d",bmp.bmWidth,bmp.bmHeight);
  13.  
  14.          temp=CreateCustomSurface(bmp.bmWidth,bmp.bmHeight);
  15.          DebugPrintF("lpDDCustomSurface=%d",(DWORD)temp);
  16.          
  17.          if (FAILED(DDCopyBitmap(temp,hbm,0,0,bmp.bmWidth,bmp.bmHeight)))
  18.          {
  19.                  DebugPrintF("DDCopyBitmap failed");
  20.          }
  21.  
  22.          
  23.  
  24.  
  25.  
  26.          return temp;
  27.  
  28. }
  29.  
  30.  
  31.  
  32. LPDIRECTDRAWSURFACE7 CreateCustomSurface(DWORD w, DWORD h)
  33. {
  34.     DDSURFACEDESC2 desc;
  35.          LPDIRECTDRAWSURFACE7 surf =        NULL;
  36.          HRESULT r        =      NULL;
  37.     
  38.          ZeroMemory(&desc, sizeof(desc));
  39.     desc.dwSize = sizeof(desc);
  40.     desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
  41.     desc.dwWidth = w;
  42.     desc.dwHeight = h;
  43.     desc.ddsCaps.dwCaps =DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
  44.     
  45.     r = g_lpDD->CreateSurface(&desc, &surf, NULL);
  46.     if (== DD_OK)
  47.     {
  48.         DebugPrintF("CreateSurface(%d,%d) created in video memory \n", w, h);
  49.         return surf;
  50.     }
  51.  
  52.     desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
  53.     r = g_lpDD->CreateSurface(&desc, &surf, NULL);
  54.     if (== DD_OK)
  55.     {
  56.         DebugPrintF("CreateSurface(%d,%d) allocated in system memory \n", w, h);
  57.         return surf;
  58.     }
  59.  
  60.     DebugPrintF("CreateSurface(%d,%d) failed\n", w, h);
  61.     return NULL;
  62. }
  63.  
  64.  
  65. HRESULT DDCopyBitmap(IDirectDrawSurface7 * pdds, HBITMAP hbm, int x, int y,int dx, int dy)
  66. {
  67.     HDC                    hdcImage;
  68.     HDC                    hdc;
  69.     BITMAP                  bm;
  70.     DDSURFACEDESC2          ddsd;
  71.     HRESULT                hr;
  72.  
  73.     if (hbm == NULL || pdds == NULL)
  74.         return E_FAIL;
  75.     //
  76.     // Make sure this surface is restored.
  77.     //
  78.     pdds->Restore();
  79.     //
  80.     // Select bitmap into a memoryDC so we can use it.
  81.     //
  82.     hdcImage = CreateCompatibleDC(NULL);
  83.     SelectObject(hdcImage, hbm);
  84.     //
  85.     // Get size of the bitmap
  86.     //
  87.     GetObject(hbm, sizeof(bm), &bm);
  88.     dx = dx == 0 ? bm.bmWidth : dx; // Use the passed size, unless zero
  89.     dy = dy == 0 ? bm.bmHeight : dy;
  90.     //
  91.     // Get size of surface.
  92.     //
  93.     ddsd.dwSize = sizeof(ddsd);
  94.     ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
  95.     pdds->GetSurfaceDesc(&ddsd);
  96.  
  97.     if ((hr = pdds->GetDC(&hdc)) == DD_OK)
  98.     {
  99.         StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,
  100.                   dx, dy, SRCCOPY);
  101.         pdds->ReleaseDC(hdc);
  102.     }
  103.     DeleteDC(hdcImage);
  104.     return hr;
  105. }
  106.  




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 27 мая 2010 15:00
· Личное сообщение · #19

Code:
  1.  
  2. BOOL GetSurfaceDimensions(LPDIRECTDRAWSURFACE7 surf,DWORD& w, DWORD& h)
  3. {
  4.     if (surf == 0)
  5.         return FALSE;
  6.  
  7.     DDSURFACEDESC2 desc;
  8.     ZeroMemory(&desc, sizeof(desc));
  9.     desc.dwSize = sizeof(desc);
  10.     desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
  11.  
  12.     if (surf->GetSurfaceDesc(&desc) != DD_OK)
  13.         return FALSE;
  14.     w = desc.dwWidth;
  15.     h = desc.dwHeight;
  16.          
  17.     return TRUE;
  18. }
  19.  




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 27 мая 2010 15:01 · Поправил: punxer
· Личное сообщение · #20

Если интересно могу накидать вывод поверх чужого Директ Дро из подгруженной ДЛЛ



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 27 мая 2010 17:21
· Личное сообщение · #21

punxer
Кидай если не в тягость, это нужно.



Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 28 мая 2010 07:57
· Личное сообщение · #22

Кидаю. Прорисовка подерх чужого DirectDraw7
Code:
  1.  
  2. HRESULT WINAPI MyDirectDrawCreateEx(GUID *lpGuid,LPVOID *lplpDD,const IID &iid,IUnknown *pUnkOuter) 
  3. {
  4. #define CREATE_SURFACE_OFFSET 24
  5. #define SET_COOP_LEVEL_OFFSET 80
  6. #define SET_DISP_MODE_OFFSET  84
  7.  
  8.  
  9.          HRESULT r=NULL;
  10.  
  11.  
  12.          if ((r=pDirectDrawCreateEx(lpGuid,lplpDD,iid,pUnkOuter))==DD_OK)
  13.          {
  14.                  DebugPrintF("DirectDrawCreateEx SUCCESS");
  15.          }
  16.          g_lpDD=(IDirectDraw7*)*lplpDD;
  17.  
  18.          //HOOKING COM
  19.  
  20.  
  21.          pIDirectDraw7_SetCooperativeLevel=(HRESULT (__stdcall PASCAL* )(LPDIRECTDRAWSURFACE7,HWND,DWORD))
  22.                  HookCOM(lplpDD,SET_COOP_LEVEL_OFFSET,(DWORD)MyIDirectDraw7_SetCooper ativeLevel,31);
  23.          DebugPrintF("!!SetCooperativeLevel hooked");
  24.  
  25.          pIDirectDraw7_SetDisplayMode=(HRESULT (__stdcall PASCAL* )(LPDIRECTDRAWSURFACE7,DWORD,DWORD,DWORD,DWORD,DWORD))
  26.                  HookCOM(lplpDD,SET_DISP_MODE_OFFSET,(DWORD)MyIDirectDraw7_SetDisplay Mode,31);
  27.          DebugPrintF("!!SetDisplayMode hooked");
  28.          
  29.  
  30.  
  31.          return r;
  32.  
  33. }


Code:
  1.  
  2. HRESULT  __stdcall   PASCAL MyIDirectDrawSurface7_Flip(LPDIRECTDRAWSURFACE7 lplpThis,LPDIRECTDRAWSURFACE7* lplpSurf7,DWORD param)
  3.  
  4. {
  5.  
  6.          HRESULT ret=NULL;
  7.          DDSURFACEDESC2 sd2;
  8.  
  9.          //DebugPrintF("!!!In lpDDPrimarySurf7->Flip");
  10.          
  11.          if (g_lpDDSurfBack)
  12.          {
  13.                  g_lpDDSurfBack->Lock(NULL,&sd2,DDLOCK_WAIT,NULL);
  14.                  //Drawing
  15.                                    g_lpDDSurfBack->BltFast(385,400,g_lpDDSurfBtnSelectorUP,NULL,NULL);
  16.  
  17.                  g_lpDDSurfBack->Unlock(NULL);
  18.                                        
  19.          }
  20.          //DebugPrintF("!!!RETURN");
  21.          ret=pIDirectDrawSurface7_Flip(lplpThis,lplpSurf7,param);
  22.          
  23.          
  24.          return ret;
  25. }
  26.  


Code:
  1. HRESULT  __stdcall   PASCAL MyIDirectDrawSurface7_GetAttachedSurface(LPDIRECTDRAWSURFACE7 lplpThis, LPDDSCAPS2 lpCaps, LPDIRECTDRAWSURFACE7 FAR * lplpSurf)
  2. {
  3.          HRESULT ret;
  4.          ret=pIDirectDrawSurface7_GetAttachedSurface(lplpThis,lpCaps,lplpSurf) ;
  5.          DebugPrintF("!!!!!!Primary surface->GetAttachedSurface");
  6.          if (lpCaps->dwCaps & DDSCAPS_BACKBUFFER)
  7.          {
  8.                  DebugPrintF("!!!!!!!!!!!Back Buffer Founded");
  9.                  g_lpDDSurfBack=*lplpSurf;
  10.          }
  11.          
  12.          return ret;
  13. }
  14.  


Code:
  1.  
  2. HRESULT __stdcall PASCAL MyIDirectDraw7_CreateSurface(LPVOID lplpDD,LPDDSURFACEDESC2 lpDDSurfdesc2, LPDIRECTDRAWSURFACE7 FAR *lpDDSurf7, IUnknown FAR * pUnk)
  3. {
  4. #define IDirectDrawSurface7_Flip_OFFSET 44
  5. #define GetAttachedSurface_OFFSET     48
  6.          
  7.  
  8.          HRESULT ret=            NULL;
  9.  
  10.          ret=pIDirectDraw7_CreateSurface(lplpDD,lpDDSurfdesc2,lpDDSurf7,pUnk);
  11.  
  12.          //DebugPrintF("!!!In lpDD->CreateSurface");
  13.  
  14.          if(lpDDSurfdesc2->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
  15.          {
  16.  
  17.                  //Hook flip and other 
  18.                  DebugPrintF("!!!!!!Primary surface founded");
  19.                  if (lpDDSurfdesc2->dwBackBufferCount==1)
  20.                         DebugPrintF("!!!!!!Primary surface founded!!!!BackBuffer one!!!!!!!!!!");
  21.                  
  22.                  g_lpDDSurfPrimary=(LPDIRECTDRAWSURFACE7)*lpDDSurf7;
  23.                  pIDirectDrawSurface7_Flip=(HRESULT(__stdcall   PASCAL*)
  24.                         (LPDIRECTDRAWSURFACE7 lplpThis,LPDIRECTDRAWSURFACE7* lplpSurf7,DWORD param))
  25.                         HookCOM((PVOID*)lpDDSurf7,IDirectDrawSurface7_Flip_OFFSET,(DWORD)My IDirectDrawSurface7_Flip,52);
  26.  
  27.                  pIDirectDrawSurface7_GetAttachedSurface=(HRESULT(__stdcall   PASCAL*)
  28.                         (LPDIRECTDRAWSURFACE7 lplpThis, LPDDSCAPS2, LPDIRECTDRAWSURFACE7 FAR *))
  29.                         HookCOM((PVOID*)lpDDSurf7,GetAttachedSurface_OFFSET,(DWORD)MyIDirec tDrawSurface7_GetAttachedSurface,52);
  30.          }       
  31.          return ret;
  32. }
  33.  
  34.  

Code:
  1.  
  2. HRESULT __stdcall PASCAL MyIDirectDraw7_SetDisplayMode(LPDIRECTDRAWSURFACE7 lplpThis,DWORD dwWidth,DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags )
  3. {
  4. #define CREATE_SURFACE_OFFSET 24
  5.          HRESULT tmp=     NULL;
  6.          int     iter=       NULL;
  7.  
  8.          DebugPrintF("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!in MyIDirectDraw7_SetDisplayMode");
  9.          tmp=pIDirectDraw7_SetDisplayMode(lplpThis,dwWidth,dwHeight,dwBPP,dwRe freshRate,dwFlags);
  10.  
  11.          
  12.          DebugPrintF("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!Loading Graphics");
  13.          
  14.          g_lpDDSurfBtnSelectorDN=LoadResBitmap(IDB_BITMAP2);
  15.          if (!g_lpDDSurfBtnSelectorDN) 
  16.                  DebugPrintF("Load Failed 101");
  17.          
  18.          
  19.  
  20.  
  21.          
  22.  
  23.          pIDirectDraw7_CreateSurface=(HRESULT (__stdcall PASCAL *)
  24.                  (LPVOID,LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE7 FAR *, IUnknown FAR *))
  25.                  HookCOM((PVOID*)&g_lpDD,CREATE_SURFACE_OFFSET,(DWORD) MyIDirectDraw7_CreateSurface,31);
  26.          DebugPrintF("!!!!!!CreateSurface hooked");
  27.          
  28.          return tmp;
  29.  
  30.  
  31. }
  32.  
  33.  


Code:
  1. HRESULT __stdcall PASCAL MyIDirectDraw7_SetCooperativeLevel(LPDIRECTDRAWSURFACE7 lplpThis,HWND hWnd,DWORD dwFlags)
  2. {
  3.          DebugPrintF("in MyIDirectDraw7_SetCooperativeLevel");
  4.          return pIDirectDraw7_SetCooperativeLevel(lplpThis,hWnd,dwFlags);
  5.  
  6. }




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 28 мая 2010 08:00
· Личное сообщение · #23

Code:
  1.  
  2.                         ret=SpliceBridge((DWORD)GetProcAddress(GetModuleHandle("DDRAW.DLL") ,"DirectDrawCreateEx"),
  3.                               (DWORD)MyDirectDrawCreateEx,true_ptr);
  4.                         if (!ret)
  5.                         {
  6.                               exit(0);
  7.                         }
  8.                         pDirectDrawCreateEx=(HRESULT (WINAPI *)
  9.                               (GUID *lpGuid,LPVOID *lplpDD,const IID &iid,IUnknown *pUnkOuter)) true_ptr;
  10.                         DebugPrintF("DirectDrawCreateEx hooked");




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 01 июня 2010 09:06
· Личное сообщение · #24

Перехват функций с нестандартным не 5-байтовым прологом с помощью мостов.
Code:
  1. bool SpliceBridgeAllProlog(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr,int prolog_size) 
  2.          DWORD Protects=   NULL;
  3.          DWORD JA=                     NULL;
  4.          BYTE* bridge=       NULL;
  5.          if(addr && new_addr) 
  6.          { 
  7.                  //Create Bridge
  8.                  bridge=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUT  E_READWRITE);
  9.                  VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);
  10.                  
  11.                  memcpy(bridge, (LPVOID)addr,  prolog_size);
  12.                  bridge[prolog_size]=0xE9;
  13.                  JA=addr-(DWORD)bridge-5;
  14.                  memcpy(&bridge[prolog_size+1],&JA,4);
  15.                  
  16.                  true_addr=(DWORD)bridge;
  17.                  
  18.                  //Patch Function
  19.                  BYTE *jmp=(BYTE*)VirtualAlloc(NULL,prolog_size,MEM_COMMIT,PAGE_EXECUTE_READ WRITE);
  20.                  jmp[0]=0xE9;
  21.  
  22.                  JA=(DWORD)new_addr - addr - 5;
  23.                  memcpy(&jmp[1],&JA,4);
  24.                  memset(&jmp[5],0x90,prolog_size-5);
  25.                  if(memcpy((LPVOID)addr,jmp, prolog_size)) 
  26.                  { 
  27.                         VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
  28.                         return true;
  29.                  }
  30.          } 
  31. return false;
  32. }




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 02 июня 2010 11:37 · Поправил: HiEndsoft
· Личное сообщение · #25

punxer пишет:
Перехват функций с нестандартным не 5-байтовым прологом с помощью мостов.

как показывает опыт, для 99% WIN32 API если 1-ый байт=0x55 значит пролог не 5 байт.

-----
продавец резиновых утёнков




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 02 июня 2010 21:02
· Личное сообщение · #26

HiEndsoft как показывает опыт для WIN32API хватает 5 байт
Точнее эта функция для пролога и вовбще для перехвата любой длины



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 02 июня 2010 22:39 · Поправил: HiEndsoft
· Личное сообщение · #27

punxer пишет:
как показывает опыт для WIN32API хватает 5 байт

Да ну? connect [ws2_32] и много других. (вообще и 1байта достаточно, например 0xCC).
На счет 0x55 я конечно погорячился (нужен дизассемблер длин в общ случае).

-----
продавец резиновых утёнков




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 02 июня 2010 22:56
· Личное сообщение · #28

HiEndsoft
connect [ws2_32] перехватывается и стандартно -5. Про СС отдельный разговор. А так зная что перехватываешь функция самое то



Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 02 июня 2010 23:01
· Личное сообщение · #29

HiEndsoft
Code:
  1. SpliceBridgeAllProlog с аргументом 5




Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 02 июня 2010 23:14 · Поправил: Модератор
· Личное сообщение · #30

конвертация исполняемого файла EXE в DLL
От модератора: в топике же просили проверенный код, за поиск PE сигнатуры поиском строки руки надо просто вырывать



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 02 июня 2010 23:14 · Поправил: HiEndsoft
· Личное сообщение · #31

1. Утверждение:
punxer пишет:
как показывает опыт для WIN32API хватает 5 байт

- не верно.
2.
punxer пишет:
connect [ws2_32] перехватывается и стандартно -5

connect [ws2_32] WinXP SP3:
Code:
  1. push ebp
  2. mov ebp,esp
  3. sub esp,0x00000018
  4. .......

- уже 6 байт. Прежде чем копипастить здесь вагонами, в дизассемблер загляните.

punxer пишет:
конвертация исполняемого файла EXE в DLL

Ув. модераторы: сбейте этот самолет он загнался.

-----
продавец резиновых утёнков



<< . 1 . 2 . 3 . >>
 eXeL@B —› Программирование —› Небольшие полезные коды
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати