Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Вопрос по базонезависимому коду [c++]
<< . 1 . 2 .
Посл.ответ Сообщение

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

Создано: 17 января 2013 02:56 · Поправил: _or_75
· Личное сообщение · #1

Вообщем есть такой вопрос можно ли считать это базонезависимым кодом ?

Code:
  1. #include <Windows.h>
  2.  
  3. typedef HMODULE (WINAPI* _LoadLibraryW)(LPCWSTR lpFileName);
  4. typedef int (__stdcall* _MessageBoxW)(HWND,LPCWSTR,LPCWSTR,UINT);
  5.  
  6. #pragma comment(linker, "/ENTRY:WinMain")
  7.  
  8. DWORD Kernel32Addr()
  9. {
  10.          DWORD lpReturn = 0;
  11.          __asm
  12.          {
  13.                  mov ebx, fs:[0x30]             // PEB
  14.                  mov ebx, [ebx + 0x0C]    // PEB->Ldr
  15.                  mov ebx, [ebx + 0x14]    // PEB->Ldr.InMemoryOrderModuleList.Flink (1st entry)
  16.                  mov ebx, [ebx]            // 2nd entry
  17.                  mov ebx, [ebx]            // 3rd entry
  18.                  mov ebx, [ebx + 0x10]    // 3rd entries base address (kernel32.dll)
  19.                  mov lpReturn, ebx               
  20.          }       
  21.          return lpReturn;
  22. }
  23. DWORD FunctionAddr(DWORD dwModule, char* szFunction)
  24. {
  25.          PIMAGE_DOS_HEADER DosHeader = NULL;
  26.          PIMAGE_NT_HEADERS NtHeaders = NULL;
  27.          PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL;
  28.          DWORD dwArray = 0;
  29.          DWORD dwAddress = 0;
  30.          DWORD dwName = 0;
  31.          WORD wOrdinal = 0;
  32.          DWORD dwFunction = 0;
  33.          int i = 0;
  34.  
  35.          if (dwModule == 0)
  36.                  return 0;
  37.  
  38.          DosHeader = (PIMAGE_DOS_HEADER) dwModule;
  39.  
  40.          if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
  41.                  return 0;
  42.  
  43.          NtHeaders = (PIMAGE_NT_HEADERS) ((DWORD) dwModule + DosHeader->e_lfanew);
  44.  
  45.          if (NtHeaders->Signature != IMAGE_NT_SIGNATURE)
  46.                  return 0;
  47.  
  48.          if(NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress == 0)
  49.                  return 0;
  50.  
  51.          ExportDirectory = (PIMAGE_EXPORT_DIRECTORY) ((DWORD) dwModule + NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
  52.  
  53.          for(= 0; i < ExportDirectory->NumberOfNames - 1; i++)
  54.          {
  55.                  dwArray = (DWORD)(dwModule + ExportDirectory->AddressOfNames + (* sizeof(DWORD)));
  56.                  dwName = (DWORD)(dwModule + (DWORD)*(PDWORD)dwArray);
  57.  
  58.                  if (strcmp((LPSTR)dwName, szFunction) == 0)
  59.                  {
  60.                         dwArray = ExportDirectory->AddressOfNameOrdinals + (* sizeof(WORD));
  61.                         wOrdinal = (WORD) *(PDWORD)(dwModule + dwArray);
  62.                         dwArray = ExportDirectory->AddressOfFunctions + (wOrdinal * sizeof(DWORD));
  63.                         dwFunction = (DWORD)(dwModule + *(PDWORD)(dwModule + dwArray));
  64.                  }
  65.          }
  66.          return dwFunction;
  67. }
  68.  
  69. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  70. {
  71.          DWORD hKernel32 = Kernel32Addr();
  72.          _LoadLibraryW __LoadLibraryW = (_LoadLibraryW) FunctionAddr(hKernel32, "LoadLibraryW");
  73.          DWORD hUser32 = (DWORD) __LoadLibraryW(L"user32.dll");
  74.          _MessageBoxW __MessageBoxW = (_MessageBoxW) FunctionAddr(hUser32, "MessageBoxW");
  75.          __MessageBoxW(0, L"exelab.ru", L"lol!", MB_OK);
  76.          return 0;
  77. }


И можно ли его как нибудь превратить в shell код и запустить его примерно такого ввида

Code:
  1. int main(int argc, char* argv[])
  2. {
  3.          unsigned char ShellCode[] = "\x90\x90\x90.....";
  4.          void *exec = VirtualAlloc(0, sizeof ShellCode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  5.          memcpy(exec, ShellCode, sizeof ShellCode);
  6.          ((void(*)())exec)();
  7. }


если да то как?



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

Создано: 16 марта 2013 08:02
· Личное сообщение · #2

Еще один вопрос, как на c++ проверить NET это файл или нет?



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 16 марта 2013 08:17
· Личное сообщение · #3

_or_75
http://www.rsdn.ru/article/files/Progs/dllinfo.xml

| Сообщение посчитали полезным: _or_75

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

Создано: 16 марта 2013 15:17 · Поправил: _or_75
· Личное сообщение · #4

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

Собственно если в MVC скомпилировать программу с параметром "/DYNAMICBASE", то заражение файла бесполезно, вот думаю как из за заголовка это убрать.



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

Создано: 16 марта 2013 16:51
· Личное сообщение · #5

Вообщем решил так: if(imNTh->OptionalHeader.DllCharacteristics) {your code here}




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 16 марта 2013 16:55
· Личное сообщение · #6

_or_75 пишет:
у некоторых файлов случайные базовые адреса и пихать туда код бесполезно


Почему бесполезно? Все тоже самое. А ImageBase находится через GetModuleHandle или из PEB.

-----
http://ntinfo.biz




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

Создано: 16 марта 2013 17:07
· Личное сообщение · #7

hors пишет:
Почему бесполезно? Все тоже самое. А ImageBase находится через GetModuleHandle или из PEB.


Мне легче снять её и все и все защита сама отпадет:

Code:
  1. if(imNTh->OptionalHeader.DllCharacteristics)
  2. {
  3.          imNTh->OptionalHeader.DllCharacteristics = 0;
  4. }





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

Создано: 16 марта 2013 19:07
· Личное сообщение · #8

Всего 2 строчки кода, а от каждой глаза сами плачут кровавыми слезами.
И вся эта околовирусная тематика уже несколько затянулась, пора и закрыть.

| Сообщение посчитали полезным: _or_75, 00
<< . 1 . 2 .
 eXeL@B —› Программирование —› Вопрос по базонезависимому коду [c++]
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати