Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obfuscator języka PHP
Forum PHP.pl > Inne > Oceny
kafarek
Witam.
Prosiłbym o ocenę projektu. Prawie działający skrypt znajduje się pod adresem: http://kafaro.pl/Obfuscator/ - problem zauważony przez mlawnik

Pod tym adresem problem nie występuje : http://student.agh.edu.pl/~kafar/Obfuscator/ - nie czaję tego tongue.gif

Powiedzcie mi co jest nie tak, w jakich przypadkach daje błędne rezultaty i ewentualnie co jeszcze dodać do tego. Dzięki

Poniżej przedstawiam klasę na której się opiera projekt:

  1. <?php
  2.  
  3. /**
  4.  * Klasa która zajmuje się zasyfianiem kodu
  5.  */
  6. class Obfuscator {
  7.  
  8. private $text;
  9. private $obfuscated;
  10. private $stripComments;
  11. private $inOneLine;
  12.  
  13. public function __construct($input_text) {
  14. $this->text = $input_text;
  15. }
  16.  
  17. //Opcje
  18. public function setOptions($comments=false, $lines=false) {
  19. $this->stripComments = $comments;
  20. $this->inOneLine = $lines;
  21. }
  22.  
  23. //Funkcja pomocnicza do wyświetlania tokenów
  24. public function printTokens() {
  25. $tokeny = token_get_all($this->text);
  26. foreach ($tokeny as $token) {
  27. $token_name = is_array($token) ? $token[0] : NULL;
  28. $token_value = is_array($token) ? $token[1] : $token[0];
  29.  
  30. $output .= token_name($token_name) . " - " . htmlentities($token_value) . "<br />";
  31. }
  32. return $output;
  33. }
  34.  
  35. /**
  36.   * Główna funkcja zasyfiająca
  37.   *
  38.   */
  39. public function makeUglyCode() {
  40. $tokeny = token_get_all($this->text);
  41. $atrFind = $fnFind = $classFind = false;
  42.  
  43. foreach ($tokeny as $token) {
  44. $token_name = is_array($token) ? $token[0] : NULL;
  45. $token_value = is_array($token) ? $token[1] : $token[0];
  46.  
  47. switch ($token_name) {
  48.  
  49. case T_COMMENT:
  50. if ($this->stripComments) {
  51. break;
  52. } else {
  53. ;
  54. }
  55. case T_FUNCTION:
  56. $fnFind = true;
  57. $this->obfuscated .= $token_value;
  58. break;
  59.  
  60. case T_CLASS:
  61. $classFind = true;
  62. $this->obfuscated .= $token_value;
  63. break;
  64.  
  65. case T_VARIABLE:
  66. if ($token_value == '$this') {
  67. $this->obfuscated .= $token_value;
  68. ;
  69. } else {
  70. $zmienna = substr($token_value, 1);
  71. $this->changeLabel($zmienna, "$");
  72. }
  73. break;
  74.  
  75. case T_STRING_VARNAME:
  76. $this->changeLabel($token_value);
  77. break;
  78.  
  79. case T_DOUBLE_COLON:
  80. $this->removeLastToken($prevToken);
  81. $this->changeLabel($prevToken);
  82. $this->obfuscated .= $token_value;
  83. $atrFind = true;
  84. break;
  85.  
  86. case T_OBJECT_OPERATOR:
  87. $atrFind = true;
  88. $this->obfuscated .= $token_value;
  89. break;
  90.  
  91. case T_NEW:
  92. $classFind = true;
  93. $this->obfuscated .= $token_value;
  94. break;
  95.  
  96. case T_STRING:
  97. if ($fnFind) {
  98.  
  99. $this->changeLabel($token_value);
  100. $fnFind = false;
  101. break;
  102. } else if ($classFind) {
  103.  
  104. $this->changeLabel($token_value);
  105. $classFind = false;
  106. break;
  107. } else if ($atrFind) {
  108.  
  109. $this->changeLabel($token_value);
  110. $atrFind = false;
  111. break;
  112. } else {
  113.  
  114. }
  115. default : $this->obfuscated .= htmlentities($token_value);
  116. }
  117. //ustaw bieżący wartosc tokena jako prevToken. Przydatne przy ::
  118. $prevToken = $token_value;
  119. }
  120. }
  121.  
  122. private function changeLabel($txt, $type="") {
  123. $code.=$type;
  124. $code.=substr(md5($txt), 0, 8);
  125. $obfuscated[$txt] = $code;
  126. $this->obfuscated .= $code;
  127. }
  128.  
  129. public function getOutput() {
  130. if ($this->inOneLine) {
  131. $order = array("\r\n", "\n", "\r", "\t");
  132. $output = str_replace($order, "", $this->obfuscated);
  133. $output = preg_replace('# +#', ' ', $output);
  134. } else {
  135. $output = $this->obfuscated;
  136. }
  137.  
  138. return $output;
  139. }
  140.  
  141. //funkcja usunie ostatni token. Przydatne przy ::
  142. private function removeLastToken($txt) {
  143. $charsToRemove = strlen($txt);
  144. $this->obfuscated = substr($this->obfuscated, 0, -$charsToRemove);
  145. }
  146.  
  147. }
  148.  
  149. ?>
  150.  
