Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Как да напишем самоиндифициращ се код!

Featured Replies

Уиндолс има по-висока степен на зашита на кода на програмите,от колкотото ДОС,например.Обичайно приложенията получават достъп до сермент данни и стека,но нямат права да изменят собствения си сигмент код.Това обаче не значи,че да се направи това е невъзможно-достатъчно е да се "помоли" Уиндолс да извика функция VirtualProtect().В качеството на параметър във функцияята се предава адресът на 1-вия байт на блока памет,до който искаме да получим достъп,количеството байтове в блока,а също така и флага,оределящкакъв тип ни е нужен(т.е. четене,запис,узпълнение и т.н.).Във дункцията се предава и адресът на променливата,в която се съхранява началото състоянието на защита на оказания блок,която ние сме задължени да възстанови,селд като извършим необходимите манипулации.

Следният фрагмент на Win32-код показва тази техника!Асемблер операторът след отметката myloop-"mov dword ptr a, 0x12345678".Предишните оператори го заменят на "mov dword prt a,0x87654321".

Пробвайте да поместите приведения код в C\C++ и да го проследите

LPVOID address;

//Получаваме адреса на думата,която е нужно да изменим.

_asm mov dword ptr address, offset

[myloop +3]

//Получаваме разрешение да модифицираме участъка от кода

result = VirtualProtect(address, 4,PAGE_WRITECOPY, &oldprotect);

//Изменяме асемблерния код.Това е равно на *(LPVOID) address = 0c87654321

_asm mov ebx, dword ptr address

_asm moc dword ptr [ebx], 0x87654321

//Всичко е направено

result = VirtualProtect(address, 4, PAGE_EXECUTE, &oldprotect);

myloop:

_asm mov dword ptra, 0x12345678

=>Създаваме нов фрагмет от кода

Аналогично може да създадем нов драгмет на кода на програмата.В качеството на пример ще разгледамесъздаването на функции и променливата не пипа указател на кънкцията:

typedef LONG (* Function Type) (LONG , LONG);

FunctionType ComputeSum;

И така , ComputeSum-променлива от типа Function Type,определящ указател на функцията от следния вид:LOG Dunction(LONG,LONG);

Първо,е нужно да се определят опкодовете,които ще съставят нашата функция.Изясняваме,че за реализацията на операцията по събиране на две числа са нобходими 11 майта.

Тези 11 байта е необходимо да мъдат отделено с помощта на оператора

new:

ComputeSum=(DunctionType) new BYTE[11]

Сега може да запълним отделената област опкодове:

((LPBYTE) ComputeSum)[0] =0x55; //

push ebp

((LPBYTE) ComputeSum)[1] =0x8B; //

movebp

((LPBYTE) ComputeSum)[2] =0xEC;

((LPBYTE) ComputeSum)[3] =0x8B; //

mov eax, [bp+8]

((LPBYTE) ComputeSum)[4] =0x45;

((LPBYTE) ComputeSum)[5] =0x08;

((LPBYTE) ComputeSum)[6] =0x03; //

add eax [bp+12]

((LPBYTE) ComputeSum)[7] =0x45;

((LPBYTE) ComputeSum)[8] =0x0C;

((LPBYTE) ComputeSum)[9] =0x5D;

// pop ebp

(LPBYTE) ComputeSum)[10] =0xC3;

// ret ebp

Накрая може да извикаме функцияра VirtualProtect().Всички наши команди са по местата си, нужно е просто да разрешим изпълнението им.Командата ще направи следното:

VirtualProtect(ComputeSum, 11, PAGE_EXECUTE, &oldprotect);

Както и по-рано,променливата oldprotect трябва да да е то типа DWORD.И така,сега имаме указател на обичайна функция,която може да извикаме,например така:

sum = ComputeSum(1, 2);

sum = ComputeSum(val1, val2)

Единственият детайл,който не бива да забравяме е освобождаването на паметта,отделена за нашата функция от оператора new.Преди това няма да навреди ,да възстановим статуса на защита на отделения блок памет.

VirtualProtect(CompSum, 11, oldprotect, &oldprotect);

delete(LPBYTE) ComputeSum;

В заключение малка забележка:ако искате,вашата "мутираща" програма да се изпълнява правилно и под Windows NT и XP,то след модификацията на сигмента на кода е нужно да извикате следната функция FlushInstructionCache().За Windows ще ви се наложи да я използвате!

Инфото е от списания Хакер ;)

Успех и прятно програмиране :wors:

Редактирано от Biased (преглед на промените)

  • 1 месец по-късно...

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.