it-place.net > Уроци > C-Cplusplus
Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Obfuscation в C++
  1. Obfuscation в C++ - I
  2. Obfuscation в C++ - II
Black`n`White
     
Автор  Black`n`White (10.08.2007 21:48)  съобщение до автора
Погледнат  4594 пъти  добави към любими
Оценка  добави коментар
Гласове  1  изпрати на приятел
Коментари  (1)  абонирай се за C-Cplusplus
    Страница 2 / 2

 



След като знаем че можем да сменим местата на името на масива и индекса, можем да прилагаме това в пример като този:

CODE
1
2
int c = 0; // c не е масив
while(putchar(c++["Lamer-Protected"])); // но пък изглежда като такъв

Ще бъде изведен низа, който всъщност е индекс в масив c, който даже не е деклариран като масив.
Кодът е слабо казано грозничък и неясен, но това е целта, когато правим obfuscation ...

И за да стане още по-забъркано да разгледаме един най-обикновен if оператор ...

CODE
1
2
3
4
5
6
7
8
9
10
int e;

if( 3 == (1+2) )
{
   
e = 1;
}
else
{
   
e = 0;
}

Горния код е ясен за всеки, но да си предстовим, че се налага просто да шашнем някой начинаещ (например учителка по информатика). Пишем следния еквивалент ...

CODE
1
2
3
int e;

if( 3 == (1+2) && (e = 1) || (e = 0));

Еквивалент е, защото в C++ ако до оператор && имаме израз оценен на FALSE, всичко останало не се изпълнява, както и ако до оператор || изразът е с оценка TRUE, останалото също се пренебрегва.

Т.е. свеждаме

if( условие )
{
    ОперацияПриИзпълненоУсловие;
}
else
{
    ОперацияПриНеИзпълненоУсловие;
}

към

if( условие && ОперацияПриИзпълненоУсловие || ОперацияПриНеИзпълненоУсловие );

На един ред, както ако ползваме ?: но него всеки го знае и ефекта ще е друг.

Да се задълбочим сега върху оператора ‘==’. Как да го маскираме за леймърите ? Тук ще дам само пример, а обяснението оставям за книжките по цифрова електроника е компаратори.

CODE
1
if( 3 == (1+2) )

има същия ефект като

CODE
1
if( !( 3 ^ (1+2)) )

просто сравняваме с побитов XOR (excluding OR) оператор.

За край вече можем да трансформираме елементарен и ясен код като

CODE
1
2
3
4
5
6
7
8
if( 3 == (1+2))
{
   
e = 1;
}
else
{
   
e = 0;
}

към далеч по-объркващото ...

CODE
1
if(!( 3 ^ (1+2)) && (e = 1) || (e = 0));



 << Предишна страница  


Ключови думи: C++ obfuscation обфускация


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: Black`n`White  
I am experienced .NET Application Developer, and also I have worked a lot of time with Borland VCL. Right now I am working on several projects, based on the .NET Platform. Also I am student at the Technical University of Varna
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

Много добра статия. Автора единствено е пропуснал да говори за оператора запетая, а с него могат да се правят щуротии от вида на:

CODE
1
while (instr1, instr2, instr3, cond);

което е същото като

CODE
1
2
3
4
5
do {
 
instr1;
 
instr2;
 
instr3;
} while (cond);

или пък

CODE
1
2
3
4
5
if (instr1, instr2, instr3, cond) {
 
instr4;
 
instr5;
 
instr6;
}

което всъщност е

CODE
1
2
3
4
5
6
7
8
9
instr1;
instr2;
instr3;
 
if (cond) {
 
instr4;
 
instr5;
 
instr6;
}

Не правете това в час по информатика за да няма припаднали учителки

  blowfish на 13.08.2007 01:00

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008