Proszę o skomplikowanie mi zadania ;-)

Proszę o skomplikowanie mi zadania ;-)
Radosław Głębicki
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • Postów: 1909
1

CO?

Radosław Głębicki
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • Postów: 5023
0

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

Pokaz ten program.

sugar_hiccup
  • Rejestracja: dni
  • Ostatnio: dni
  • 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
Radosław Głębicki
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Sardine, Italy
  • Postów: 187
0

Jeszcze może być taki:

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

I działa.

TS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 394
2
Kopiuj
from base64 import b64decode

def f_aaa():
    print(1)

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

Liczy się?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

AN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 989
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

Radosław Głębicki
  • Rejestracja: dni
  • Ostatnio: dni
  • 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?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • 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ć.

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.