Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zaciemnianie kodu, czyli jak ukryć wywołania standardowych funkcji
Snowak
post 26.07.2009, 19:02:14
Post #1





Grupa: Zarejestrowani
Postów: 78
Pomógł: 2
Dołączył: 13.12.2007

Ostrzeżenie: (0%)
-----


Witam,
piszę własny zaciemniacz kodu pod mój drobny projekt. Mam jednak problem z ukryciem wywołań standardowych funkcji, a dokładniej z ich wywołaniem...

Założmy, że mam funkcję:
preg_match_all($a, $b, $c);

I nazwę funkcji otrzymuję z wywołania funkcji o przykładowej nazwie f('123', 'abc'), to aby ją wywołać musiałbym ją przechować w pośredniej zmiennej (coś w stylu f(..)($a, $b, $c) nie działa). Niestety taka możliwość nie zawsze występuje... więc trzeba się obyć bez tej zmiennej. W manualu php znalazłem takie cudo jak call_user_func. Po zaciemnieniu, wygląda to mniej więcej tak:
call_user_func($f('123', 'abc'), $a, $b);

Wszystko działa pięknie... do czasu. Jak się okazało, call_user_func nie jest w stanie przekazać trzeciego parametru przez referencję, więc wszystko mi się wysypuje.

Zakładam, że w żaden sposób nie jestem w stanie zmusić call_user_func, aby się zachowywało tak jak należy, więc mam trochę inne pytanie. W jaki sposób mogę to zaciemnić? A może jestem w stanie wywołać jakoś inaczej funkcję otrzymując jej nazwę z innej funkcji?

coś w stylu $funcName($a, $b, $c) działa idealnie, ale niestety nie wszędzie da się coś takiego zrobić...

z góry dzięki za pomoc
Go to the top of the page
+Quote Post
planet
post 26.07.2009, 19:25:05
Post #2





Grupa: Zarejestrowani
Postów: 61
Pomógł: 6
Dołączył: 15.07.2009
Skąd: Śląsk->Ruda Śląska

Ostrzeżenie: (0%)
-----


Po co Ci właściwie zaciemniać kod? Bo trochę takiego działania nie rozumie.
Go to the top of the page
+Quote Post
grn
post 27.07.2009, 07:46:28
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 4
Dołączył: 1.06.2009

Ostrzeżenie: (0%)
-----


Abstrahując od zasadności zaciemniania kodu możesz spróbować tak:

  1. <?php
  2. function fn($x)
  3. {
  4.  echo $x;
  5. }
  6.  
  7. class Zaciemniacz
  8. {
  9.  public function fn($x)
  10.  {
  11.    fn($x);
  12.  }
  13. }
  14.  
  15. $z = new Zaciemniacz();
  16. $f = 'fn';
  17.  
  18. $z->$f('x');
  19. ?>
Go to the top of the page
+Quote Post
Snowak
post 27.07.2009, 12:22:23
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 2
Dołączył: 13.12.2007

Ostrzeżenie: (0%)
-----


Dzięki, ale to zupełnie nie jest odpowiedzią na moje pytanie. Mam funkcję, która zwraca nazwę funkcji do wywołania i chce ją wywołac bez przechowywania jej nazwy w zmiennej nie korzystając z metod call_user_func~ ponieważ nie przekazują parametrów przez referencję (chociaż jedną z nich można do tego zmusic, ale musiałbym z góry wiedziec jak te parametry przekazywac co nie wchodzi w grę).

Potrzebuję czegoś w stylu:
  1. <?php
  2. function increment($costam, &$ref)
  3. {
  4.  $ref++;
  5. }
  6.  
  7. function getFunctionName($costam)
  8. {
  9.  return 'increment';
  10. }
  11.  
  12. $parametr2 = 1;
  13. getFunctionName('costam')('parametr1', $parametr2);
  14. echo($parametr2);
  15. ?>


Ten post edytował Snowak 27.07.2009, 12:23:52
Go to the top of the page
+Quote Post
nospor
post 27.07.2009, 12:26:49
Post #5





Grupa: Moderatorzy
Postów: 36 556
Pomógł: 6314
Dołączył: 27.12.2004




Cytat
Wszystko działa pięknie... do czasu. Jak się okazało, call_user_func nie jest w stanie przekazać trzeciego parametru przez referencję, więc wszystko mi się wysypuje.

Przeciez w manualu masz przyklad jak przekazac referencje:
Cytat
Przykład #1 call_user_func() example and references
<?php
error_reporting(E_ALL);
function increment(&$var)
{
$var++;
}

$a = 0;
call_user_func('increment', $a);
echo $a."\n";

call_user_func_array('increment', array(&$a)); // You can use this instead before PHP 5.3
echo $a."\n";
?>


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
maroko
post 27.07.2009, 12:42:28
Post #6





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 27.07.2009
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Może "zaciemniaczem" mogła by być funkcja "class_alias".
Nie zmieniasz nazwy klasy tylko odwołujesz się do jej aliasu.

No ale wydaje mi się, że faktyczny zaciemniacz może wyglądać tak:
  1. <?php
  2.  
  3.        function fcn($a,$b)
  4.        {
  5.            if(is_numeric($a) && is_numeric($b)) return $a+$b;
  6.            return 'conajmniej jedna zmienna nie jest liczba!';    
  7.        }
  8.  
  9.        function zaciemniacz($funkcja, $atrybut1, $atrybut2)
  10.        {
  11.            return create_function('$atrybut1,$atrybut2', 'return '.$funkcja.'($atrybut1, $atrybut2);');
  12.        }
  13.                
  14.        $fn = zaciemniacz('fcn',$a,$b);
  15.        echo 'Nowa zaciemniona funkcja: '.$fn.' a to jej wynik: ';
  16.        echo $fn(2, 3) . "\n";
  17.        
  18. ?>


Cytat
coś w stylu $funcName($a, $b, $c) działa idealnie, ale niestety nie wszędzie da się coś takiego zrobić...

shit nie doczytałem

Ten post edytował maroko 27.07.2009, 12:57:47
Go to the top of the page
+Quote Post
Snowak
post 29.07.2009, 00:48:16
Post #7





Grupa: Zarejestrowani
Postów: 78
Pomógł: 2
Dołączył: 13.12.2007

Ostrzeżenie: (0%)
-----


Prosiłbym wszystkich, aby doczytali dokładnie mojego posta. Przecież jeżeli mam funkcję, która zwraca nazwę funkcji do wywołania to może byc to cokolwiek i w kodzie nie mam absolutnie żadnego pojęcia do czego ona służy oraz jakie parametry przyjmuje. A więc tak jak mówiłem, call_user_func nie jest w stanie przekazac parametrów przez referencję tak jak należy a call_user_func_array wymaga WIEDZY, które parametry jak należy przekazac. Rozwiązanie $funcName($a, $b, $c) sprawdzałoby się idealnie, ponieważ samo przekazuje parametry przez referencję kiedy jest to wymagane, ale tak jak pisałem w 1szym poście - wymaga zastosowania tymczasowej zmiennej do przechowywania nazwy funkcji a ja potrzebuję operowac bezpośrednio na wyniku funkcji zwracającej nazwę funkcji do wywołania.

Ale i tak dzięki za chęci.

Ten post edytował Snowak 29.07.2009, 00:48:47
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2025 - 07:31