LINUX.ORG.RU

Как это будет выглядеть в Go?

 


0

3

На Си аргументы командной строки можно модифицировать, чтобы изменения были видны в списке процессов (ps ax | grep название_проги). Например:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
        if (argc < 2) {
                fprintf(stderr, "Добавьте аргумент.\n");
                return 1;
        }        
        for (int i = 0; argv[1][i] != '\0'; i++) {
                argv[1][i] = '*';
        }
        for (;;) {
                sleep(10);
        }        
        return 0;
}
Но попробовал аналогичное написать на Go и обломался:
package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Fprintf(os.Stderr, "Добавьте аргумент.\n")
		os.Exit(1)
	}
	var s string
	max := len(os.Args[1])
	for i := 0; i < max; i++ {
		s += "*"
	}
	os.Args[1] = s
	for {
		time.Sleep(10 * time.Second)
	}
}
Как на Go правильно менять аргумент, чтобы это влияло на его отображение в списке процессов?

★★★

Через unsafe можно модифицировать строку, как и в С.

	s := os.Args[1]
	for i, _ := range s {
		h := (*reflect.StringHeader)(unsafe.Pointer(&s))
		a := (*int8)(unsafe.Pointer(h.Data + uintptr(i)))
		*a = '*'
	}

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Пардон, там с range ошибка (будет нормально работать только для однобайтных рун). Нужно сделать

for i := 0; i < len(s); i++ {

urxvt ★★★★★
()
Последнее исправление: urxvt (всего исправлений: 1)
Ответ на: комментарий от deterok

Где-то было такое применение при передаче пароля через командную строку, потом его заменяли звездами, чтобы в ps не светился.

urxvt ★★★★★
()
Ответ на: комментарий от deterok

Можно кроссплатформенные трояны пилить. В одном месте маскируешься под svchost.exe, в другом под systemd

Midael ★★★★★
()
Ответ на: комментарий от vertexua

Вспомнил, вроде, в mysql-client такое видел.

urxvt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.