Proszę o skomplikowanie mi zadania ;-)

Proszę o skomplikowanie mi zadania ;-)
Radosław Głębicki
  • Rejestracja:około 5 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

Poniżej program, który nic ważnego nie robi.
Na nim testuję wyłuskiwanie wywołania funkcji f_aaa() .
Czy jesteście w stanie dodać linie normalnego pythona i ew. Tkintera, w których jest wywoływana powyższa funkcja, a tej możliwości ja nie dostrzegłem. Zależy mi na kombinacji apostrofów i cudzysłowów.
Do tej pory ładnie wyłuskuje, ale myślę, że jakichś możliwości nie wpisałem.

Pozdrawiam
Radek Głębicki

Kopiuj
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter

def f_aaa():
	return '0'

main = tkinter.Tk()

main.bind("<Return>",f_aaa)
btn = tkinter.Button(main, text='asdsa'+f_aaa()+'dsfs', command=f_aaa)
btn2 = tkinter.Button(main, text='asdsa f_aaa() dsfs', command=f_aaa)
f_aaa()
wyn=f_aaa()
print(f_aaa())
print("afesfew"+f_aaa()+"esfesf", end='')
print('afesfew'+f_aaa()+"esfesf")
print("afesfew"+f_aaa()+'esfesf')
print('afesfew'+f_aaa()+'esfesf')
print("afesfew" + f_aaa()+'esfesf', end='')
print('afesfew'+f_aaa())
print("afesfew"+f_aaa())

print( "afesfew+ f_aaa()+esfesf")
print("afesfew' +f_aaa()+'esfesf", end='')
print('afesfew+"f_aaa()"+esfesf')
print("afesfew+f_aaa()+esfesf", end='')
print('afesfe','f_aaa()','+esfesf')
print("afesfew "+ f_aaa()+"esfesf")
print('afesfew+f_aaa()')
print("afesfew+f_aaa()"+f_aaa())

quit()
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Postów:1881
1

CO?


”Engineering is easy. People are hard.” Bill Coughran
edytowany 1x, ostatnio: Charles_Ray
Radosław Głębicki
  • Rejestracja:około 5 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

Piszę program który wyszukuje w skrypcie pythona wszystkie wywołania wszystkich funkcji. Do tej pory udało mi się wyłuskać wywołania z linii print z pomiędzy tekstów zawartych w cudzysłowach bądź apostrowach, np:
print(f_aaa()) lub print('tekst'+f_aaa()) lub print("tekst"+f_aaa()+'tekst') - wywołania,
ale już:
print('tekst f_aaa() tekst') - nie wywołuje tylko wypisuje na ekran jako tekst.
Pytam się czy w moim podanym powyżej programie mogą być inne możliwości, których nie wymyśliłem, a wy znacie.

lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:4944
0

Piszę program który wyszukuje w skrypcie pythona wszystkie wywołania wszystkich funkcji

Pokaz ten program.


Radosław Głębicki
A pomożesz mi z moim innym programem z innego wątku ? ;-D
sugar_hiccup
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:176
0

print('tekst f_aaa() tekst') - nie wywołuje tylko wypisuje na ekran jako tekst.
Pytam się czy w moim podanym powyżej programie mogą być inne możliwości, których nie wymyśliłem, a wy znacie.

Kopiuj
'dupa {} dupa'.format(f_aaa())
f'dupa {f_aaa()} dupa' # python >= 3.6
'dupa %s dupa' % f_aaa() # generalnie chujowy sposób i niezbyt już stosowany

My to na arm napiszemy wszystko i zrobimy co chcemy tyle że 90% kodu to biblioteki z netu albo robota kompilatora Zdajesz sobie sprawę że tak na prawdę wyższy poziom języka może świadczyć jedynie o tym jak niskim poziomem wiedzy może dysponować bałwan,który nazwie się w rezultacie programistą i napisze działający program wciskając zleceniodawcy że tam to akurat musi być 100MHz ARM z 1M pamięci bo tak na prawdę jego pusta łepetyna nie potrafi zrealizować czegoś na innym słabszym mikrokontrolerze
edytowany 4x, ostatnio: sugar_hiccup
Radosław Głębicki
Dlaczego dupa. A bo mi się wszystko z dupą kojarzy. ;-D Tego nie mam. Dzięki.
sugar_hiccup
w pracy staram się powstrzymywać i pisać foo, bar, baz :P
sugar_hiccup
co ciekawe foobar pochodzi od wojskowego FUBAR == Fucked Up Beyond All Recognition
Radosław Głębicki
  • Rejestracja:około 5 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

Jeszcze może być taki:

Kopiuj
print( 
'tekst1'+f_aaa()+"tekst2" 
) 

I działa.

TS
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:394
2
Kopiuj
from base64 import b64decode

def f_aaa():
    print(1)

locals()[b64decode('Zl9hYWE=')]()

Liczy się?

Radosław Głębicki
No u mnie nie działa, więc się nie liczy. ;-) KeyError: b'f_aaa'
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Pomysł bez sensu, bo można to zrobić na milion sposobów i nie jesteś w stanie tego wykryć żadną statyczną analizą kodu, a tym bardziej taką "na pałe". Nie da się tak "sandboxować" pythona. Nawet analiza AST czy CFG nic tu nie da, bo można sobie zawołać eval() albo exec() a wewnątrz niego robic co chcesz i w AST nie będzie tego widać poza runtime. Przy takich operacjach możesz mieć np. zaszyfrowaną nazwę funkcji i deszyfrować w runtime. W efekcie nie ma możliwości przeanalizowania tego bez faktycznego uruchomienia.