mlawnik

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /homepages/44/d349168261/htdocs/Obfuscator/Obfuscator.php on line 40

Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /homepages/44/d349168261/htdocs/Obfuscator/Obfuscator.php on line 40

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /homepages/44/d349168261/htdocs/Obfuscator/Obfuscator.php on line 40

Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /homepages/44/d349168261/htdocs/Obfuscator/Obfuscator.php on line 40

Przy próbie obfuscowania:

  1. <?php
  2.  
  3. $x = md5('alamakota');
  4.  
  5. echo $x;
  6.  
  7. ?>
kafarek
No z tym problemem na razie sobie nie mogę poradzić. Jakoś cudzysłów lub apostrof mi wszystko psuje:( Na localnym serwerze mi śmiga, dziwne :/
phpion
Czy poradzi sobie z hurtowym zaciemnianiem kodu wszystkich plików z danego projektu? Jak będzie wyglądała sprawa nazewnictwa funkcji? Czy ta sama funkcja będzie miała we wszystkich wystąpieniach tą samą nazwę?
kafarek
Nad hurtowym zaciemnianiem się zastanawiam jak to zrealizować. Czy uploadowanie archiwum rozpakowywanie i wtedy działanie czy jak? Odnośnie funkcji to wszędzie będzie miała taką samą nazwę. To źle?
Helid
Przydałaby się dodatkowa opcja - szyfruj wartości zmiennych (mogła by spowolnić skrypt ale pomoże zabezpieczyć takie części jak stopki, prawa autorskie itd).
Np.
Kod
<?php
$sdf76fa87fad = base64_decode('zakodowana wartość zmiennej');

Sprawdziła by się w takim przypadku

Kod
<?php
$sdf76fa87fad = 'Wszystkie prawa zastrzeżone <a href="#">Tajna firma</a>';
erix
Jeślil base64_encode nazywasz szyfrowaniem, to raczej nie ma o czym dyskutować...
Rid
Cytat
Jeślil base64_encode nazywasz szyfrowaniem, to raczej nie ma o czym dyskutować

Zgodzę się z Erix -jest to forma kodowania nie szyfrowania i dodatkowo powiem że mało optymalna,nie dość że w prosty sposób można dekodować,zakodowane wiadomości ,to nadużywanie tego mechanizmu może zwiększyć wielkość strony(w bitach) nawet o 33%.

Dodatkowo to co Pan przedstawił zastosowane zostało w ASP.Net jak obiekt ViewState jako alternatywa dla hiddenfielda-jednakże używanie tego obiektu jest mało zalecany ze względu na spadek wydajności.
kafarek
To nie zauwazyliscie wiecej bledow?
mlawnik
  1. <?php
  2.  
  3. function sec2hms ($sec, $padHours = false)
  4. {
  5.  
  6. // start with a blank string
  7. $hms = "";
  8.  
  9. // do the hours first: there are 3600 seconds in an hour, so if we divide
  10. // the total number of seconds by 3600 and throw away the remainder, we're
  11. // left with the number of hours in those seconds
  12. $hours = intval(intval($sec) / 3600);
  13.  
  14. // add hours to $hms (with a leading 0 if asked for)
  15. $hms .= ($padHours)
  16. ? str_pad($hours, 2, "0", STR_PAD_LEFT). ":"
  17. : $hours. ":";
  18.  
  19. // dividing the total seconds by 60 will give us the number of minutes
  20. // in total, but we're interested in *minutes past the hour* and to get
  21. // this, we have to divide by 60 again and then use the remainder
  22. $minutes = intval(($sec / 60) % 60);
  23.  
  24. // add minutes to $hms (with a leading 0 if needed)
  25. $hms .= str_pad($minutes, 2, "0", STR_PAD_LEFT). ":";
  26.  
  27. // seconds past the minute are found by dividing the total number of seconds
  28. // by 60 and using the remainder
  29. $seconds = intval($sec % 60);
  30.  
  31. // add seconds to $hms (with a leading 0 if needed)
  32. $hms .= str_pad($seconds, 2, "0", STR_PAD_LEFT);
  33.  
  34. // done!
  35. return $hms;
  36.  
  37. }
  38. $x = sec2hms(100);
  39. echo $x;
  40. ?>


http://ideone.com/WLtK2

  1. T_OPEN_TAG - <?php
  2. T_WHITESPACE -
  3. T_FUNCTION - function
  4. T_WHITESPACE -
  5. T_STRING - sec2hms
  6. T_WHITESPACE -
  7. UNKNOWN - (
  8. T_VARIABLE - $sec
  9. UNKNOWN - ,
  10. T_WHITESPACE -
  11. T_VARIABLE - $padHours
  12. T_WHITESPACE -
  13. UNKNOWN - =
  14. T_WHITESPACE -
  15. T_STRING - false
  16. UNKNOWN - )
  17. T_WHITESPACE -
  18. UNKNOWN - {
  19. T_WHITESPACE -
  20. T_COMMENT - // start with a blank string
  21. T_WHITESPACE -
  22. T_VARIABLE - $hms
  23. T_WHITESPACE -
  24. UNKNOWN - =
  25. T_WHITESPACE -
  26. T_CONSTANT_ENCAPSED_STRING - ""
  27. UNKNOWN - ;
  28. T_WHITESPACE -
  29. T_COMMENT - // do the hours first: there are 3600 seconds in an hour, so if we divide
  30. T_WHITESPACE -
  31. T_COMMENT - // the total number of seconds by 3600 and throw away the remainder, we're
  32. T_WHITESPACE -
  33. T_COMMENT - // left with the number of hours in those seconds
  34. T_WHITESPACE -
  35. T_VARIABLE - $hours
  36. T_WHITESPACE -
  37. UNKNOWN - =
  38. T_WHITESPACE -
  39. T_STRING - intval
  40. UNKNOWN - (
  41. T_STRING - intval
  42. UNKNOWN - (
  43. T_VARIABLE - $sec
  44. UNKNOWN - )
  45. T_WHITESPACE -
  46. UNKNOWN - /
  47. T_WHITESPACE -
  48. T_LNUMBER - 3600
  49. UNKNOWN - )
  50. UNKNOWN - ;
  51. T_WHITESPACE -
  52. T_COMMENT - // add hours to $hms (with a leading 0 if asked for)
  53. T_WHITESPACE -
  54. T_VARIABLE - $hms
  55. T_WHITESPACE -
  56. T_CONCAT_EQUAL - .=
  57. T_WHITESPACE -
  58. UNKNOWN - (
  59. T_VARIABLE - $padHours
  60. UNKNOWN - )
  61. T_WHITESPACE -
  62. UNKNOWN - ?
  63. T_WHITESPACE -
  64. T_STRING - str_pad
  65. UNKNOWN - (
  66. T_VARIABLE - $hours
  67. UNKNOWN - ,
  68. T_WHITESPACE -
  69. T_LNUMBER - 2
  70. UNKNOWN - ,
  71. T_WHITESPACE -
  72. T_CONSTANT_ENCAPSED_STRING - "0"
  73. UNKNOWN - ,
  74. T_WHITESPACE -
  75. T_STRING - STR_PAD_LEFT
  76. UNKNOWN - )
  77. UNKNOWN - .
  78. T_WHITESPACE -
  79. T_CONSTANT_ENCAPSED_STRING - ":"
  80. T_WHITESPACE -
  81. UNKNOWN - :
  82. T_WHITESPACE -
  83. T_VARIABLE - $hours
  84. UNKNOWN - .
  85. T_WHITESPACE -
  86. T_CONSTANT_ENCAPSED_STRING - ":"
  87. UNKNOWN - ;
  88. T_WHITESPACE -
  89. T_COMMENT - // dividing the total seconds by 60 will give us the number of minutes
  90. T_WHITESPACE -
  91. T_COMMENT - // in total, but we're interested in *minutes past the hour* and to get
  92. T_WHITESPACE -
  93. T_COMMENT - // this, we have to divide by 60 again and then use the remainder
  94. T_WHITESPACE -
  95. T_VARIABLE - $minutes
  96. T_WHITESPACE -
  97. UNKNOWN - =
  98. T_WHITESPACE -
  99. T_STRING - intval
  100. UNKNOWN - (
  101. UNKNOWN - (
  102. T_VARIABLE - $sec
  103. T_WHITESPACE -
  104. UNKNOWN - /
  105. T_WHITESPACE -
  106. T_LNUMBER - 60
  107. UNKNOWN - )
  108. T_WHITESPACE -
  109. UNKNOWN - %
  110. T_WHITESPACE -
  111. T_LNUMBER - 60
  112. UNKNOWN - )
  113. UNKNOWN - ;
  114. T_WHITESPACE -
  115. T_COMMENT - // add minutes to $hms (with a leading 0 if needed)
  116. T_WHITESPACE -
  117. T_VARIABLE - $hms
  118. T_WHITESPACE -
  119. T_CONCAT_EQUAL - .=
  120. T_WHITESPACE -
  121. T_STRING - str_pad
  122. UNKNOWN - (
  123. T_VARIABLE - $minutes
  124. UNKNOWN - ,
  125. T_WHITESPACE -
  126. T_LNUMBER - 2
  127. UNKNOWN - ,
  128. T_WHITESPACE -
  129. T_CONSTANT_ENCAPSED_STRING - "0"
  130. UNKNOWN - ,
  131. T_WHITESPACE -
  132. T_STRING - STR_PAD_LEFT
  133. UNKNOWN - )
  134. UNKNOWN - .
  135. T_WHITESPACE -
  136. T_CONSTANT_ENCAPSED_STRING - ":"
  137. UNKNOWN - ;
  138. T_WHITESPACE -
  139. T_COMMENT - // seconds past the minute are found by dividing the total number of seconds
  140. T_WHITESPACE -
  141. T_COMMENT - // by 60 and using the remainder
  142. T_WHITESPACE -
  143. T_VARIABLE - $seconds
  144. T_WHITESPACE -
  145. UNKNOWN - =
  146. T_WHITESPACE -
  147. T_STRING - intval
  148. UNKNOWN - (
  149. T_VARIABLE - $sec
  150. T_WHITESPACE -
  151. UNKNOWN - %
  152. T_WHITESPACE -
  153. T_LNUMBER - 60
  154. UNKNOWN - )
  155. UNKNOWN - ;
  156. T_WHITESPACE -
  157. T_COMMENT - // add seconds to $hms (with a leading 0 if needed)
  158. T_WHITESPACE -
  159. T_VARIABLE - $hms
  160. T_WHITESPACE -
  161. T_CONCAT_EQUAL - .=
  162. T_WHITESPACE -
  163. T_STRING - str_pad
  164. UNKNOWN - (
  165. T_VARIABLE - $seconds
  166. UNKNOWN - ,
  167. T_WHITESPACE -
  168. T_LNUMBER - 2
  169. UNKNOWN - ,
  170. T_WHITESPACE -
  171. T_CONSTANT_ENCAPSED_STRING - "0"
  172. UNKNOWN - ,
  173. T_WHITESPACE -
  174. T_STRING - STR_PAD_LEFT
  175. UNKNOWN - )
  176. UNKNOWN - ;
  177. T_WHITESPACE -
  178. T_COMMENT - // done!
  179. T_WHITESPACE -
  180. T_RETURN - return
  181. T_WHITESPACE -
  182. T_VARIABLE - $hms
  183. UNKNOWN - ;
  184. T_WHITESPACE -
  185. UNKNOWN - }
  186. T_WHITESPACE -
  187. T_VARIABLE - $x
  188. T_WHITESPACE -
  189. UNKNOWN - =
  190. T_WHITESPACE -
  191. T_STRING - sec2hms
  192. UNKNOWN - (
  193. T_LNUMBER - 100
  194. UNKNOWN - )
  195. UNKNOWN - ;
  196. T_WHITESPACE -
  197. T_ECHO - echo
  198. T_WHITESPACE -
  199. T_VARIABLE - $x
  200. UNKNOWN - ;
  201. T_WHITESPACE -
  202. T_CLOSE_TAG - ?>


http://ideone.com/kV3Q4


Parse error
Nie usunął komentarzy

Będę szukał dalej.

Pozdrawiam,
mlawnik

P.S. Może założysz sobie GitHuba?
kafarek
Komentarzy nie usuwa przy wyswietlaniu tokenów bo to jest tylko taka pomocnicza funkcjonalność. Dzięki temu patrzyłem jak przetwarza wejście. Przy opcji "syf" Ci usunie:P Nigdy się nie bawiłem GitHub'em. W wolnej chwili obczaje o co w tym chodzi:)
Crozin
Pomijając bezcelowość takich rzeczy, nie nadaje się to do użytku. Niepoprawnie nadawane nazwy (rozpoczynające się cyfrą) czy brak wsparcia dla mechanizmów refleksji.
  1. <?php
  2.  
  3. interface AbcMyInterface { }
  4. class AbcMyClass extends ArrayObject implements AbcMyInterface { }
  5.  
  6. $ref = new ReflectionClass('AbcMyClass');
  7.  
  8. // --------------------------------------
  9.  
  10. <?php
  11.  
  12. interface AbcMyInterface { }
  13. class 183dd512 extends ArrayObject implements AbcMyInterface { }
  14.  
  15. $18389a4a = new aea1e492('AbcMyClass');
darko
Nawet w przykładzie na stronie są błędnie nazywane zmienne, czyniąc kod niepoprawnym:
Cytat
<?php
require(myCLass.php);
/*
Kilka linijek komenatrzu
O tak po prostu
*/
$0c7f2892 = new d0509468();

$0c7f2892->88430b46();

class f9aae5fd {
private $77258096;
function 8f91a784($14c4b06b, $5f4dcc3b, $0c83f57c) {

// edit
aa, Crozin już mnie uprzedził
kafarek
Do wszystkich zmienianych elementów dodałem literkę na początku, więc będą już chyba poprawne. Zastanawiam się jak zrobić żeby nie zamieniało nazw wbudowanych klas i ich metod. Z klasami to spoko bo mogę sprawdzać czy element wykryty jako klasa jest w tablicy zwróconej przez funkcję get_declared_classes(). Ale jak ogarnąć metody do tych wbudowanych klas? Przykładowo żeby open nie zmieniało. Póki co nie mam pomysłu:(
  1. $zip = new ZipArchive();
  2. $res = $zip->open($archive);


Co do słuszności tego co robię to może rzeczywiście nie jest to warte świeczki, ale od tego zależy moje zaliczenie na uczelni:P
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.