Proszę o skomplikowanie mi zadania ;-)

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

#! /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()
1

CO?

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.

0

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

Pokaz ten program.

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.

'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
0

Jeszcze może być taki:

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

I działa.

2
from base64 import b64decode

def f_aaa():
    print(1)

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

Liczy się?

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.

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.

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

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ę.

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?

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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1