Kopiuj
def f_aaa():
    return '0'


def xor_string(a, b):
    return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(a, b))


key = 'xakepxakepxakep'
payload = '0813020b0450073404111949424c'
exec(xor_string(payload.decode("hex"), key))

Jak chcesz stwierdzić czy w tym kodzie ktoś woła twoja funkcje? :)

W jaki sposób można do tego faktycznie podejść: Monkey patching! Możesz nadpisać wszystkie funkcje z locals i globals wrapperem, który deleguje wywołanie do faktycznej funkcji, ale jednocześnie zapisuje że funkcja została wywołana. Da się to nadal obejść, ale jest mimo wszystko dużo "mocniejsze" niż to co robisz.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 4x, ostatnio: Shalom
Zobacz pozostały 1 komentarz
Shalom
Bo używasz wieśniackiego pythona3 :P binascii.unhexlify(payload)
Radosław Głębicki
No co ty: #! /usr/bin/env python3 Tak zaczynam moje programy. I tak powyższy. A jeszcze: print bez nawiasów nie przechodzi.
Shalom
Tam tak to miałem nas myśli, wiesniacki ofc jest py3
Radosław Głębicki
Dobrze wiedzieć. Załóż temat. "Ludzie nie używajcie pythona 3 bo jest wieśniacki" Ludzie powinni wiedzieć, że się mylą używając ver 3. :-)
Shalom
A ty myślisz ze to przypadek że istnieja takie rzeczy jak https://github.com/zardus/fuckpy3 ? :D
AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 2 godziny
  • Postów:973
0

Ale przecież zależy do czego kolega to potrzebuje. Jakoś np. w PyCharm można wyszukać miejsca gdzie metoda jest wywoływana i chyba oczywistym jest, że nie znajdzie takich miejsc gdzie wywołanie jest specjalnie ukryta


Zdalna praca dla Senior Python Developerów --> PW
Radosław Głębicki
Dokładnie. Podstawowe wywołania. A to wszystko powyżej, to można zacytować TBBT: "Znalezione na statku w Roswell"
Radosław Głębicki
  • Rejestracja:około 5 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Sardine, Italy
  • Postów:187
0

Do tego momentu programik generuje mi taki wynik. (to kawałek wyniku) Chcę to przerzucić do tkintera po lewej Listbox, a po prawej Text i skoki do miejsca i pokazywanie i może nawet Text interaktywny, aby z niego klikać i skakać. Na razie dodaję początek i koniec funkcji i znajdowanie wywołania wewnątrz definicji itd itp. Nauka przez zabawę.

Kopiuj
s():                                    -> line:   13, level:    1, parent: root, call_in_line: [124], 
f_testowanie(s_psw, s_co):              -> line:   36, level:    1, parent: root, *** Brak wywołania funkcji f_testowanie(s_psw, s_co): ! ****
f_progress():                           -> line:   93, level:    1, parent: root, *** Brak wywołania funkcji f_progress(): ! ****
f_do_logu(s_info):                      -> line:  127, level:    1, parent: root, *** Brak wywołania funkcji f_do_logu(s_info): ! ****
f_g_Popen(s_cmd):                       -> line:  192, level:    1, parent: root, call_in_line: [62, 114, 213, 368, 458, 557, 616, 618, 620, 712, 767, 831, 914, 1004, 1092], 
f_g_odczyt_updates():                   -> line:  204, level:    1, parent: root, call_in_line: [419], 
f_sortuj(l_pack_up):                    -> line:  243, level:    2, parent: f_g_odczyt_updates():, call_in_line: [245], 
f_odczyt_all_repo():                    -> line:  254, level:    1, parent: root, call_in_line: [446], 
f_szukaj(s_search):                     -> line:  286, level:    1, parent: root, call_in_line: [328, 411], 
f_okn_podaj_naz_pakietu(s_msg, s_dokad):-> line:  308, level:    1, parent: root, call_in_line: [402, 408], 
f_wstaw(event):                         -> line:  320, level:    2, parent: f_okn_podaj_naz_pakietu(s_msg, s_dokad):, call_in_line: [341, 346], 
f_enable(*event):                       -> line:  352, level:    2, parent: f_okn_podaj_naz_pakietu(s_msg, s_dokad):, call_in_line: [355], 
f_group_list():                         -> line:  360, level:    1, parent: root, call_in_line: [396], 
f_command(event):                       -> line:  383, level:    1, parent: root, call_in_line: [1141, 1163], 
f_installed_list():                     -> line:  479, level:    1, parent: root, call_in_line: [442, 1245], 
f_real_time():                          -> line:  499, level:    1, parent: root, call_in_line: [505, 1240], 
f_filtr(event):                         -> line:  507, level:    1, parent: root, call_in_line: [1185], 
f_okno_busy(**data):                    -> line:  527, level:    1, parent: root, call_in_line: [288, 414, 425, 482, 612],

A powyższe przykłady to kosmos. Fakt. Tego nie wyłuskam. Ale pozostanę przy podstawowych wywołaniach. Ktoś tak pisze, a jeśli tak to po co?

edytowany 1x, ostatnio: Radosław Głębicki
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie napisałeś po co ci to dokładnie jest, stąd te dziwne przykłady ;) Z takich bardziej "ludzkich" które faktycznie mogą się pojawić to np. coś w stylu tablicy z funkcjami i wywoływaniem ich po indeksie/kluczu. Też będzie to trudno wyszukać.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.