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


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




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

Создано: 17 января 2013 03:50
· Личное сообщение · #2

Несколько смущает strcmp. Необходимо написать свой аналог( это нетрудно).

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




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

Создано: 17 января 2013 04:04
· Личное сообщение · #3

hors пишет:
Несколько смущает strcmp. Необходимо написать свой аналог( это нетрудно).


ну это не проблема например так:

Code:
  1. int fnstrcmp(char *pStr1,char *pStr2)
  2. {
  3.          int len2=fnstrlen(pStr2);
  4.          while(*pStr1)
  5.          {
  6.                  if(*pStr1++==*pStr2++)
  7.                  len2--;
  8.          }
  9.          return len2;
  10. }


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




Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 17 января 2013 05:26
· Личное сообщение · #4

_or_75
Код базозависим как минимум потому что в вашем коде есть строки, адрес которых жёстко вбит в код.
Да и вообще, shell код как правило используется в вирусных технологиях. Не засранчика ли вы пишете, уважаемый?

-----
Research For Food


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

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

Создано: 17 января 2013 05:55
· Личное сообщение · #5

daFix пишет:
Код базозависим как минимум потому что в вашем коде есть строки, адрес которых жёстко вбит в код.
Да и вообще, shell код как правило используется в вирусных технологиях. Не засранчика ли вы пишете, уважаемый?


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



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

Создано: 17 января 2013 08:24
· Личное сообщение · #6

_or_75
Используй вместо строк хеши.

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


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 17 января 2013 10:37
· Личное сообщение · #7

Alchemistry пишет:
Используй вместо строк хеши.

Лучше использовать контрольные суммы имен функций, самый компактный для этого ADLER32.

-----
aLL rIGHTS rEVERSED!





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 17 января 2013 10:41
· Личное сообщение · #8

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



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

Создано: 17 января 2013 17:18
· Личное сообщение · #9

reversecode пишет:
что то я не помню что бы форум был помошником новичкам в написании всякой вирус хрени
и да, байтонезависимый код ненужен тчк


дело не о помощи написание вируса а о базонезависимым коде



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

Создано: 17 января 2013 17:22
· Личное сообщение · #10

char pezda[] = {'p','e','z','d','a',0};

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

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 17 января 2013 17:22 · Поправил: Hexxx
· Личное сообщение · #11

reversecode пишет:
что то я не помню что бы форум был помошником новичкам в написании всякой вирус хрени и да, байтонезависимый код ненужен тчк

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

-----
Реверсивная инженерия - написание кода идентичного натуральному


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


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 17 января 2013 17:50 · Поправил: reversecode
· Личное сообщение · #12

Hexxx вам надо было по чаще посещать wasm, ой! там сколько новичков которые хотя научится боротся с эксплоитами! просто диву даешься
каждый первый новичек так и пилит очередной антивирус протов других антивирусов, ну ясно дело где им теперь учится когда wasm .....

Hexxxа откуда получил эксперт эти знания? у другого эксперта? а тот у кого? итд,
получается что бы получить некие знание нужно просто мозг повернуть? либо родится гением которые знает ответы на все вопросы? другого недано?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 17 января 2013 19:37 · Поправил: Hexxx
· Личное сообщение · #13

Ответ на вопрос откуда нормальный человек должен получать такие знания я так и не получил.
В моем конкретном случае: я участвовал в одном проекте, где ловили малварь проникающую через эксплоиты. И там мне пришлось столкнуться с подобной проблемой. И только благодаря тому, что там на проекте был свой эксперт я смог вникнуть в тему. Мозг в определенную сторону должен провернуться, чтобы понять это дело. А вот самому не представляю сколько так проворачивать придется, читая всякий бред в инете.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 17 января 2013 20:45 · Поправил: OnLyOnE
· Личное сообщение · #14

Если честно, то в вирях очень много оригинальных решений, чему следовало бы поучиться... кроме шуток.. статьи zombiе чего стоят! статьи его уже классика...

-----
aLL rIGHTS rEVERSED!





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

Создано: 17 января 2013 21:05
· Личное сообщение · #15

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

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

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

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

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


вот мне хотя бы вызвать MessageBox из базонезависимого кода , знаю на asm это можно, но все же хочется на c++




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 18 января 2013 04:49
· Личное сообщение · #17

OnLyOnE:
статьи zombiе чего стоят! статьи его уже классика...

Если не затруднит, можно ссылкой поделится? А то в гоогле все какие-то игры идиотские...

-----
Give me a HANDLE and I will move the Earth.





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 18 января 2013 05:08 · Поправил: OnLyOnE
· Личное сообщение · #18

plutos пишет:
Если не затруднит, можно ссылкой поделится? А то в гоогле все какие-то игры идиотские...


--> Z0MBiE's HomePage <--

-----
aLL rIGHTS rEVERSED!


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


Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 30 января 2013 04:50 · Поправил: DrGolova
· Личное сообщение · #19

> Лучше использовать контрольные суммы имен функций, самый компактный для этого ADLER32.

Код CRC32 ничуть не длиннее адлера, и гораздо более устойчивый к коллизиям на таких коротких блоках, как имена API'шек.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 30 января 2013 11:13 · Поправил: Hexxx
· Личное сообщение · #20

Archer пишет:
Заканчивайте с оффтопом.

Мам, ну я еще чуть-чуть!

