Сейчас на форуме: 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 мкс

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



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

Создано: 09 февраля 2010 20:23
· Личное сообщение · #2

DaRKSiDE пишет:
Если эти коды будут еще и на асме... будет еще лучше

Не вижу смысла писать такие вещи на асме, т. к. гимор >> польза.

Следующим полезным кодом которым бы я хотел поделится, это моя реализация спинлоков (некое отдаленное подобие ядерных, только для юзер мода). Реализации возникла в следствии моих исследований по задаче описанной в этом топике.
Code:
  1.  
  2. typedef u_long spin_lock_t;
  3.  
  4. void initialize_spinlock(spin_lock_t* lock)
  5. {
  6.          *lock = 0;
  7. }
  8.  
  9. void acquire_spinlock(spin_lock_t* lock) 
  10. {
  11.          while (InterlockedBitTestAndSet((LONG*)lock,0))
  12.                  Sleep(0);
  13. }
  14.  
  15. void release_spinlock(spin_lock_t* lock)
  16. {
  17.          InterlockedBitTestAndReset((LONG*)lock,0);
  18. }
  19.  


Как видно реализация простая как грабли, но зато тесты впечатляют. По-скольку наиболее быстрым аналогом спинлоков в версиях Windows <6 яаляется критическая секция, то сравнения производительности проводятся именно с ней.

------
итак, результаты тестирования для 64 потоков на 2х ядерном компе

для обыкновенных критических секций
772.895203 с (суммарное время выполнение всех потоков)
12.076488 с (среднее время выполнения одного потока)

для критических секций с оптимально подобранным значением spincount
354.903735 с
5.545371 с

для моих спинлоков
110.581553 с
1.727837 с

производительность на 220% выше

--------
результаты тестирования для 2х потоков на 2х ядерном компе

для критических секций с оптимально подобранным значением spincount
3.316628 с
1.658314 с

для моих спинлоков
1.062527 с
0.531264 с

производительность на 212% выше

--------
результаты тестирования для 64 потоков на 1х ядерном компе

для критических секций
580.160929 с
9.065015 с

для моих спинлоков
494.444996
7.725703

производительность на 17% выше
--------

Ес-но использование спинлоков подразумевает короткие обращения к разделяемым ресурсам, иначе их использование не будет оправданным.

Я к сожалению пока поленился протестить на моих тестах SRW-локи, которые идут в винде начиная с висты, но на компах с ХП, не вижу реально ничего лучше.



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

Создано: 10 февраля 2010 11:33 · Поправил: HiEndsoft
· Личное сообщение · #3

Code:
  1. void WINAPI NtSleepEx(DWORD DurationMs,BOOL Alertable)
  2. {
  3.          struct
  4.          {
  5.                  DWORD Low;
  6.                  DWORD Hi;
  7.          } MLI={{-10000*DurationMs},{0xFFFFFFFF}};
  8.          NtDelayExecution(Alertable,(PLARGE_INTEGER)&MLI);
  9. }
  10.  
  11. #define NtSleep(_x)        NtSleepEx(_x,0)

Code:
  1. BOOL WINAPI NtBeep (DWORD dwFreq, DWORD dwDuration)
  2. {
  3.          HANDLE hBeep;
  4.          UNICODE_STRING BeepDevice;
  5.          OBJECT_ATTRIBUTES ObjectAttributes;
  6.          IO_STATUS_BLOCK IoStatusBlock;
  7.          if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||(dwFreq == 0x0 && dwDuration == 0x0))
  8.          {
  9.                  BeepDevice.Buffer=L"\Device\Beep";
  10.                  BeepDevice.Length=24;
  11.                  BeepDevice.MaximumLength=26;
  12.                  InitializeObjectAttributes(&ObjectAttributes,&BeepDevice,0,NULL,NULL );
  13.                  if (NT_SUCCESS(NtCreateFile(&hBeep,FILE_READ_DATA | FILE_WRITE_DATA,&ObjectAttributes,&IoStatusBlock,NULL,0,FILE_SHARE_REA D | FILE_SHARE_WRITE,FILE_OPEN_IF,0,NULL,0)))
  14.                  {
  15.                         struct 
  16.                         {
  17.                               ULONG Frequency;
  18.                               ULONG Duration;
  19.                         }         BEEP_SET_PARAMETERS={{dwFreq},{dwDuration}};
  20.                         if (NT_SUCCESS(NtDeviceIoControlFile(hBeep,NULL,NULL,NULL,&IoStatusBlock, 0x10000,&BEEP_SET_PARAMETERS,sizeof(BEEP_SET_PARAMETERS),NULL,0)))
  21.                         {
  22.                               if ((dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != (DWORD)-1) NtSleepEx(dwDuration,TRUE);
  23.                               NtClose(hBeep);
  24.                               return TRUE;
  25.                         } else return FALSE;
  26.                  }
  27.          }
  28.          return FALSE;
  29. }


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





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 10 февраля 2010 14:42 · Поправил: multiarc
· Личное сообщение · #4

