přepis-cli-parametrů: první verze
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 21 Nov 2017 00:20:27 +0100
changeset 542a22f9959ea3
parent 53 516358e07f9d
child 55 2fbf53cf0782
přepis-cli-parametrů: první verze
c++/přepis-cli-parametrů/Makefile
c++/přepis-cli-parametrů/přepis-cli-parametrů.cpp
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/c++/přepis-cli-parametrů/Makefile	Tue Nov 21 00:20:27 2017 +0100
     1.3 @@ -0,0 +1,18 @@
     1.4 +CXX=g++
     1.5 +CXXFLAGS += -std=c++17 -Wall
     1.6 +
     1.7 +APP=přepis-cli-parametrů
     1.8 +PROGNAME=$(APP)
     1.9 +SRC=$(APP).cpp
    1.10 +
    1.11 +ALL: $(PROGNAME)
    1.12 +
    1.13 +$(PROGNAME): $(SRC)
    1.14 +	$(CXX) $(CXXFLAGS) -o $(PROGNAME) $(SRC)
    1.15 +
    1.16 +clean:
    1.17 +	rm -f $(PROGNAME)
    1.18 +
    1.19 +run: $(PROGNAME)
    1.20 +	./$(PROGNAME) první druhý třetí
    1.21 +
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/c++/přepis-cli-parametrů/přepis-cli-parametrů.cpp	Tue Nov 21 00:20:27 2017 +0100
     2.3 @@ -0,0 +1,79 @@
     2.4 +/**
     2.5 + * Přepis CLI parametrů
     2.6 + * Copyright © 2017 František Kučera (frantovo.cz)
     2.7 + *
     2.8 + * This program is free software: you can redistribute it and/or modify
     2.9 + * it under the terms of the GNU General Public License as published by
    2.10 + * the Free Software Foundation, either version 3 of the License, or
    2.11 + * (at your option) any later version.
    2.12 + *
    2.13 + * This program is distributed in the hope that it will be useful,
    2.14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    2.15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    2.16 + * GNU General Public License for more details.
    2.17 + *
    2.18 + * You should have received a copy of the GNU General Public License
    2.19 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
    2.20 + */
    2.21 +
    2.22 +#include <stdlib.h>
    2.23 +#include <iostream>
    2.24 +#include <wchar.h>
    2.25 +#include <locale.h>
    2.26 +
    2.27 +
    2.28 +using namespace std;
    2.29 +
    2.30 +void cekej() {
    2.31 +	wprintf(L"Stiskněte Enter pro pokračování…");
    2.32 +	getwchar();
    2.33 +}
    2.34 +
    2.35 +void napoveda(const string nazevProgramu) {
    2.36 +  wprintf(L"Vypište si parametry jedním z následujících příkazů:\n");
    2.37 +  wprintf(L"\tcat /proc/$(pidof %s)/cmdline | xargs -0 -n1 echo\n", nazevProgramu.c_str());
    2.38 +  wprintf(L"\tps aux | grep '[ ]%s'\n", nazevProgramu.c_str());
    2.39 +}
    2.40 +
    2.41 +/**
    2.42 + * 1) Program vypíše zadané parametry (argumenty příkazového řádku) a zastaví se (čeká na potvrzení uživatelem).
    2.43 + * 2) Uživatel si vypíše proces a jeho parametry v druhém terminálu.
    2.44 + * 3) Program přepíše svoje parametry – např. 'heslo' → 'xxxxx'.
    2.45 + * 4) Uživatel si opět vypíše informace o procesu a vidí, že původní informace (v praxi např. hesla) jsou pryč.
    2.46 + * 5) Program se ukončí.
    2.47 + */
    2.48 +int main(int argc, char* argv[]) {
    2.49 +
    2.50 +	setlocale(LC_ALL,"");
    2.51 +
    2.52 +	string nazevProgramu = argv[0];
    2.53 +
    2.54 +	if (argc == 1) { // 1 = jen název programu, ale žádné parametry
    2.55 +		wprintf(L"Není, co přepisovat – příště prosím zadejte nějaké parametry – např.\n");
    2.56 +		wprintf(L"\t%s aaa bbb ccc\n", nazevProgramu.c_str());
    2.57 +		return 1;
    2.58 +	}
    2.59 +
    2.60 +	wprintf(L"Přehled zadaných parametrů:\n");
    2.61 +	for (int i = 1; i < argc; i++) {
    2.62 +		wprintf(L"\t%d = %s\n", i, argv[i]);
    2.63 +	}
    2.64 +
    2.65 +	napoveda(nazevProgramu);
    2.66 +	cekej();
    2.67 +
    2.68 +	// Nahradíme všechny znaky ve všech parametrech, aby nebylo možné přečíst původní hodnoty (např. hesla).
    2.69 +	// Pracujeme zde na úrovni bajtů, takže pokud parametr obsahoval vícebajtové znaky, bude mít po nahrazení více znaků (ale stejně bajtů).
    2.70 +	// Stále bude možné zjistit délku původních parametrů (v bajtech).
    2.71 +	for (int i = 1; i < argc; i++) {
    2.72 +		char * arg = argv[i];
    2.73 +		while (*arg) *arg++= 'x';
    2.74 +	}
    2.75 +	// Pokud bychom začínali od nuly (i = 0), přepsali bychom i samotný název programu!
    2.76 +	// Možná už jste ve výpisu procesů někdy viděli názvy, které neodpovídají žádné binárce.
    2.77 +	// Program se tak může maskovat – nicméně i tak bude symbolický odkaz v /proc/…/exe ukazovat na jeho binárku.
    2.78 +
    2.79 +	wprintf(L"Parametry byly přepsány!\n");
    2.80 +	napoveda(nazevProgramu);
    2.81 +	cekej();
    2.82 +}