# HG changeset patch # User František Kučera # Date 1511220027 -3600 # Node ID 2a22f9959ea39a4d66366e3154e9093cd26b4720 # Parent 516358e07f9d84e8b9b7790da21dc26e4309af93 přepis-cli-parametrů: první verze diff -r 516358e07f9d -r 2a22f9959ea3 c++/přepis-cli-parametrů/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c++/přepis-cli-parametrů/Makefile Tue Nov 21 00:20:27 2017 +0100 @@ -0,0 +1,18 @@ +CXX=g++ +CXXFLAGS += -std=c++17 -Wall + +APP=přepis-cli-parametrů +PROGNAME=$(APP) +SRC=$(APP).cpp + +ALL: $(PROGNAME) + +$(PROGNAME): $(SRC) + $(CXX) $(CXXFLAGS) -o $(PROGNAME) $(SRC) + +clean: + rm -f $(PROGNAME) + +run: $(PROGNAME) + ./$(PROGNAME) první druhý třetí + diff -r 516358e07f9d -r 2a22f9959ea3 c++/přepis-cli-parametrů/přepis-cli-parametrů.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c++/přepis-cli-parametrů/přepis-cli-parametrů.cpp Tue Nov 21 00:20:27 2017 +0100 @@ -0,0 +1,79 @@ +/** + * Přepis CLI parametrů + * Copyright © 2017 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + + +using namespace std; + +void cekej() { + wprintf(L"Stiskněte Enter pro pokračování…"); + getwchar(); +} + +void napoveda(const string nazevProgramu) { + wprintf(L"Vypište si parametry jedním z následujících příkazů:\n"); + wprintf(L"\tcat /proc/$(pidof %s)/cmdline | xargs -0 -n1 echo\n", nazevProgramu.c_str()); + wprintf(L"\tps aux | grep '[ ]%s'\n", nazevProgramu.c_str()); +} + +/** + * 1) Program vypíše zadané parametry (argumenty příkazového řádku) a zastaví se (čeká na potvrzení uživatelem). + * 2) Uživatel si vypíše proces a jeho parametry v druhém terminálu. + * 3) Program přepíše svoje parametry – např. 'heslo' → 'xxxxx'. + * 4) Uživatel si opět vypíše informace o procesu a vidí, že původní informace (v praxi např. hesla) jsou pryč. + * 5) Program se ukončí. + */ +int main(int argc, char* argv[]) { + + setlocale(LC_ALL,""); + + string nazevProgramu = argv[0]; + + if (argc == 1) { // 1 = jen název programu, ale žádné parametry + wprintf(L"Není, co přepisovat – příště prosím zadejte nějaké parametry – např.\n"); + wprintf(L"\t%s aaa bbb ccc\n", nazevProgramu.c_str()); + return 1; + } + + wprintf(L"Přehled zadaných parametrů:\n"); + for (int i = 1; i < argc; i++) { + wprintf(L"\t%d = %s\n", i, argv[i]); + } + + napoveda(nazevProgramu); + cekej(); + + // Nahradíme všechny znaky ve všech parametrech, aby nebylo možné přečíst původní hodnoty (např. hesla). + // Pracujeme zde na úrovni bajtů, takže pokud parametr obsahoval vícebajtové znaky, bude mít po nahrazení více znaků (ale stejně bajtů). + // Stále bude možné zjistit délku původních parametrů (v bajtech). + for (int i = 1; i < argc; i++) { + char * arg = argv[i]; + while (*arg) *arg++= 'x'; + } + // Pokud bychom začínali od nuly (i = 0), přepsali bychom i samotný název programu! + // Možná už jste ve výpisu procesů někdy viděli názvy, které neodpovídají žádné binárce. + // Program se tak může maskovat – nicméně i tak bude symbolický odkaz v /proc/…/exe ukazovat na jeho binárku. + + wprintf(L"Parametry byly přepsány!\n"); + napoveda(nazevProgramu); + cekej(); +}