Code:
  1. //выделить и инициализировать блок памяти под код, который будет выполнен по переходу на него из APC, 
  2. //при любом удалённом вызове, либо при инжекте
  3. void * RemoteBuildCode(
  4.          __in const HANDLE Process,
  5.          __in_opt const PVOID *Params,
  6.          __in int paramcount,
  7.          __in ULONG FunctionAddr,
  8.          __in_opt HANDLE Event,
  9.          __in_opt ULONG * result
  10.          )
  11. {
  12.          int codesize,i;
  13.          BYTE *code;
  14.          void *codebase,*codeaddr;
  15.          //HMODULE ntdll;
  16.          ULONG res,tmp;
  17.          if (FunctionAddr == 0)
  18.                  return NULL;
  19.          if (Params == NULL)
  20.                  paramcount = 0;
  21.          codesize = paramcount*5+(Event==NULL?17:57);//13+4(result)
  22.          codebase = (BYTE *)VirtualAllocEx(Process,NULL,codesize,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  23.          if (codebase == NULL)
  24.                  return NULL;
  25.          codeaddr = malloc(codesize);
  26.          if (codeaddr == NULL)
  27.          {
  28.                  VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  29.                  return NULL;
  30.          }
  31.          code = (BYTE *)codeaddr;
  32.          //build params
  33.          for (i=paramcount-1;i>=0;i--)
  34.          {
  35.                  code[0] = 0x68;//push dword
  36.                  code += 1;
  37.                  memcpy(code,&Params[i],4);
  38.                  code += 4;
  39.          }
  40.          FunctionAddr -= ((ULONG)codebase+(paramcount+1)*5);
  41.          //build call function
  42.          code[0] = 0xE8;//call near relative address
  43.          code += 1;
  44.          memcpy(code,&FunctionAddr,4);
  45.          code += 4;
  46.          //build store eax(result) in memory
  47.          code[0] = 0xA3;//mov [mem],eax
  48.          code += 1;
  49.          //res = 0xCDCDCDCD;
  50.          //memcpy((void *)((ULONG)codeaddr+codesize - 4),&res,4);
  51.          res = (ULONG)codebase+codesize - 4;
  52.          memcpy(code,&res,4);
  53.          code += 4;
  54.          if (Event != NULL)
  55.          {
  56.                  if (DuplicateHandle(GetCurrentProcess(),Event,Process,&Event,0,FALSE,DUPL     ICATE_SAME_ACCESS))
  57.                  {
  58.                         if (ntdll == NULL)
  59.                               ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  60.                         if (ntdll != NULL)
  61.                         {
  62.                               //push 0
  63.                               code[0] = 0x68;
  64.                               code += 1;
  65.                               tmp = 0;
  66.                               memcpy(code,&tmp,4);
  67.                               code += 4;
  68.  
  69.                               //push Event
  70.                               code[0] = 0x68;
  71.                               code += 1;
  72.                               memcpy(code,&Event,4);
  73.                               code += 4;
  74.  
  75.                               //call NtSetEvent
  76.                               code[0] = 0xE8;
  77.                               code += 1;
  78.                               FunctionAddr = (ULONG)GetProcAddress(ntdll,"ZwSetEvent");
  79.                               FunctionAddr -= ((ULONG)codebase+(paramcount+5)*5);
  80.                               //((ULONG)codebase+((ULONG)code - (ULONG)codeaddr)+4)
  81.                               memcpy(code,&FunctionAddr,4);
  82.                               code += 4;
  83.  
  84.                               //push Event
  85.                               code[0] = 0x68;
  86.                               code += 1;
  87.                               memcpy(code,&Event,4);
  88.                               code += 4;
  89.  
  90.                               //call NtClose
  91.                               code[0] = 0xE8;
  92.                               code += 1;
  93.                               FunctionAddr = (ULONG)GetProcAddress(ntdll,"ZwClose");
  94.                               FunctionAddr -= ((ULONG)codebase+(paramcount+7)*5);
  95.                               memcpy(code,&FunctionAddr,4);
  96.                               code += 4;
  97.  
  98.                               //push 0
  99.                               code[0] = 0x68;
  100.                               code += 1;
  101.                               memcpy(code,&tmp,4);
  102.                               code += 4;
  103.  
  104.                               //push 0xFFFFFFFE (Current Thread)
  105.                               code[0] = 0x68;
  106.                               code += 1;
  107.                               tmp = 0xFFFFFFFE;
  108.                               memcpy(code,&tmp,4);
  109.                               code += 4;
  110.  
  111.                               //call NtSuspendThread
  112.                               code[0] = 0xE8;
  113.                               code += 1;
  114.                               FunctionAddr = (ULONG)GetProcAddress(ntdll,"ZwSuspendThread");
  115.                               FunctionAddr -= ((ULONG)codebase+(paramcount+10)*5);
  116.                               memcpy(code, &FunctionAddr, 4);
  117.                               code += 4;
  118.                         }
  119.                  }
  120.          }
  121.          code[0] = 0xC2;//retn 0xC0
  122.          code[1] = 0x0C;
  123.          code[2] = 0x00;
  124.          //write builded code
  125.          WriteProcessMemory(Process,codebase,codeaddr,codesize,NULL);
  126.          //free code
  127.          free(codeaddr);
  128.          if (result != NULL)
  129.                  *result = res;
  130.          return codebase;
  131. }

Code:
  1. //инициализирует список выделенных блоков памяти чужого процесса
  2. PMEM InitMemoryList(
  3.          __in const HANDLE Process
  4.          )
  5. {
  6.          PMEM MemoryList;
  7.          MemoryList = (PMEM)malloc(sizeof(MEM));
  8.          if (MemoryList == NULL)
  9.                  return NULL;
  10.          DuplicateHandle(GetCurrentProcess(),Process,GetCurrentProcess(),&Memo      ryList->Process,0,FALSE,DUPLICATE_SAME_ACCESS);
  11.          MemoryList->count = 0;
  12.          MemoryList->mems = NULL;
  13.          return MemoryList;
  14. }
  15.  
  16. //добавляет к списку элемент
  17. BOOL AddMemoryList(
  18.          __in PMEM MemoryList,
  19.          __in void * mem
  20.          )
  21. {
  22.          void **m;
  23.          m = (PVOID *)realloc(MemoryList->mems,(MemoryList->count+1)<<2);
  24.          if (== NULL)
  25.                  return FALSE;
  26.          else
  27.                  MemoryList->mems = m;
  28.          MemoryList->mems[MemoryList->count] = mem;
  29.          MemoryList->count++;
  30.          return TRUE;
  31. }
  32.  
  33. //очищает ранее выделенную память в чужом процессе и удаляет список
  34.  void FreeAllMemoryList(
  35.          __inout PMEM MemoryList
  36.          )
  37. {
  38.          int i;
  39.          for (= 0;i<MemoryList->count;i++)
  40.                  VirtualFreeEx(MemoryList->Process,MemoryList->mems[i],0,MEM_RELEASE)      ;
  41.          CloseHandle(MemoryList->Process);
  42.          free(MemoryList->mems);
  43.          free(MemoryList);
  44. }
  45.  
  46. //возвращает адрес записанного буфера в чужом процессе
  47. //с выделением памяти под него
  48. void * AllocAndWriteRemoteBuffer(
  49.          __in const HANDLE Process,
  50.          __in void * LocalBuffer,
  51.          __in ULONG size
  52.          )
  53. {
  54.          void *Buffer;
  55.          Buffer = VirtualAllocEx(Process,NULL,size,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
  56.          if (Buffer == NULL)
  57.                  return NULL;
  58.          WriteProcessMemory(Process,Buffer,LocalBuffer,size,NULL);
  59.          return Buffer;
  60. }
  61.  
  62. //записывает в чужой процесс структуру ANSI_STRING, используя адрес на строку, и возвращает её адрес
  63. //с выделением памяти под неё
  64. void * AllocAndWriteRemoteAnsiString(
  65.          __in const HANDLE Process,
  66.          __in const char * AnsiString
  67.          )
  68. {
  69.          int len;
  70.          void *String,*String_A;
  71.          len = strlen(AnsiString)+1;
  72.          String_A = VirtualAllocEx(Process,NULL,sizeof(ANSI_STRING)+len,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
  73.          if (String_A == NULL)
  74.                  return NULL;
  75.          String = (void *)((ULONG)String_A+sizeof(ANSI_STRING));
  76.          WriteProcessMemory(Process,String,AnsiString,len,NULL);
  77.          len--;
  78.          WriteProcessMemory(Process,String_A,&len,2,NULL);
  79.          len++;
  80.          WriteProcessMemory(Process,(void *)((ULONG)String_A+2),&len,2,NULL);
  81.          WriteProcessMemory(Process,(void *)((ULONG)String_A+4),&String,4,NULL);
  82.          return String_A;
  83. }
  84.  
  85. //записывает в чужой процесс структуру UNICODE_STRING, используя адрес на строку, и возвращает её адрес
  86. //с выделением памяти под неё
  87. void * AllocAndWriteRemoteUnicodeString(
  88.          __in const HANDLE Process,
  89.          __in const wchar_t * UnicodeString
  90.          )
  91. {
  92.          int len;
  93.          void *String,*String_U;
  94.          len = (wcslen(UnicodeString)+1)<<1;
  95.          String_U = VirtualAllocEx(Process,NULL,sizeof(UNICODE_STRING)+len,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
  96.          if (String_U == NULL)
  97.                  return NULL;
  98.          String = (void *)((ULONG)String_U+sizeof(UNICODE_STRING));
  99.          WriteProcessMemory(Process,String,UnicodeString,len,NULL);
  100.          len-=2;
  101.          WriteProcessMemory(Process,String_U,&len,2,NULL);
  102.          len+=2;
  103.          WriteProcessMemory(Process,(void *)((ULONG)String_U+2),&len,2,NULL);
  104.          WriteProcessMemory(Process,(void *)((ULONG)String_U+4),&String,4,NULL);
  105.          return String_U;
  106. }
  107.  
  108. //записывает С ANSI строку в чужой процесс
  109. //с выделением памяти под неё
  110. void * AllocAndWriteNullTerminatedAnsiString(
  111.          __in const HANDLE Process,
  112.          __in const char * AnsiString
  113.          )
  114. {
  115.          int len;
  116.          void * String;
  117.          len = strlen(AnsiString)+1;
  118.          String = VirtualAllocEx(Process,NULL,len,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
  119.          if (String == NULL)
  120.                  return NULL;
  121.          WriteProcessMemory(Process,String,AnsiString,len,NULL);
  122.          return String;
  123. }
  124.  
  125. //записывает С UNICODE строку в чужой процесс
  126. //с выделением памяти под неё
  127. void * AllocAndWriteNullTerminatedUnicodeString(
  128.          __in const HANDLE Process,
  129.          __in const wchar_t * UnicodeString
  130.          )
  131. {
  132.          int len;
  133.          void * String;
  134.          len = (wcslen(UnicodeString)+1)<<1;
  135.          String = VirtualAllocEx(Process,NULL,len,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
  136.          if (String == NULL)
  137.                  return NULL;
  138.          WriteProcessMemory(Process,String,UnicodeString,len,NULL);
  139.          return String;
  140. }
  141.  
  142. //реаллоцирует ранее выделенный блок памяти (уменьшает или увеличивает размер блока, с сохранением данных)
  143. //или создаёт (выделяет) новый блок памяти
  144. void * ReVirtualAlloc(
  145.          __in_opt void * Mem,
  146.          __in int oldsize,
  147.          __in int newsize,
  148.          __in DWORD fprotect)
  149. {
  150.          void * NewMem;
  151.          if (oldsize == newsize && Mem != NULL)
  152.                  return Mem;
  153.          NewMem = VirtualAlloc(NULL,newsize,MEM_COMMIT,fprotect);
  154.          if (Mem == NULL)
  155.                  return NewMem;
  156.          else
  157.          {
  158.                  if (oldsize != 0)
  159.                         if (oldsize <= newsize)
  160.                               memcpy(NewMem,Mem,oldsize);
  161.                         else
  162.                               memcpy(NewMem,Mem,newsize);
  163.                  VirtualFree(Mem,0,MEM_RELEASE);
  164.                  return NewMem;
  165.          }
  166. }


Code:
  1. //включение/отключение установленной привилегии в процессе
  2. BOOL SetPrivilege(
  3.          __in const wchar_t * PrivilegeName,
  4.          __in BOOL Enabled
  5.          )
  6. {
  7.          HANDLE token;
  8.          ULONG cb;
  9.          TOKEN_PRIVILEGES tkp;
  10.          if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token)        )
  11.                  return FALSE;
  12.          if (!LookupPrivilegeValueW(NULL,PrivilegeName,&tkp.Privileges[0].Luid))
  13.                  return FALSE;
  14.          tkp.PrivilegeCount = 1;
  15.          if (Enabled)
  16.                  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  17.          else
  18.                  tkp.Privileges[0].Attributes = 0;
  19.          cb = 0;
  20.          if (!AdjustTokenPrivileges(token,FALSE,&tkp,sizeof(tkp),NULL,&cb))
  21.                  return FALSE;
  22.          CloseHandle(token);
  23.          return TRUE;
  24. }


Code:
  1. //получает адрес процедуры в нужной библиотеке в чужом процессе (удалённый аналог kernel32!GetProcAddress())
  2. FARPROC __stdcall RemoteGetProcAddress(
  3.          __in const HANDLE Process,
  4.          __in const HMODULE LibraryBase,
  5.          __in const char * Function
  6.          )
  7. {
  8.          void *funcname_A, *addr;
  9.          PVOID * Params;
  10.          FARPROC result;
  11.          //get function base in process address space
  12.          funcname_A = AllocAndWriteRemoteAnsiString(Process,Function);
  13.          addr = VirtualAllocEx(Process,NULL,4,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
  14.          if (addr==NULL)
  15.          {
  16.                  VirtualFreeEx(Process,funcname_A,0,MEM_RELEASE);
  17.                  return 0;
  18.          }
  19.          Params = (PVOID *)calloc(4,4);
  20.          if (Params == NULL)
  21.          {
  22.                  VirtualFreeEx(Process,addr,0,MEM_RELEASE);
  23.                  VirtualFreeEx(Process,funcname_A,0,MEM_RELEASE);
  24.                  return 0;
  25.          }
  26.          Params[0] = LibraryBase;
  27.          Params[1] = funcname_A;
  28.          Params[2] = NULL;
  29.          Params[3] = addr;
  30.          RemoteCallSystem(Process,TEXT("ntdll.dll"),"LdrGetProcedureAddress",P      arams,4);
  31.          free(Params);
  32.          ReadProcessMemory(Process,addr,&result,4,NULL);
  33.          VirtualFreeEx(Process,funcname_A,0,MEM_RELEASE);
  34.          VirtualFreeEx(Process,addr,0,MEM_RELEASE);
  35.          return result;
  36. }





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 10 февраля 2010 15:01 · Поправил: multiarc
· Личное сообщение · #5

Code:
  1. //удалённое получение базы модуля с именем (удалённый аналог kernel32!GetModuleHandleW())
  2. HMODULE RemoteGetDllHandle(
  3.          __in const HANDLE Process,
  4.          __in const wchar_t *DllName
  5.          )
  6. {
  7.          void *libname_U, *lib, *libpath;
  8.          PVOID * params;
  9.          HMODULE result;
  10.          int len;
  11.          wchar_t *Path,*FileName;
  12.          if (ntdll == NULL)
  13.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  14.          if (ntdll==NULL)
  15.                  return 0;
  16.          len = wcslen(DllName)<<1;
  17.          Path = (wchar_t *)malloc(len+2);
  18.          if (Path == NULL)
  19.                  return 0;
  20.          FileName = (wchar_t *)malloc(len+2);
  21.          if (FileName == NULL)
  22.          {
  23.                  free(Path);
  24.                  return 0;
  25.          }
  26.  
  27.          if (SplitPathFileNameW(DllName,Path,FileName))
  28.          {
  29.                  libpath = AllocAndWriteNullTerminatedUnicodeString(Process,Path);
  30.          }
  31.          else
  32.          {
  33.                  libpath = NULL;
  34.          }
  35.          
  36.          free(Path);
  37.          libname_U = AllocAndWriteRemoteUnicodeString(Process,FileName);
  38.          if (libname_U == NULL)
  39.                  return NULL;
  40.          free(FileName);
  41.          lib = VirtualAllocEx(Process,NULL,4,MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  42.          if (lib == NULL)
  43.          {
  44.                  VirtualFreeEx(Process,libname_U,0,MEM_RELEASE);
  45.                  if (libpath != NULL)
  46.                         VirtualFreeEx(Process,libpath,0,MEM_RELEASE);
  47.                  return 0;
  48.          }
  49.          params = (PVOID *)calloc(4,4);
  50.          if (params == NULL)
  51.          {
  52.                  VirtualFreeEx(Process,libname_U,0,MEM_RELEASE);
  53.                  if (libpath != NULL)
  54.                         VirtualFreeEx(Process,libpath,0,MEM_RELEASE);
  55.                  VirtualFreeEx(Process,lib,0,MEM_RELEASE);
  56.                  return 0;
  57.          }
  58.          params[0] = libpath;
  59.          params[1] = NULL;
  60.          params[2] = libname_U;
  61.          params[3] = lib;
  62.          RemoteCallSystem(Process,TEXT("ntdll.dll"),"LdrGetDllHandle",params,4  );
  63.          ReadProcessMemory(Process,lib,&result,4,NULL);
  64.          VirtualFreeEx(Process,libname_U,0,MEM_RELEASE);
  65.          if (libpath != NULL)
  66.                  VirtualFreeEx(Process,libpath,0,MEM_RELEASE);
  67.          VirtualFreeEx(Process,lib,0,MEM_RELEASE);
  68.          free(params);
  69.          return result;
  70. }

Code:
  1. ULONG InjectLibraryToProcessExRT(
  2.          __in const HANDLE Process,
  3.          __in const wchar_t * Library
  4.          )
  5. {
  6.          void *DllHandle, *PathBufPtr, *NameBufPtr_U;
  7.          ULONG result;
  8.          PVOID *Params;
  9.          //HANDLE Process;
  10.          size_t len,fulllen;
  11.          wchar_t *Path,*FileName,*PATH;
  12.          len = wcslen(Library)<<1;
  13.          Path = (wchar_t *)malloc(len+2);
  14.          if (Path == NULL)
  15.                  return 0;
  16.          FileName = (wchar_t *)malloc(len+2);
  17.          if (FileName == NULL)
  18.          {
  19.                  free(Path);
  20.                  return 0;
  21.          }
  22.          if (SplitPathFileNameW(Library,Path,FileName))
  23.          {
  24.                  //Получить переменную path и передать для подгрузки длл дополнительно с путём местанахождения
  25.                  //это нужно для подгрузки например ещё не подгруженой advapi.dll, kernel32.dll
  26.                  //используется нативный трэд для внедрения в процесс, т.е. используется только 
  27.                  //ntdll.dll
  28.                  //==================================================================  ==================
  29.                  len = GetEnvironmentVariableW(TEXT("PATH"),NULL,0)<<1;
  30.                  fulllen = len+((wcslen(Path)+1)<<1);
  31.                  PATH = (wchar_t *)realloc(Path,fulllen);
  32.                  if (PATH != NULL)
  33.                         Path = PATH;
  34.                  PATH = (wchar_t *)malloc(len);
  35.                  if (PATH == NULL)
  36.                  {
  37.                         free(Path);
  38.                         return 0;
  39.                  }
  40.                  GetEnvironmentVariableW(TEXT("PATH"),PATH,(len+1)>>1);
  41.                  wcscat_s(Path,fulllen>>1,TEXT(";"));
  42.                  wcscat_s(Path,fulllen>>1,PATH);
  43.                  //==================================================================  ==================
  44.                  PathBufPtr = AllocAndWriteNullTerminatedUnicodeString(Process,Path);
  45.                  if (PathBufPtr == NULL)
  46.                  {
  47.                         free(Path);
  48.                         free(PATH);
  49.                         return 0;
  50.                  }
  51.                  free(PATH);
  52.          }
  53.          else
  54.          {
  55.                  PathBufPtr = NULL;
  56.          }
  57.          free(Path);
  58.          DllHandle = VirtualAllocEx(Process,NULL,4,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
  59.          if (DllHandle == NULL)
  60.          {
  61.                  if (PathBufPtr != NULL)
  62.                         VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  63.                  free(FileName);
  64.                  return 0;
  65.          }
  66.          NameBufPtr_U = AllocAndWriteRemoteUnicodeString(Process,FileName);
  67.          if (NameBufPtr_U == NULL)
  68.          {
  69.                  if (PathBufPtr != NULL)
  70.                         VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  71.                  VirtualFreeEx(Process,DllHandle,0,MEM_RELEASE);
  72.                  return 0;
  73.          }
  74.          free(FileName);
  75.          Params = (PVOID *)calloc(4,4);
  76.          if (Params == NULL)
  77.          {
  78.                  VirtualFreeEx(Process,NameBufPtr_U,0,MEM_RELEASE);
  79.                  if (PathBufPtr != NULL)
  80.                         VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  81.                  VirtualFreeEx(Process,DllHandle,0,MEM_RELEASE);
  82.                  return 0;
  83.          }
  84.          Params[0] = PathBufPtr;
  85.          Params[1] = NULL;
  86.          Params[2] = NameBufPtr_U;
  87.          Params[3] = DllHandle;
  88.          RemoteCallSystem(Process,TEXT("ntdll.dll"),"LdrLoadDll",Params,4);
  89.          ReadProcessMemory(Process,DllHandle,&result,4,NULL);
  90.          VirtualFreeEx(Process,DllHandle,0,MEM_RELEASE);
  91.          VirtualFreeEx(Process,NameBufPtr_U,0,MEM_RELEASE);
  92.          if (PathBufPtr != NULL)
  93.                  VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  94.          free(Params);
  95.          return result;
  96. }

Code:
  1. //так же желательно сделать все вызовы нативными, для возможности инжекта так же в графическую подсистему csrss!
  2. //Инжект себя в любой (даже привилегированный процесс), кроме csrss и тех, что защищены альтернативными методами:
  3. //неоторые антивирусы, (audiodg.exe в Win 7 и Vista) и т.д.
  4. ULONG InjectSelfToProcessExRT(
  5.          __in const HANDLE Process
  6.          )
  7. {
  8.          void *DllHandle, *PathBufPtr, *NameBufPtr_U;
  9.          ULONG result;
  10.          PVOID *Params;
  11.          //HANDLE Process;
  12.          size_t len,fulllen;
  13.          wchar_t *Path,*FileName,*PATH;
  14.          len = wcslen(ModulePath)<<1;
  15.          Path = (wchar_t *)malloc(len+2);
  16.          if (Path == NULL)
  17.                  return 0;
  18.          FileName = (wchar_t *)malloc(len+2);
  19.          if (FileName == NULL)
  20.          {
  21.                  free(Path);
  22.                  return 0;
  23.          }
  24.          if (SplitPathFileNameW(ModulePath,Path,FileName))
  25.          {
  26.                  //Получить переменную path и передать для подгрузки длл дополнительно с путём местанахождения
  27.                  //это нужно для подгрузки например ещё не подгруженой advapi.dll, kernel32.dll
  28.                  //используется нативный трэд для внедрения в процесс, т.е. используется только 
  29.                  //ntdll.dll
  30.                  //==================================================================  ==================
  31.                  len = GetEnvironmentVariableW(TEXT("PATH"),NULL,0)<<1;
  32.                  fulllen = len+((wcslen(Path)+1)<<1);
  33.                  PATH = (wchar_t *)realloc(Path,fulllen);
  34.                  if (PATH != NULL)
  35.                         Path = PATH;
  36.                  PATH = (wchar_t *)malloc(len);
  37.                  if (PATH == NULL)
  38.                  {
  39.  
  40.                         free(Path);
  41.                         return 0;
  42.                  }
  43.                  GetEnvironmentVariableW(TEXT("PATH"),PATH,(len+1)>>1);
  44.                  wcscat_s(Path,fulllen>>1,TEXT(";"));
  45.                  wcscat_s(Path,fulllen>>1,PATH);
  46.                  //==================================================================  ==================
  47.                  PathBufPtr = AllocAndWriteNullTerminatedUnicodeString(Process,Path);
  48.                  if (PathBufPtr == NULL)
  49.                  {
  50.                         free(Path);
  51.                         free(PATH);
  52.                         return 0;
  53.                  }
  54.                  free(PATH);
  55.          }
  56.          else
  57.          {
  58.                  PathBufPtr = NULL;
  59.          }
  60.          free(Path);
  61.          DllHandle = VirtualAllocEx(Process,NULL,4,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
  62.          if (DllHandle == NULL)
  63.          {
  64.                  if (PathBufPtr != NULL)
  65.                         VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  66.                  free(FileName);
  67.                  return 0;
  68.          }
  69.          NameBufPtr_U = AllocAndWriteRemoteUnicodeString(Process,FileName);
  70.          if (NameBufPtr_U == NULL)
  71.          {
  72.                  if (PathBufPtr != NULL)
  73.                         VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  74.                  VirtualFreeEx(Process,DllHandle,0,MEM_RELEASE);
  75.                  return 0;
  76.          }
  77.          free(FileName);
  78.          Params = (PVOID *)calloc(4,4);
  79.          if (Params == NULL)
  80.          {
  81.                  VirtualFreeEx(Process,NameBufPtr_U,0,MEM_RELEASE);
  82.                  if (PathBufPtr != NULL)
  83.                         VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  84.                  VirtualFreeEx(Process,DllHandle,0,MEM_RELEASE);
  85.                  return 0;
  86.          }
  87.          Params[0] = PathBufPtr;
  88.          Params[1] = NULL;
  89.          Params[2] = NameBufPtr_U;
  90.          Params[3] = DllHandle;
  91.          RemoteCallSystem(Process,TEXT("ntdll.dll"),"LdrLoadDll",Params,4);
  92.          ReadProcessMemory(Process,DllHandle,&result,4,NULL);
  93.          VirtualFreeEx(Process,DllHandle,0,MEM_RELEASE);
  94.          VirtualFreeEx(Process,NameBufPtr_U,0,MEM_RELEASE);
  95.          if (PathBufPtr != NULL)
  96.                  VirtualFreeEx(Process,PathBufPtr,0,MEM_RELEASE);
  97.          free(Params);
  98.          return result;
  99. }

Code:
  1. BOOL RemoteCallApcEx(
  2.          __in const HANDLE Process,
  3.          __in const HANDLE Thread,
  4.          __in const FARPROC Function,
  5.          __in_opt const PVOID * Params,
  6.          __in int paramcount,
  7.          __inout PMEM *MemoryList,
  8.          __in_opt HANDLE Event,
  9.          __out_opt ULONG * result
  10.          )
  11. {
  12.          void *codebase;
  13.          //HMODULE ntdll;
  14.          if (MemoryList == NULL)
  15.                  return FALSE;
  16.          if (*MemoryList == NULL)
  17.                  *MemoryList = InitMemoryList(Process);
  18.          if (*MemoryList == NULL)
  19.                  return FALSE;
  20.          if (ntdll == NULL)
  21.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  22.          if (ntdll==NULL)
  23.                  return FALSE;
  24.          codebase = RemoteBuildCode(Process,Params,paramcount,(ULONG)Function,Event,result );
  25.          if (codebase == NULL)
  26.                  return FALSE;
  27.          AddMemoryList(*MemoryList,codebase);
  28.          //===================================================================  ================================================
  29.          //Queue Asyncronous Procedure Call in created thread
  30.          ZwQueueApcThread(Thread,(PIO_APC_ROUTINE)codebase,NULL,NULL,0);
  31.          //start thread (calling APC)
  32.          //ResumeThread(Thread);
  33.          //waiting to thread finish
  34.          //apc calls -- no wait... need alternative path to wait apc to free allocated memory
  35.          //WaitForSingleObject(Thread,INFINITE);
  36.          //reading result
  37.          //ReadProcessMemory(Process,(LPCVOID)result,&result,4,NULL);
  38.          //VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  39.          //CloseHandle(hthread);
  40.          return TRUE;
  41. }





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 10 февраля 2010 15:03
· Личное сообщение · #6

Code:
  1. //удалённый вызов, используя APC очередь уже созданного потока (например первый поток приложения)
  2. BOOL RemoteCallApc(
  3.          __in const HANDLE Process,
  4.          __in const HANDLE Thread,
  5.          __in const wchar_t * Library,
  6.          __in const char * Function,
  7.          __in_opt const PVOID * Params,
  8.          __in int paramcount,
  9.          __inout PMEM *MemoryList,
  10.          __in_opt HANDLE Event,
  11.          __out_opt ULONG * result
  12.          )
  13. {
  14.          void *codebase, *libaddr;
  15.          //HMODULE ntdll;
  16.          if (MemoryList == NULL)
  17.                  return FALSE;
  18.          if (*MemoryList == NULL)
  19.                  *MemoryList = InitMemoryList(Process);
  20.          if (*MemoryList == NULL)
  21.                  return FALSE;
  22.          if (ntdll == NULL)
  23.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  24.          if (ntdll==NULL)
  25.                  return FALSE;
  26.          //get library base in process address space
  27.          //need TEST!!!
  28.          libaddr = RemoteGetDllHandle(Process,Library);
  29.          if (libaddr == NULL)
  30.                  return FALSE;
  31.          //eval function address
  32.          //need TEST!!!
  33.          codebase = RemoteBuildCode(Process,Params,paramcount,(ULONG)RemoteGetProcAddress( Process,(HMODULE)libaddr,Function),Event,result);
  34.          if (codebase == NULL)
  35.                  return FALSE;
  36.          AddMemoryList(*MemoryList,codebase);
  37.          //=================================================================== ================================================
  38.          //Queue Asyncronous Procedure Call in created thread
  39.          ZwQueueApcThread(Thread,(PIO_APC_ROUTINE)codebase,NULL,NULL,0);
  40.          //start thread (calling APC)
  41.          //ResumeThread(Thread);
  42.          //waiting to thread finish
  43.          //apc calls -- no wait... need alternative path to wait apc to free allocated memory
  44.          //WaitForSingleObject(Thread,INFINITE);
  45.          //reading result
  46.          //ReadProcessMemory(Process,(LPCVOID)result,&result,4,NULL);
  47.          //VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  48.          //CloseHandle(hthread);
  49.          return TRUE;
  50. }

Code:
  1. ULONG RemoteCallEx(
  2.          __in const HANDLE Process,
  3.          __in const FARPROC Function,
  4.          __in_opt const PVOID * Params,
  5.          __in int paramcount
  6.          )
  7. {
  8.          void *codebase;
  9.          ULONG result,StackReserved,StackCommit;
  10.          CLIENT_ID cid;
  11.          //HMODULE ntdll;
  12.          HANDLE hthread;
  13.          //Process = OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessId);
  14.          //if (Process == NULL)
  15.          //      return 0;
  16.          if (ntdll == NULL)
  17.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  18.          if (ntdll == NULL)
  19.                  return 0;
  20.          //eval function address, build code in process
  21.          codebase = RemoteBuildCode(Process,Params,paramcount,(ULONG)Function,NULL,&result );
  22.          if (codebase == NULL)
  23.                  return 0;
  24.          //Create Thread
  25.          StackReserved = 0;
  26.          StackCommit = 0;
  27.          if (!NT_SUCCESS(RtlCreateUserThread(Process,NULL,TRUE,0,&StackReserved,&S tackCommit,GetProcAddress(ntdll,"RtlExitUserThread"),NULL,&hthread,&ci d)))
  28.          {
  29.                  VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  30.                  return 0;
  31.          }
  32.          //Queue Asyncronous Procedure Call in created thread
  33.          ZwQueueApcThread(hthread,(PIO_APC_ROUTINE)codebase,NULL,NULL,0);
  34.          //start thread (calling APC)
  35.          ResumeThread(hthread);
  36.          //waiting to thread finish
  37.          WaitForSingleObject(hthread,INFINITE);
  38.          //reading result
  39.          ReadProcessMemory(Process,(LPCVOID)result,&result,4,NULL);
  40.          VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  41.          CloseHandle(hthread);
  42.          return result;
  43. }

Code:
  1. //удалённый вызов
  2. //работает с любыми библиотеками, загруженными в адресное пространство любого процесса
  3. ULONG RemoteCall(
  4.          __in const HANDLE Process,
  5.          __in const wchar_t * Library,
  6.          __in const char * Function,
  7.          __in_opt const PVOID * Params,
  8.          __in int paramcount
  9.          )
  10. {
  11.          void *codebase, *libaddr;
  12.          ULONG result,StackReserved,StackCommit;
  13.          CLIENT_ID cid;
  14.          //HMODULE ntdll;
  15.          HANDLE hthread;
  16.          //Process = OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessId);
  17.          //if (Process == NULL)
  18.          //      return 0;
  19.          if (ntdll == NULL)
  20.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  21.          if (ntdll == NULL)
  22.                  return 0;
  23.          //get library base in process address space
  24.          libaddr = RemoteGetDllHandle(Process,Library);
  25.          if (libaddr == NULL)
  26.                  return 0;
  27.          //eval function address, build code in process
  28.          codebase = RemoteBuildCode(Process,Params,paramcount,(ULONG)RemoteGetProcAddress( Process,(HMODULE)libaddr,Function),NULL,&result);
  29.          if (codebase == NULL)
  30.                  return 0;
  31.          //Create Thread
  32.          StackReserved = 0;
  33.          StackCommit = 0;
  34.          if (!NT_SUCCESS(RtlCreateUserThread(Process,NULL,TRUE,0,&StackReserved,&S tackCommit,GetProcAddress(ntdll,"RtlExitUserThread"),NULL,&hthread,&ci d)))
  35.          {
  36.                  VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  37.                  return 0;
  38.          }
  39.          //Queue Asyncronous Procedure Call in created thread
  40.          ZwQueueApcThread(hthread,(PIO_APC_ROUTINE)codebase,NULL,NULL,0);
  41.          //start thread (calling APC)
  42.          ResumeThread(hthread);
  43.          //waiting to thread finish
  44.          WaitForSingleObject(hthread,INFINITE);
  45.          //reading result
  46.          ReadProcessMemory(Process,(LPCVOID)result,&result,4,NULL);
  47.          VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  48.          CloseHandle(hthread);
  49.          return result;
  50. }

Code:
  1. ULONG RemoteCallSystemEx(
  2.          __in const HANDLE Process,
  3.          __in const FARPROC Function,
  4.          __in_opt const PVOID * Params,
  5.          __in int paramcount
  6.          )
  7. {
  8.          void *codebase;
  9.          ULONG result,StackReserved,StackCommit;
  10.          CLIENT_ID cid;
  11.          HANDLE hthread;
  12.          ULONG state;
  13.          if (ntdll == NULL)
  14.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  15.          if (ntdll == NULL)
  16.                  return 0;
  17.          codebase = RemoteBuildCode(Process,Params,paramcount,(ULONG)Function,NULL,&result );
  18.          if (codebase == NULL)
  19.                  return 0;
  20.          //Create Thread
  21.          StackReserved = 0;
  22.          StackCommit = 0;
  23.          if (!NT_SUCCESS(RtlCreateUserThread(Process,NULL,TRUE,0,&StackReserved,&S tackCommit,GetProcAddress(ntdll,"RtlExitUserThread"),NULL,&hthread,&ci d)))
  24.          {
  25.                  VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  26.                  return 0;
  27.          }
  28.          //Queue Asyncronous Procedure Call in created thread
  29.          ZwQueueApcThread(hthread,(PIO_APC_ROUTINE)codebase,NULL,NULL,0);
  30.          //start thread (calling APC)
  31.          ResumeThread(hthread);
  32.          //waiting to thread finish
  33.          WaitForSingleObjectEx(hthread,INFINITE,TRUE);
  34.          GetExitCodeThread(hthread,&state);
  35.          //reading result
  36.          ReadProcessMemory(Process,(LPCVOID)result,&result,4,NULL);
  37.          VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  38.          CloseHandle(hthread);
  39.  
  40.          return result;
  41. }

Code:
  1. //удалённый вызов
  2. //работает только с библиотеками, которые загружены по одному адресу в разных процессах
  3. //обычно так загружены все системные библиотеки
  4. ULONG RemoteCallSystem(
  5.          __in const HANDLE Process,
  6.          __in const wchar_t * Library,
  7.          __in const char * Function,
  8.          __in_opt const PVOID * Params,
  9.          __in int paramcount
  10.          )
  11. {
  12.          void *codebase;
  13.          ULONG result,StackReserved,StackCommit;
  14.          CLIENT_ID cid;
  15.          HMODULE lib;
  16.          HANDLE hthread;
  17.          ULONG state;
  18.          if (ntdll == NULL)
  19.                  ntdll = GetModuleHandleW(TEXT("ntdll.dll"));
  20.          if (ntdll == NULL)
  21.                  return 0;
  22.          lib = GetModuleHandleW(Library);
  23.          if (lib == NULL)
  24.                  return 0;
  25.          codebase = RemoteBuildCode(Process,Params,paramcount,(ULONG)GetProcAddress(lib,Fu nction),NULL,&result);
  26.          if (codebase == NULL)
  27.                  return 0;
  28.          //Create Thread
  29.          StackReserved = 0;
  30.          StackCommit = 0;
  31.          if (!NT_SUCCESS(RtlCreateUserThread(Process,NULL,TRUE,0,&StackReserved,&S tackCommit,GetProcAddress(ntdll,"RtlExitUserThread"),NULL,&hthread,&ci d)))
  32.          {
  33.                  VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  34.                  return 0;
  35.          }
  36.          //Queue Asyncronous Procedure Call in created thread
  37.          ZwQueueApcThread(hthread,(PIO_APC_ROUTINE)codebase,NULL,NULL,0);
  38.          //start thread (calling APC)
  39.          ResumeThread(hthread);
  40.          //waiting to thread finish
  41.          WaitForSingleObjectEx(hthread,INFINITE,TRUE);
  42.          GetExitCodeThread(hthread,&state);
  43.          //reading result
  44.          ReadProcessMemory(Process,(LPCVOID)result,&result,4,NULL);
  45.          VirtualFreeEx(Process,codebase,0,MEM_RELEASE);
  46.          CloseHandle(hthread);
  47.  
  48.          return result;
  49. }





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 10 февраля 2010 15:05
· Личное сообщение · #7

Code:
  1. //структура хранящая указатели на выделенные куски памяти в другом процессе, для их последующего завершения
  2. typedef struct _MEM
  3. {
  4.          int count;
  5.          HANDLE Process;
  6.          void ** mems;
  7. } MEM,*PMEM;
  8. //опкоды инструкций
  9. static const BYTE mov_esp_eax[] = {0x89,0x84,0x24};//mov dword ptr [esp-(param_c+1)*4], eax
  10. static const BYTE mov_esp_ecx[] = {0x89,0x8C,0x24};//mov dword ptr [esp-(param_c+2)*4], ecx
  11. static const BYTE mov_ecx_num[] = {0xB9};//mov ecx, 5
  12. static const BYTE mov_eax_num[] = {0xB8};//mov eax, 10
  13. static const BYTE jmp_[] = {0xE9};//jmp addr_rel
  14. static const BYTE call_[] = {0xE8};//call addr_rel
  15. static const BYTE jmp_far[] = {0xEA};//jmp far addr_abs
  16. static const BYTE ret_st[] = {0xC2};//ret num
  17. static const BYTE ret_[] = {0xC3};//ret
  18. static const BYTE push_[] = {0x68};//push dword
  19. static const BYTE int_3_[] = {0xCC};//int 3
  20. static const BYTE nop_[] = {0x90};//nop
  21. static const BYTE pushad_[] = {0x60};//pushad





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 10 февраля 2010 15:36
· Личное сообщение · #8

норм, готовый конструктор вирусов выложил



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

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

Реализация двусвязных списков, аналогичных ядерным, но для юзермода, написаны с использовании моих спинлоков, код которых описан выше. В качестве мануала по использованию можно читать WDK, все входные и выходные данные совпадают

Code:
  1.  
  2. typedef struct _list_entry_t {
  3.          struct _list_entry_t *flink;
  4.          struct _list_entry_t *blink;
  5. } list_entry_t;
  6.  
  7. #define is_list_empty(list_head) ((list_head)->flink == (list_head))
  8.  
  9. void initialize_list_head(list_entry_t* list_head)
  10. {
  11.          list_head->flink = list_head->blink = list_head;
  12. }
  13.  
  14. bool remove_entry_list(list_entry_t* entry)
  15. {
  16.          list_entry_t* blink;
  17.          list_entry_t* flink;
  18.  
  19.          flink = entry->flink;
  20.          blink = entry->blink;
  21.          blink->flink = flink;
  22.          flink->blink = blink;
  23.          return (flink == blink);
  24. }
  25.  
  26. list_entry_t* remove_head_list(list_entry_t* list_head)
  27. {
  28.          list_entry_t* flink;
  29.          list_entry_t* entry;
  30.  
  31.          entry = list_head->flink;
  32.          flink = entry->flink;
  33.          list_head->flink = flink;
  34.          flink->blink = list_head;
  35.          return entry;
  36. }
  37.  
  38. list_entry_t* remove_tail_list(list_entry_t* list_head)
  39. {
  40.          list_entry_t* blink;
  41.          list_entry_t* entry;
  42.  
  43.          entry = list_head->blink;
  44.          blink = entry->blink;
  45.          list_head->blink = blink;
  46.          blink->flink = list_head;
  47.          return entry;
  48. }
  49.  
  50. void insert_tail_list(list_entry_t* list_head, list_entry_t* entry)
  51. {
  52.          list_entry_t* blink;
  53.  
  54.          blink = list_head->blink;
  55.          entry->flink = list_head;
  56.          entry->blink = blink;
  57.          blink->flink = entry;
  58.          list_head->blink = entry;
  59. }
  60.  
  61. void __forceinline insert_head_list(list_entry_t* list_head, list_entry_t* entry)
  62. {
  63.          list_entry_t* flink;
  64.  
  65.          flink = list_head->flink;
  66.          entry->flink = flink;
  67.          entry->blink = list_head;
  68.          flink->blink = entry;
  69.          list_head->flink = entry;
  70. }
  71.  
  72. void interlocked_insert_head_list(list_entry_t* list_head, list_entry_t* list_entry, spin_lock_t* lock)
  73. {
  74.          acquire_spinlock(lock);
  75.          insert_head_list(list_head,list_entry);
  76.          release_spinlock(lock);
  77. }
  78.  
  79. void interlocked_insert_tail_list(list_entry_t* list_head, list_entry_t* list_entry, spin_lock_t* lock)
  80. {
  81.          acquire_spinlock(lock);
  82.          insert_tail_list(list_head,list_entry);
  83.          release_spinlock(lock);
  84. }
  85.  
  86. list_entry_t* interlocked_remove_head_list(list_entry_t* list_head, spin_lock_t* lock)
  87. {
  88.          list_entry_t* entry;
  89.          acquire_spinlock(lock);
  90.          entry = remove_head_list(list_head);
  91.          release_spinlock(lock);
  92.          return entry;
  93. }
  94.  
  95. list_entry_t* interlocked_remove_tail_list(list_entry_t* list_head, spin_lock_t* lock)
  96. {
  97.          list_entry_t* entry;
  98.          acquire_spinlock(lock);
  99.          entry = remove_tail_list(list_head);
  100.          release_spinlock(lock);
  101.          return entry;
  102. }
  103.  




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

Создано: 10 февраля 2010 18:48
· Личное сообщение · #10

multiarc
> так же желательно сделать все вызовы нативными, для возможности инжекта так же в графическую подсистему csrss!
Нэйтив юзается изза следующих причин:
o Самодостаточный код(вызов непосредственно через шлюзы).
o Если не достаточно функционала более высокоуровневого кода.
csrss это обычный гуи-процесс.
> получает адрес процедуры в нужной библиотеке в чужом процессе
Для этого есть системные апи, например RtlQueryProcessDebugInformation().




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 10 февраля 2010 23:01
· Личное сообщение · #11

Хорош оффтопить уже, ближе к теме давайте, не захламляйте потенциально полезный топик, буду удалять.



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

Создано: 11 февраля 2010 10:22
· Личное сообщение · #12

Замудреный юзермодный протектор от удаленных потоков (натив)

3726_10.02.2010_CRACKLAB.rU.tgz - InjProt.7z

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




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

Создано: 11 февраля 2010 11:15 · Поправил: Twister
· Личное сообщение · #13

HiEndsoft

1. GetProcAddressEx() не учитывает того, что возможен IAT-перехват искомой функции. Если это случится, все пойдет прахом.
2. Обработчик NewNtCreateThread() не учитывает того, что в PCLIENT_ID a5 может быть передан NULL. Сами знаете, чем такое закончится.
3. Внутри программы сервис NtCreateThread() может быть вызван напрямую в обход ntdll. В этом случае ваш алгоритм не распознает свой поток и прибъет его.



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

Создано: 11 февраля 2010 11:19 · Поправил: HiEndsoft
· Личное сообщение · #14

Clerk
NtQueryVirtualMemory - тоже функция ничего для получения карты памяти процесса
Twister
Панацей не бывает в юзермоде (и даже практически в ядре) + Код делался для собственных целей для псевдозащиты cssrs тонкости там сами понимаете какие. Винду придумали-это хорошо, но идиоты - это плохо.

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





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 11 февраля 2010 12:32 · Поправил: Модератор
· Личное сообщение · #15

давайте биже к теме и без перехода на личности

-----
[nice coder and reverser]




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

Создано: 11 февраля 2010 13:30 · Поправил: HiEndsoft
· Личное сообщение · #16

Либа для работы с частотниками Mitsubishi по RS485. (сорцы Си 6)

d31f_11.02.2010_CRACKLAB.rU.tgz - watersky.7z

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




Ранг: 116.5 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 12 февраля 2010 00:44 · Поправил: Valemox
· Личное сообщение · #17

HiEndsoft пишет:
Замудреный юзермодный протектор от удаленных потоков

HiEndsoft, хотел собрать либ и поюзать, но чота не нашлось ntundoc хидера, мож поделишся?
ЗЫ. HiEndsoft, спс



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

Создано: 12 февраля 2010 01:10 · Поправил: Clerk
· Личное сообщение · #18

HiEndsoft
> NtQueryVirtualMemory - тоже функция ничего для получения карты памяти процесса
Согласен, но причём тут это ?
> Замудреный юзермодный протектор от удаленных потоков (натив)
Сложный != эффективный.
Code:
  1. Запуск пользовательского потока в обход перехвата диспетчера APC(R3).
  2.  o Восстанавливаем RtlpCalloutEntryList, для исключения глобальных VEH.
  3.  o Создаём удалённый поток.
  4.  o Формируем SEH-фрейм.
  5.  o Взводим TF в контексте.
  6.  Поток стартует с взведённым TF. После исполнения первой инструкции диспетчера апк(KiUserApcDispatcher()) 
  7.  генерируется трассировочное исключение. Управление получает диспетчер исключений(KiUserExceptionDispatch
  8.  er()). Векторные обработчики не вызываются(RtlCallVectoredExceptionHandlers()). Вызывается установленный 
  9.  SEH. Если диспетчер APC захвачен сплайсингом, останов генерируется после исполнения джампа. Если диспетч
  10.  ер APC перенаправлен на диспетчер исключений, посредством установки точки останова, прежде будет вызван 
  11.  SEH(если хэндлер установлен как VEH).
  12.  -

Тэги только у меня не робят, тогда как цитировать ?



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

Создано: 12 февраля 2010 08:20
· Личное сообщение · #19

Valemox пишет:
хотел собрать либ и поюзать, но чота не нашлось ntundoc хидера, мож поделишся?

в аттаче
Clerk
ты прав


f3ca_11.02.2010_CRACKLAB.rU.tgz - ntundoc.h

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




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

Создано: 12 февраля 2010 19:36 · Поправил: Clerk
· Личное сообщение · #20

Coderess
Значит я не правильно понял, пенгвинчег
-
Трушный хидер(*avrf, [FLG_APPLICATION_VERIFIER, VerifierDlls]):
Code:
  1. ; Application verifier types needed by provider dlls
  2.  
  3. DLL_PROCESS_VERIFIER       equ 4
  4.  
  5. comment '
  6. typedef VOID (NTAPI * RTL_VERIFIER_DLL_LOAD_CALLBACK) (
  7.     PWSTR DllName,
  8.     PVOID DllBase,
  9.     SIZE_T DllSize,
  10.     PVOID Reserved
  11.     );
  12.  
  13. typedef VOID (NTAPI * RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
  14.     PWSTR DllName,
  15.     PVOID DllBase,
  16.     SIZE_T DllSize,
  17.     PVOID Reserved
  18.     );
  19.  
  20. typedef VOID (NTAPI * RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK) (
  21.     PVOID AllocationBase,
  22.     SIZE_T AllocationSize
  23.     );
  24.     '
  25.  
  26. ; AVrfpNtdllThunks
  27. ; Ноль в конце списка.
  28. ;
  29. RTL_VERIFIER_THUNK_DESCRIPTOR struct
  30. ThunkName         PCHAR ? ; Имя экспорта.
  31. ThunkOldAddress   PVOID ?    ; Адрес экспорта.
  32. ThunkNewAddress   PVOID ?    ; Адрес обработчика.
  33. RTL_VERIFIER_THUNK_DESCRIPTOR ends
  34. PRTL_VERIFIER_THUNK_DESCRIPTOR typedef ptr RTL_VERIFIER_THUNK_DESCRIPTOR
  35.  
  36. ; AVrfpExportDlls
  37. ;
  38. ; Ноль в конце списка.
  39. RTL_VERIFIER_DLL_DESCRIPTOR struct
  40. DllName   PWCHAR ?
  41. DllFlags ULONG ?
  42. DllAddress        PVOID ?
  43. DllThunks         PRTL_VERIFIER_THUNK_DESCRIPTOR ?   ; Указатель на массив описателей, ptr AVrfpNtdllThunks
  44. RTL_VERIFIER_DLL_DESCRIPTOR ends
  45. PRTL_VERIFIER_DLL_DESCRIPTOR typedef ptr RTL_VERIFIER_DLL_DESCRIPTOR
  46.  
  47. ; В InitRoutine.Context возвращается эта структура.
  48. ;
  49. RTL_VERIFIER_PROVIDER_DESCRIPTOR struct
  50. ; Filled by verifier provider DLL
  51. _Length                    ULONG ?         ; 0x1C !
  52. ProviderDlls               PRTL_VERIFIER_DLL_DESCRIPTOR ?
  53. ProviderDllLoadCallback       PVOID ?    ; RTL_VERIFIER_DLL_LOAD_CALLBACK
  54. ProviderDllUnloadCallback  PVOID ?   ; RTL_VERIFIER_DLL_UNLOAD_CALLBACK
  55. ; Filled by verifier engine
  56. VerifierImage            PWSTR ?
  57. VerifierFlags            ULONG ?
  58. VerifierDebug            ULONG ?
  59. ;RtlpGetStackTraceAddress PVOID ?
  60. ;RtlpDebugPageHeapCreate PVOID ?
  61. ;RtlpDebugPageHeapDestroy PVOID ?
  62. ; Filled by verifier provider DLL
  63. ;ProviderNtdllHeapFreeCallback PVOID ? ; RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK
  64. RTL_VERIFIER_PROVIDER_DESCRIPTOR ends
  65. PRTL_VERIFIER_PROVIDER_DESCRIPTOR typedef ptr RTL_VERIFIER_PROVIDER_DESCRIPTOR
  66.  
  67. ; Private.
  68. ; -> [ntdll!AVrfpVerifierProvidersList]
  69.  
  70. PROVIDER_ENTRY struct
  71. Link         LIST_ENTRY <>
  72. DllName   UNICODE_STRING <>
  73. DllBase   PVOID ?
  74. EntryPoint        PVOID ?
  75. ExportDlls        PRTL_VERIFIER_DLL_DESCRIPTOR ?    ; Указатель на массив описателей, ptr AVrfpExportDlls
  76. Undef1     DD ?
  77. Undef2     DD ?
  78. PROVIDER_ENTRY ends
  79.  
  80. ; Application verifier standard flags
  81.  
  82. RTL_VRF_FLG_FULL_PAGE_HEAP                   equ 00000001H
  83. RTL_VRF_FLG_RESERVED_DONOTUSE                equ 00000002H     ; old RTL_VRF_FLG_LOCK_CHECKS
  84. RTL_VRF_FLG_HANDLE_CHECKS                    equ 00000004H
  85. RTL_VRF_FLG_STACK_CHECKS                     equ 00000008H
  86. RTL_VRF_FLG_APPCOMPAT_CHECKS                 equ 00000010H
  87. RTL_VRF_FLG_TLS_CHECKS                       equ 00000020H
  88. RTL_VRF_FLG_DIRTY_STACKS                     equ 00000040H
  89. RTL_VRF_FLG_RPC_CHECKS                       equ 00000080H
  90. RTL_VRF_FLG_COM_CHECKS                       equ 00000100H
  91. RTL_VRF_FLG_DANGEROUS_APIS                   equ 00000200H
  92. RTL_VRF_FLG_RACE_CHECKS                      equ 00000400H
  93. RTL_VRF_FLG_DEADLOCK_CHECKS                  equ 00000800H
  94. RTL_VRF_FLG_FIRST_CHANCE_EXCEPTION_CHECKS    equ 00001000H
  95. RTL_VRF_FLG_VIRTUAL_MEM_CHECKS               equ 00002000H
  96. RTL_VRF_FLG_ENABLE_LOGGING                   equ 00004000H
  97. RTL_VRF_FLG_FAST_FILL_HEAP                   equ 00008000H
  98. RTL_VRF_FLG_VIRTUAL_SPACE_TRACKING           equ 00010000H
  99. RTL_VRF_FLG_ENABLED_SYSTEM_WIDE              equ 00020000H
  100. RTL_VRF_FLG_MISCELLANEOUS_CHECKS             equ 00020000H
  101. RTL_VRF_FLG_LOCK_CHECKS                      equ 00040000H
  102.  
  103. ; Application verifier standard stop codes
  104.  
  105. APPLICATION_VERIFIER_INTERNAL_ERROR               equ 80000000H
  106. APPLICATION_VERIFIER_INTERNAL_WARNING             equ 40000000H
  107. APPLICATION_VERIFIER_NO_BREAK                     equ 20000000H
  108. APPLICATION_VERIFIER_CONTINUABLE_BREAK            equ 10000000H
  109.  
  110. APPLICATION_VERIFIER_UNKNOWN_ERROR                    equ 0001H
  111. APPLICATION_VERIFIER_ACCESS_VIOLATION                 equ 0002H
  112. APPLICATION_VERIFIER_UNSYNCHRONIZED_ACCESS            equ 0003H
  113. APPLICATION_VERIFIER_EXTREME_SIZE_REQUEST             equ 0004H
  114. APPLICATION_VERIFIER_BAD_HEAP_HANDLE                  equ 0005H
  115. APPLICATION_VERIFIER_SWITCHED_HEAP_HANDLE             equ 0006H
  116. APPLICATION_VERIFIER_DOUBLE_FREE                      equ 0007H
  117. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK             equ 0008H
  118. APPLICATION_VERIFIER_DESTROY_PROCESS_HEAP             equ 0009H
  119. APPLICATION_VERIFIER_UNEXPECTED_EXCEPTION             equ 000AH
  120. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_HEADER equ 000BH
  121. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_PROBING equ 000CH
  122. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_HEADER      equ 000DH
  123. APPLICATION_VERIFIER_CORRUPTED_FREED_HEAP_BLOCK       equ 000EH
  124. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_SUFFIX      equ 000FH
  125. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_START_STAMP equ 0010H
  126. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_END_STAMP   equ 0011H
  127. APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_PREFIX      equ 0012H
  128. APPLICATION_VERIFIER_FIRST_CHANCE_ACCESS_VIOLATION    equ 0013H
  129. APPLICATION_VERIFIER_CORRUPTED_HEAP_LIST              equ 0014H
  130.  
  131. APPLICATION_VERIFIER_TERMINATE_THREAD_CALL        equ 0100H
  132. APPLICATION_VERIFIER_STACK_OVERFLOW               equ 0101H
  133. APPLICATION_VERIFIER_INVALID_EXIT_PROCESS_CALL    equ 0102H
  134.  
  135. APPLICATION_VERIFIER_EXIT_THREAD_OWNS_LOCK        equ 0200H
  136. APPLICATION_VERIFIER_LOCK_IN_UNLOADED_DLL         equ 0201H
  137. APPLICATION_VERIFIER_LOCK_IN_FREED_HEAP           equ 0202H
  138. APPLICATION_VERIFIER_LOCK_DOUBLE_INITIALIZE       equ 0203H
  139. APPLICATION_VERIFIER_LOCK_IN_FREED_MEMORY         equ 0204H
  140. APPLICATION_VERIFIER_LOCK_CORRUPTED               equ 0205H
  141. APPLICATION_VERIFIER_LOCK_INVALID_OWNER           equ 0206H
  142. APPLICATION_VERIFIER_LOCK_INVALID_RECURSION_COUNT equ 0207H
  143. APPLICATION_VERIFIER_LOCK_INVALID_LOCK_COUNT      equ 0208H
  144. APPLICATION_VERIFIER_LOCK_OVER_RELEASED           equ 0209H
  145. APPLICATION_VERIFIER_LOCK_NOT_INITIALIZED         equ 0210H
  146. APPLICATION_VERIFIER_LOCK_ALREADY_INITIALIZED     equ 0211H
  147. APPLICATION_VERIFIER_LOCK_IN_FREED_VMEM           equ 0212H
  148. APPLICATION_VERIFIER_LOCK_IN_UNMAPPED_MEM         equ 0213H
  149. APPLICATION_VERIFIER_THREAD_NOT_LOCK_OWNER        equ 0214H
  150.  
  151. APPLICATION_VERIFIER_INVALID_HANDLE               equ 0300H
  152. APPLICATION_VERIFIER_INVALID_TLS_VALUE            equ 0301H
  153. APPLICATION_VERIFIER_INCORRECT_WAIT_CALL          equ 0302H
  154. APPLICATION_VERIFIER_NULL_HANDLE                  equ 0303H
  155. APPLICATION_VERIFIER_WAIT_IN_DLLMAIN              equ 0304H
  156.  
  157. APPLICATION_VERIFIER_COM_ERROR                    equ 0400H
  158. APPLICATION_VERIFIER_COM_API_IN_DLLMAIN           equ 0401H
  159. APPLICATION_VERIFIER_COM_UNHANDLED_EXCEPTION      equ 0402H
  160. APPLICATION_VERIFIER_COM_UNBALANCED_COINIT        equ 0403H
  161. APPLICATION_VERIFIER_COM_UNBALANCED_OLEINIT       equ 0404H
  162. APPLICATION_VERIFIER_COM_UNBALANCED_SWC           equ 0405H
  163. APPLICATION_VERIFIER_COM_NULL_DACL                equ 0406H
  164. APPLICATION_VERIFIER_COM_UNSAFE_IMPERSONATION     equ 0407H
  165. APPLICATION_VERIFIER_COM_SMUGGLED_WRAPPER         equ 0408H
  166. APPLICATION_VERIFIER_COM_SMUGGLED_PROXY           equ 0409H
  167. APPLICATION_VERIFIER_COM_CF_SUCCESS_WITH_NULL     equ 040AH
  168. APPLICATION_VERIFIER_COM_GCO_SUCCESS_WITH_NULL    equ 040BH
  169. APPLICATION_VERIFIER_COM_OBJECT_IN_FREED_MEMORY   equ 040CH
  170. APPLICATION_VERIFIER_COM_OBJECT_IN_UNLOADED_DLL   equ 040DH
  171. APPLICATION_VERIFIER_COM_VTBL_IN_FREED_MEMORY     equ 040EH
  172. APPLICATION_VERIFIER_COM_VTBL_IN_UNLOADED_DLL     equ 040FH
  173. APPLICATION_VERIFIER_COM_HOLDING_LOCKS_ON_CALL    equ 0410H
  174.  
  175. APPLICATION_VERIFIER_RPC_ERROR                    equ 0500H
  176.  
  177. APPLICATION_VERIFIER_INVALID_FREEMEM              equ 0600H
  178. APPLICATION_VERIFIER_INVALID_ALLOCMEM             equ 0601H
  179. APPLICATION_VERIFIER_INVALID_MAPVIEW              equ 0602H
  180. APPLICATION_VERIFIER_PROBE_INVALID_ADDRESS        equ 0603H
  181. APPLICATION_VERIFIER_PROBE_FREE_MEM               equ 0604H
  182. APPLICATION_VERIFIER_PROBE_GUARD_PAGE             equ 0605H
  183. APPLICATION_VERIFIER_PROBE_NULL                   equ 0606H
  184. APPLICATION_VERIFIER_PROBE_INVALID_START_OR_SIZE  equ 0607H
  185. APPLICATION_VERIFIER_SIZE_HEAP_UNEXPECTED_EXCEPTION equ 0618H

HiEndsoft
> колес надо меньше жрать. Я -то по пивку.
Сложно понять вас



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

Создано: 15 февраля 2010 02:33
· Личное сообщение · #21

Установка, запуск, остановка и удаление драйвера.
Код полностью не тестил, возможны мелкие баги.
Code:
  1. #include <windows.h>
  2.  
  3. SC_HANDLE install_driver(const wchar_t *name, const wchar_t *path)
  4. {
  5.          SC_HANDLE h_scm;
  6.          SC_HANDLE h_svc = NULL;
  7.  
  8.          if (!path || !name)
  9.                  return INVALID_HANDLE_VALUE;
  10.  
  11.          h_scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  12.          if (h_scm) {
  13.                  h_svc = CreateServiceW(
  14.                         h_scm,name,name,
  15.                         SERVICE_ALL_ACCESS,
  16.                         SERVICE_KERNEL_DRIVER,
  17.                         SERVICE_DEMAND_START,
  18.                         SERVICE_ERROR_IGNORE,
  19.                         path,NULL,NULL,NULL,NULL,NULL);
  20.  
  21.                  if (!h_svc)
  22.                         h_svc = OpenServiceW(h_scm, name, SERVICE_ALL_ACCESS);
  23.  
  24.                  CloseServiceHandle(h_scm);
  25.          }
  26.  
  27.          return h_svc;
  28. }
  29.  
  30. SC_HANDLE open_driver(const wchar_t *name)
  31. {
  32.          SC_HANDLE h_scm;
  33.          SC_HANDLE h_svc = NULL;
  34.  
  35.          if (!name)
  36.                  return INVALID_HANDLE_VALUE;
  37.  
  38.          h_scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  39.          if (h_scm) {
  40.                  h_svc = OpenServiceW(h_scm, name, SERVICE_ALL_ACCESS);
  41.                  CloseServiceHandle(h_scm);
  42.          }
  43.  
  44.          return h_svc;
  45. }
  46.  
  47. DWORD query_status(SC_HANDLE h_svc) 
  48. {
  49.          SERVICE_STATUS_PROCESS ssp;
  50.          ULONG bytes;
  51.  
  52.          ssp.dwCurrentState = 0;
  53.          QueryServiceStatusEx( 
  54.                  h_svc, 
  55.                  SC_STATUS_PROCESS_INFO,
  56.                  (LPBYTE)&ssp, 
  57.                  sizeof(SERVICE_STATUS_PROCESS),
  58.                  &bytes);
  59.  
  60.          return ssp.dwCurrentState;
  61. }
  62.  
  63. int start_driver(SC_HANDLE h_svc)
  64. {
  65.          ULONG status = 0;
  66.          if (!h_svc)
  67.                  return 0;
  68.  
  69.          status = query_status(h_svc);
  70.          if (status != SERVICE_RUNNING)
  71.                  return StartServiceW(h_svc, 0, NULL);
  72.          else 
  73.                  return 1;
  74. }
  75.  
  76. int stop_driver(SC_HANDLE h_svc)
  77. {
  78.          ULONG status = 0;
  79.          SERVICE_STATUS   svc_status;
  80.  
  81.          if (!h_svc)
  82.                  return 0;
  83.  
  84.          status = query_status(h_svc);
  85.          if (status != SERVICE_STOPPED)
  86.                  return ControlService(h_svc, SERVICE_CONTROL_STOP, &svc_status);
  87.          else
  88.                  return 1;
  89. }
  90.  
  91. int uninstall_driver(SC_HANDLE h_svc)
  92. {
  93.          ULONG status = 0;
  94.  
  95.          status = query_status(h_svc);
  96.          if (status == SERVICE_RUNNING || status == SERVICE_PAUSED)
  97.                  stop_driver(h_svc);
  98.  
  99.          status = DeleteService(h_svc);
  100.          CloseServiceHandle(h_svc);
  101.  
  102.          return status;
  103. }
  104.  




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

Создано: 15 февраля 2010 02:50
· Личное сообщение · #22

Макросы для памяти

Code:
  1. #define malloc(Size) (Size ? (RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, (SIZE_T)(Size))) : NULL)
  2. #define realloc(Mem, Size) (Size ? (Mem ? RtlReAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, (PVOID)(Mem), Size) : malloc(Size)) : NULL)
  3. #define free(Mem) (Mem ? (RtlValidateHeap(GetProcessHeap(), NULL, Mem) ? (RtlFreeHeap(GetProcessHeap(), NULL, (PVOID)(Mem)), Mem = NULL) : NULL) : NULL)


-----
Shalom ebanats!




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

Создано: 15 февраля 2010 03:02 · Поправил: Clerk
· Личное сообщение · #23

Code:
  1. Редирект ApfnDispatch(KernelCallbackTable).
  2. ;
  3. ; ApfnDispatch:
  4. ; ...
  5. ; @Fn1 ; (N)
  6. ; @Fn2 ; (N + 1)
  7. ; ...
  8. ;
  9. ; [(N), P]:
  10. ; push @Fn1 ; x5
  11. ; jmp Stub ; x5
  12. ; [(N + 1), P + 10]:
  13. ; push @Fn2
  14. ; jmp Stub
  15. ; ...
  16. ;
  17. ; Stub:
  18. ; ...
  19. ; ret
  20.  
  21. IMAGE_MASK equ 0FF000000H
  22.  
  23.          assume fs:nothing         
  24. ApfnQuery proc uses ebx esi edi ApfnBase:PVOID, ApfnSize:PULONG
  25.          mov ebx,fs:[TEB.Peb]
  26.          mov edx,ApfnBase
  27.          mov ebx,PEB.KernelCallbackTable[ebx]
  28.          mov eax,STATUS_UNSUCCESSFUL        
  29.          test ebx,ebx
  30.          mov esi,ebx
  31.          jz Exit
  32.          mov dword ptr [edx],ebx
  33.          cld
  34.          and ebx,IMAGE_MASK
  35.          mov edi,esi
  36. @@:
  37.          lodsd
  38.          and eax,IMAGE_MASK
  39.          cmp eax,ebx
  40.          je @b
  41.          sub esi,edi      ; Размер таблицы в байтах.
  42.          mov eax,STATUS_UNSUCCESSFUL
  43.          sub esi,4
  44.          mov edx,ApfnSize
  45.          jz Exit
  46.          mov dword ptr [edx],esi
  47.          xor eax,eax
  48. Exit:
  49.          ret
  50. ApfnQuery endp
  51.  
  52. APFN_INFORMATION struct
  53. OldApfnBase       PVOID ?
  54. ApfnBase          PVOID ?
  55. OldApfnSize       ULONG ?
  56. ApfnSize          ULONG ? ; ..Page
  57. APFN_INFORMATION ends
  58. PAPFN_INFORMATION typedef ptr APFN_INFORMATION
  59.  
  60. ApfnRedirect proc uses ebx esi edi Stub:PVOID, ApfnInformation:PAPFN_INFORMATION
  61. Local Apfn:APFN_INFORMATION
  62.          invoke ApfnQuery, addr Apfn.OldApfnBase, addr Apfn.OldApfnSize
  63.          test eax,eax
  64.          mov ecx,Apfn.OldApfnSize
  65. ; s = n + n*2 + n/2
  66. ; s = (n/2)*7
  67.          jnz Exit
  68.          shr ecx,1
  69.          mov Apfn.ApfnBase,eax
  70.          lea edx,[ecx*8]
  71.          push PAGE_EXECUTE_READWRITE
  72.          sub edx,ecx
  73.          lea eax,Apfn.ApfnSize
  74.          push MEM_COMMIT
  75.          lea ecx,Apfn.ApfnBase
  76.          mov Apfn.ApfnSize,edx
  77.          push eax
  78.          push 0
  79.          push ecx
  80.          push NtCurrentProcess
  81.          Call ZwAllocateVirtualMemory
  82.          test eax,eax
  83.          mov ecx,Apfn.OldApfnSize
  84.          jnz Exit
  85.          mov edx,Apfn.ApfnBase
  86.          mov ebx,Stub     ; Disp.
  87.          mov edi,edx
  88.          mov esi,Apfn.OldApfnBase
  89.          add edi,ecx
  90.          cld
  91.          sub ebx,edi
  92.          shr ecx,2
  93.          sub ebx,2*5
  94. @@:
  95.          lodsd
  96.          mov byte ptr [edi],68H    ; Push fnXX
  97.          mov byte ptr [edi + 5],0E9H        ; Jmp Stub
  98.          mov dword ptr [edi + 1],eax
  99.          mov dword ptr [edi + 6],ebx
  100.          mov dword ptr [edx],edi
  101.          sub ebx,10
  102.          add edi,10
  103.          add edx,4
  104.          loop @b
  105.          mov ecx,fs:[TEB.Peb]
  106.          mov edx,Apfn.ApfnBase
  107.          lea esi,Apfn
  108.          mov edi,ApfnInformation
  109.          xor eax,eax
  110.          lock xchg PEB.KernelCallbackTable[ecx],edx
  111.          movsd
  112.          movsd
  113.          movsd
  114.          movsd
  115. Exit:
  116.          ret
  117. ApfnRedirect endp
  118.  
  119. .data
  120. CallbackCount     ULONG ?
  121.  
  122. .code
  123. ApfnStub proc C
  124.          inc CallbackCount
  125.          ret
  126. ApfnStub endp
  127.  
  128. Local ApfnInformation:APFN_INFORMATION
  129.          invoke ApfnRedirect, addr ApfnStub, addr ApfnInformation
  130.          ...

http://indy-vx.narod.ru/log.txt



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

Создано: 15 марта 2010 10:08 · Поправил: HiEndsoft
· Личное сообщение · #24

Т.к. пишу в основном в нативе, пригождаются след коды.
Натив -аналог SleepEx и Sleep:
Code:
  1. void WINAPI NtSleepEx(DWORD DurationMs,BOOL Alertable)
  2. {
  3.          struct
  4.          {
  5.                  DWORD Low;
  6.                  DWORD Hi;
  7.          } MLI={{-10000*DurationMs},{0xFFFFFFFF}};
  8.          NtDelayExecution(Alertable,(PLARGE_INTEGER)&MLI);
  9. }
  10.  
  11. #define NtSleep(_x)        NtSleepEx(_x,0)

Натив -аналог Beep:
Code:
  1. BOOL WINAPI NtBeep (DWORD dwFreq, DWORD dwDuration)
  2. {
  3.          HANDLE hBeep;
  4.          UNICODE_STRING BeepDevice;
  5.          OBJECT_ATTRIBUTES ObjectAttributes;
  6.          IO_STATUS_BLOCK IoStatusBlock;
  7.          if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||(dwFreq == 0x0 && dwDuration == 0x0))
  8.          {
  9.                  BeepDevice.Buffer=L"\Device\Beep";
  10.                  BeepDevice.Length=24;
  11.                  BeepDevice.MaximumLength=26;
  12.                  InitializeObjectAttributes(&ObjectAttributes,&BeepDevice,0,NULL,NULL      );
  13.                  if (NT_SUCCESS(NtCreateFile(&hBeep,FILE_READ_DATA | FILE_WRITE_DATA,&ObjectAttributes,&IoStatusBlock,NULL,0,FILE_SHARE_REA      D | FILE_SHARE_WRITE,FILE_OPEN_IF,0,NULL,0)))
  14.                  {
  15.                         struct 
  16.                         {
  17.                               ULONG Frequency;
  18.                               ULONG Duration;
  19.                         }         BEEP_SET_PARAMETERS={{dwFreq},{dwDuration}};
  20.                         if (NT_SUCCESS(NtDeviceIoControlFile(hBeep,NULL,NULL,NULL,&IoStatusBlock,      0x10000,&BEEP_SET_PARAMETERS,sizeof(BEEP_SET_PARAMETERS),NULL,0)))
  21.                         {
  22.                               if ((dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != (DWORD)-1) NtSleepEx(dwDuration,TRUE);
  23.                               NtClose(hBeep);
  24.                               return TRUE;
  25.                         } else return FALSE;
  26.                  }
  27.          }
  28.          return FALSE;
  29. }

И до кучи аналог MessageBox ч/з csrss(где ico - как и у MessageBox):
Code:
  1. inline void PrintError(PCWSTR ws_caption,PCWSTR ws_description,ULONG ico)
  2. {
  3.          UNICODE_STRING us_caption;
  4.          UNICODE_STRING us_description;
  5.          HARDERROR_RESPONSE he_resp;
  6.          RtlInitUnicodeString(&us_error_caption,ws_caption);
  7.          RtlInitUnicodeString(&us_error,ws_description);
  8.          ULONG args[]={(ULONG)&us_description,(ULONG)&us_caption,MB_OK | MB_SETFOREGROUND | ico};
  9.          NtRaiseHardError(0x50000018,3,(PUNICODE_STRING)3,(PVOID *)args,OptionOk,&he_resp);
  10. }

Здесь только вида "OK",но можно переделать под OK/Cancel и т.п.

Вывод отладочного сообщения с форматированием, например в Dbgview (не натив, позаимствовано у мелкософта):
Code:
  1. #ifdef DBG
  2. void 
  3. dbgprint(
  4.     char *format,
  5.     ...
  6.     )
  7. {
  8.     static  DWORD pid=0;
  9.     va_list vl;
  10.     char    dbgbuf1[2048],
  11.             dbgbuf2[2048];
  12.  
  13.     // Prepend the process ID to the message
  14.     if ( 0 == pid )
  15.     {
  16.         pid = GetCurrentProcessId();
  17.     }
  18.  
  19.     EnterCriticalSection(&gDebugCritSec);
  20.     va_start(vl, format);
  21.     _vsnprintf(dbgbuf1,sizeof(dbgbuf1)-1, format, vl);
  22.     sprintf(dbgbuf2, "%lu: %s\r\n", pid, dbgbuf1);
  23.     va_end(vl);
  24.  
  25.     OutputDebugString(dbgbuf2);
  26.     LeaveCriticalSection(&gDebugCritSec);
  27. }
  28. #endif


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




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

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

Code:
  1. BOOL
  2. IsThreadActive(
  3.          IN ULONG ThreadId
  4. )
  5. {
  6.          HANDLE                                 hThread;
  7.          THREAD_BASIC_INFORMATION  ThreadInfo;
  8.          NTSTATUS                                   Status;
  9.          ULONG                              Temp;
  10.          BOOL                           Result          =       FALSE;
  11.  
  12.          hThread = OpenThread(THREAD_QUERY_INFORMATION, FALSE, ThreadId);
  13.          if (hThread)
  14.          {
  15.                  Status = ZwQueryInformationThread(hThread, ThreadBasicInformation, &ThreadInfo, sizeof(THREAD_BASIC_INFORMATION), &Temp);
  16.                  if (NT_SUCCESS(Status)) {
  17.                         Result = (ThreadInfo.ExitStatus == STATUS_PENDING);
  18.                  }
  19.  
  20.                  CloseHandle(hThread);
  21.          }
  22.  
  23.          return Result;
  24. }


-----
Shalom ebanats!




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

Создано: 15 марта 2010 18:42 · Поправил: HiEndsoft
· Личное сообщение · #26

Выделение по-возможности непрерывного участка памяти в куче (натив)
Code:
  1. RTL_HEAP_DEFINITION  heapParams;
  2. memset( &heapParams, 0, sizeof( RTL_HEAP_DEFINITION ));
  3. heapParams.Length = sizeof( RTL_HEAP_DEFINITION );
  4. ULONG Sz=0x4000; //Максимально гарантированный непрерывный участок
  5.                                  //(размер минимального фрагмента)
  6. HANDLE h_heap = RtlCreateHeap(HEAP_ZERO_MEMORY, 0,Sz*2,Sz, 0, &heapParams );
  7. if(h_heap==NULL) {dbgprint("Error RtlCreateHeap");}
  8. ULONG nofrag=2; //указывает, что нужно выделять нефрагментированную область
  9. RtlSetHeapInformation(h_heap,HeapCompatibilityInformation,&nofrag,size   of(ULONG));


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




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

Создано: 15 марта 2010 20:45
· Личное сообщение · #27

HiEndsoft пишет:
Выделение по-возможности непрерывного участка памяти в куче (натив)

Вообще-то любое выделение из кучи всегда возвращает непрерывный участок виртуальной памяти. Иначе и быть не может, т.к. мы получаем 1 указатель.
Приведенный тобой код включает использование Low-fragmentation Heap аллокатора, что имеет совсем другой смысл.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 15 марта 2010 22:47 · Поправил: Rockphorr
· Личное сообщение · #28

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

все что выложено выше
Clerk

Ранг: 140.2 (ветеран)
Статус: Участник

Создано: 10 февраля 2010 18:48:00
Цитата Личное сообщение #10

multiarc
> так же желательно сделать все вызовы нативными, для возможности инжекта так же в графическую подсистему csrss!
Нэйтив юзается изза следующих причин:
o Самодостаточный код(вызов непосредственно через шлюзы).
o Если не достаточно функционала более высокоуровневого кода.
csrss это обычный гуи-процесс.
> получает адрес процедуры в нужной библиотеке в чужом процессе
Для этого есть системные апи, например RtlQueryProcessDebugInformation().

скопипастил в атач

зы: копипаститься неахти - то номера то решетки вылезают

adc3_20.03.2010_CRACKLAB.rU.tgz - codekit.c.txt



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

Создано: 16 марта 2010 11:00 · Поправил: HiEndsoft
· Личное сообщение · #29

ntldr Извечная тема для споров.
Rockphorr к модераторам обратись, идея не плохая.
Обнаружение изменения в составе устройств на самом высоком уровне (в оконном обработчике очереди сообщений) (здесь - добавление устройства, например вставка флешки):
Code:
  1. LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
  2. {   //Произошло изменение в составе устройств
  3.     if(uMsg==WM_DEVICECHANGE)
  4.    { //Флешка вставлена
  5.       if (wParam==DBT_DEVICEARRIVAL) 
  6.      {
  7.         //Проверка на накопитель
  8.         if (((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype==DBT_DEVTYP_VOLUME) 
  9.        {
  10.            if (((DEV_BROADCAST_VOLUME*)lParam)->dbcv_flags!=DBTF_MEDIA &&         
  11.               ((DEV_BROADCAST_VOLUME*)lParam)->dbcv_flags!=DBTF_NET)
  12.           {
  13.           //Извлечение имени
  14.              char DriveName[4]={'?',':','','\0'};
  15.           DriveName[0]=FirstDriveFromMask(((DEV_BROADCAST_VOLUME*)lParam)- >dbcv_unitmask);
  16.             if (GetDriveType(DriveName)==2)
  17.             {
  18.                 DriveName[2]='\0';
  19.              //Наши действия, например копирование
  20.              CreateThread(NULL,0,LPTHREAD_START_ROUTINE)COPY,(LPVOID)DriveNa me,0,NULL);
  21.              }
  22.            }
  23.         }
  24.      }
  25.   }
  26.   return CallWindowProcA((WNDPROC)ResultSWL,hwnd, uMsg, wParam, lParam);
  27. }


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




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

Создано: 17 марта 2010 10:19
· Личное сообщение · #30

Native-код, создающий на FAT - FAT32 томе "неудаляемую" папку.
Code:
  1. bool MkNoremoveDir(LPWSTR lpDirPathName)
  2. {
  3.                  UNICODE_STRING NameU;
  4.                  HANDLE DirectoryHandle;
  5.                  IO_STATUS_BLOCK ioSB;
  6.                  bool flag=false;
  7.                  OBJECT_ATTRIBUTES ObjAttr;
  8.                  RtlInitUnicodeString(&NameU,lpDirPathName);
  9.                  RtlDosPathNameToNtPathName_U(lpDirPathName,&NameU,NULL,NULL);
  10. _R:      InitializeObjectAttributes(&ObjAttr,&NameU,OBJ_CASE_INSENSITIVE,NU LL,NULL);
  11.                  if(NT_SUCCESS(NtCreateFile (&DirectoryHandle,FILE_LIST_DIRECTORY | SYNCHRONIZE | FILE_OPEN_FOR_BACKUP_INTENT,
  12.                                         &ObjAttr,&ioSB,NULL,FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY,FILE_SHARE_READ,
  13.                                                                                        FILE_CREATE,FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,NULL,0)))
  14.                  { 
  15.                         NtClose(DirectoryHandle);
  16.                         if (flag)      {NtBeep(9000,500);return flag;}
  17.                         flag=true;
  18.                         wcscat(NameU.Buffer,L"\..\");
  19.                         NameU.Length+=4*sizeof(WCHAR);
  20.                         goto _R;
  21.                  }
  22.                  return flag;
  23. }

В аттаче консольная прожка - создает "неудаляемую" папку "autorun.inf" на указанном FAT- диске (может быть полезно для защиты от автозагрузки флешек) .


f507_17.03.2010_CRACKLAB.rU.tgz - NODIR.zip

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



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


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