- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
#include <stdio.h>
#include <dlfcn.h>
#include <getopt.h>
#include <string.h>
#include <stdlib.h>
#define int64 long long
const char* help =
" -h,--help это сообщение\
-f,--func имя функции\
-n,--num количество аргументов функции\
-a,--arg1 первый аргумент\
-b,--arg2 второй аргумент";
struct option longopts[] ={
{"func",1,NULL,'f'},
{"help",1,NULL,'h'},
{"num", 1,NULL,'n'},
{"arg1",1,NULL,'a'},
{"arg2",1,NULL,'b'},
{0,0,0,0}
};
void strtoa(void** arg, char* optarg){
int tmp;
char* e;
tmp = strtol(optarg,&e,10);
if (e != optarg + strlen(optarg)){
*arg = malloc(strlen(optarg));
strcpy((char*)*arg,optarg);
} else *arg = (void*)tmp;
}
int64 main(int argc, char** argv){
int opt, num = 0;
void *a,*b;
char* e;
void* (*func2)(void*,void*),
(*func1)(void*),
(*func0)(), *func = 0;
while((opt = getopt_long(argc,argv,"f:h:n:a:b:",longopts,NULL)) != -1){
switch (opt){
case 'h':
fprintf(stderr,"%s",help);
exit(0);
case 'f':
func = dlsym(NULL,optarg);
break;
case 'n':
num = atoi(optarg);
if (num > 2) exit(1);
break;
case 'a':
strtoa(&a,optarg);
break;
case 'b':
strtoa(&b,optarg);
break;
}
}
if(func != 0){
switch (num){
case 0:
func0 = func;
(*func0)();
break;
case 1:
func1 = func;
(*func1)(a);
break;
case 2:
func2 = func;
(*func2)(a,b);
}
}
return 0;
}
Запускает любую функцию линукс, содержащую до 2-х аргументов. В хелпе все написано. Собирать так c флагом -dl.
Использовать так:
a.out -f sleep -n 1 -a 1 - sleep на 1 секунду
a.out -f printf -n 1 -a OK - выводит без конца строки
вдохновлен этим:
http://govnokod.ru/13763
Я, crastinus97, говорю вам: этого способа нет в man. Я его сам открыл.
crastinus 11.09.2013 09:06 # 0
Dummy00001 11.09.2013 15:27 # 0
ЗЫ как по мне проще было бы нечто в духе:
perl -mPOSIX="" -e func_name'(params)'
потому что там уже есть все нужные функции.
crastinus 11.09.2013 15:32 # 0
Dummy00001 11.09.2013 15:36 # +1
чего (не смотря на стандарт) не скажешь о с компиляторе.
crastinus 11.09.2013 15:43 # 0
Dummy00001 11.09.2013 15:48 # 0
большая часть apt-* написана на перле. установить дебиан без перла невозможно. и если попытаться удалить перл, то apt начинает кидать очень страшные предупреждения, предрекая конец света и подобное.
eth0 11.09.2013 19:16 # 0
Блин, он на пайтоне.
bormand 11.09.2013 16:15 # 0
bormand 11.09.2013 16:23 # 0
bormand 11.09.2013 10:17 # +1
Я для венды когда-то такую тулзу писал...
Аргументов можно было передавать сколько угодно, писались они с префиксами примерно вот так: /i <int> или /s <string>.
А еще там была поддержка сессий - если добавить опцию /f <sid>, то программка "форкалась" (вернее CreateProcess'ила себя), и дальнейшие команды с тем же sid выполнялись в этом демонёнке. Зачем нужны сессии? А чтобы выполнять наборы взаимосвязанных API, например открыть файл, записать что-нибудь, закрыть файл.
Результат, который возвращала апишка, вываливался на stdout как число или строка в зависимости от ключа /ri или /rs.
Вот как-то так ;)
Dummy00001 11.09.2013 15:28 # +1
gh0stwizard 30.09.2013 17:33 # 0
bormand 30.09.2013 17:44 # 0
Очень маловероятно... Если найду - выложу на гитхаб.
P.S. Даже если и не найду, то там мало интересного: крейтпроцесс, пайп да парсер аргументов. Самое интересное было в асмовой части, аналог которой можно прочесть комментом ниже ;)
bormand 11.09.2013 11:54 # +2
crastinus 11.09.2013 15:52 # 0
bormand 11.09.2013 16:14 # 0
Ну адрес функции получать все равно придется через dlsym.
> вызывается по ссылке
В коде из топика она точно так же вызывается по ссылке ;) Просто там сссылка кастуется в нужный тип, а у меня так и остается void *.
crastinus 11.09.2013 16:50 # 0
упростил до
a.out функция параметры
http://pastebin.com/Gfbb4hUX
bormand 11.09.2013 17:04 # 0
*e :)
> int64 main
Эээ, нестандартненько как-то.
P.S. Автокаст в инты, имхо, опасная вещь. При попытке вывести какое-нибудь 42 (./raw_call printf "%s" 42) код распидорасит... Из-за этого я тогда и пилил эти дурацкие /i и /s перед каждым аргументом.
crastinus 11.09.2013 20:50 # +2
Стеб над суперхакером)
bormand 11.09.2013 17:52 # 0
Да этот raw_call черезжопие то еще. За пределами gcc/x86/cdecl не работает. Да и те же даблы хрен передашь. До кошерного уровня ее еще пилить и пилить...
crastinus 11.09.2013 20:56 # 0
bormand 11.09.2013 21:27 # +9
А еще у меня на плече сидит попугай, который умеет кричать "borrrrmand torrrt", а вместо скролла я юзаю корабельный штурвал.
Vindicar 13.09.2013 09:36 # 0
guest 14.09.2013 21:09 # 0
anonimb84a2f6fd141 19.09.2013 03:24 # 0
Stertor 03.10.2013 18:47 # 0
Пусть все, что скажет кэп, будет в курсиве, чтобы участники могли понять, что это говорит кэп
guest6 30.12.2023 01:44 # 0