получается что бы получить некие знание нужно просто мозг повернуть? либо родится гением которые знает ответы на все вопросы? другого недано?
Да, так и есть чтобы перейти в реверсинг нужно, чтобы в мозгу перещелкнулось убеждение "скомпилированный код изменять код нельзя". Многие так к примеру не могут заняться ремонтом бытовой техники, которая требует лишь замены узла, не смотря на то что, сами собирают себе комп. Или к примеру вызывают электрика, чтобы поменять розетку из-за убеждения, что "электрический ток 220 вольт - это опасно".
Вот так и с эксплоитами, существует убеждение у людей что "код выполняется только в пределах заложенных спецификацией" и они не верят в то, что крэш программы может быть вполне управляемым и даже направленным на выполнение каких-то действий. Как только осознание приходит - все меняется. Некоторым это дано от природы, некоторым нужна помощь чтобы осознать.

reversecode пишет:
Hexxx а откуда получил эксперт эти знания? у другого эксперта? а тот у кого? итд,

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

-----
Реверсивная инженерия - написание кода идентичного натуральному




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

Создано: 30 января 2013 14:27 · Поправил: gloomdemon
· Личное сообщение · #21

_or_75 пишет:
hors пишет:
Несколько смущает strcmp. Необходимо написать свой аналог( это нетрудно).

ну это не проблема например так:


Если компиляется через VC++ то можно использовать intrinsics http://msdn.microsoft.com/en-us/library/5704bbxw%28v=vs.80%29.aspx . Они же будут полезны если код надо будет сделать x64, т.к. в VC для x64 inline asm'a нет.

Еще есть проблемы с вызовом Kernel32Addr и FunctionAddr, как бэ будет использоваться
их абсолютный адрес. Опять же, если юзается VC++ то нужно объявить их __forceinline и прописать копилеру /Ob1 или /Ob2. Не уверен что ключи сработают если компилять в debug, но в release будет нормально. Лучше всего эти функции вообще сделать как define.

И да первым делом нужно получить GetProcAddress, что бы инлайновые функции не раздули код.

Есть еще момент

_or_75 пишет:
mov ebx, [ebx] // 2nd entry
mov ebx, [ebx] // 3rd entry
mov ebx, [ebx + 0x10] // 3rd entries base address (kernel32.dll)

что на 3ем месте в списке у тебя не обязательно будет kernel32.dll =) (обычно он там и будет, но всякое может быть) Можно начать с того, что на 2м месте, почти всегда будет ntdll.dll =)

ЗЫ
Про строки уже написали, нужно их все перебить как

n0name пишет:
char pezda[] = {'p','e','z','d','a',0};





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

Создано: 30 января 2013 14:47
· Личное сообщение · #22

gloomdemon пишет:
Еще есть проблемы с вызовом Kernel32Addr и FunctionAddr, как бэ будет использоваться
их абсолютный адрес.


Нет, относительный.

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





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 31 января 2013 16:57
· Личное сообщение · #23


ЗЫ
Про строки уже написали, нужно их все перебить как

n0name пишет:
char pezda[] = {'p','e','z','d','a',0};


char str[] = "juststring"; //те же яйца, но меньше кавычек.

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 31 января 2013 17:05
· Личное сообщение · #24

ARCHANGEL пишет:
char pezda[] = {'p','e','z','d','a',0};

Будет сгенерирован код пихающий байты в стек. С базонезависимостью все ОК.

ARCHANGEL пишет:
char str[] = "juststring"; //те же яйца, но меньше кавычек.

Будет сгенерирована строка в секции данных и релок на нее. Базонезависимо только на x64.

-----
PGP key <0x1B6A24550F33E44A>


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

Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 31 января 2013 17:06
· Личное сообщение · #25

а еще можно

const char* const str = "hello braza"; //



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

Создано: 31 января 2013 23:56
· Личное сообщение · #26

Господи, базонезависимый код на С++. Ну вы, блин, даёте.
Пишешь на голом С, генеришь ассемблерный листинг, его допиливаешь до нужной кондиции.
А охота поизвращаться - Лисп или брейнфак помогут.

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

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

Создано: 01 февраля 2013 13:34 · Поправил: gloomdemon
· Личное сообщение · #27

sendersu пишет:
а еще можно

const char* const str = "hello braza"; //


И VC++ сделает mov [ebp+str], offset aHelloBraza ; "hello braza" в rdata.

И если компилять через VC++ то лучше ему еще сказать /GS- и прописать прагмы
#pragma check_stack(off)
#pragma strict_gs_check(off)
#pragma runtime_checks("", off)
а то напихает всякие проверки еще.

yagello пишет:
Господи, базонезависимый код на С++. Ну вы, блин, даёте.
Пишешь на голом С, генеришь ассемблерный листинг, его допиливаешь до нужной кондиции.


Что так сложно? Лучше сразу опкодами нафигачить, а то для асма еще компилер запускай. И да, еще для x64 отдельный вариант не забыть.



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

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

Уже разобрался, /FIXED:NO в компилятор поставил



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

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

Вообщем сделал базонезависимый код на c++ все работает все нормально, вот только одна проблема memcpy не могу написать, может кто поможет ? или свой аналог предложите



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 16 марта 2013 03:35 · Поправил: Vovan666
· Личное сообщение · #30

_or_75 пишет:
memcpy не могу написать, может кто поможет ?

http://research.microsoft.com/en-us/um/redmond/projects/invisible/src/crt/memcpy.c.htm
https://www.student.cs.uwaterloo.ca/~cs350/common/os161-src-html/memcpy_8c-source.html
http://www.opensource.apple.com/source/xnu/xnu-2050.7.9/libsyscall/wrappers/memcpy.c
http://code.google.com/p/koron/source/browse/trunk/src/clib/C/string/memcpy.cpp?spec=svn7&r=7

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