Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > перл парсер для адреса стека


Автор: Tailz 1.11.2007, 07:49
Всем доброй ночи !
собственно имеем мы адрес стека 0xbfffffff
использую парсинг перла с командной строки
как мы ее выведем в обратном порядке + '\x'
тоест 0xbffffff -> "\xff\xff\xff\xbf"
буду оч благодарен спасибо, начинаю учить магию перла smile

Автор: Unrealm 1.11.2007, 12:03
Немного не понял, что требуется, но вот код, я думаю его не составит труда привести к необходимому виду:

Код

#!/usr/bin/perl -w

$a = '0xbfffffff';
@arr = ();
while($a =~ m/(\w{2,2})/g)
{  push @arr, $1;  }
shift @arr;
while(@arr)
{
   $a = pop @arr;
   print '\x'.$a, ' = ', hex $a, "\n";
}


Автор: Tailz 1.11.2007, 16:38
спасибо большое Unrealm !!!
работает как надо  smile 

Код

#!/usr/bin/perl -w
$a = '0xbfffffde';
@arr = ();
print $a."--> ";
while($a =~ m/(\w{2,2})/g)
{  push @arr, $1;  }
shift @arr;
while(@arr)
{
   $a = pop @arr;
   print '\x'.$a;
}
print "\r\n";


можно ли такое с командной строки на перле замутить?
с командной строки имеется что то вроде етого на большее голова не тянет :(

Код

perl -e 'print "Hello World !\r\n"'


Еще раз спасибо большое за помощь !!!

Автор: Unrealm 1.11.2007, 23:57
Разве что так: 
Код

perl -e "$_=reverse '0xbfffffde';while(/(?!x0)(\w)(\w)/g){print '\x'.$2.$1} "

Автор: Tailz 2.11.2007, 05:21
сорри че то не выходит крутил вертел командные опции не выходит :(
и в нете не чего подобного не нашел
подкорректируй пожалуйста код
вот что пишет

Код

perl -e "$_=reverse '0xbfffffde';while(/(?!x0)(\w)(\w)/g){print '\x'.$2.$1} "
bash: !x0: event not found

Автор: pompei 2.11.2007, 06:49
Вот работает без проблемм

perl -e "$_=$ARGV[0]; s/^0x//; push @x, $1 while /(\w\w)/g; print '\\x', join  '\\x', reverse @x " -- 0x123456ab


или


perl -e "$_=$ARGV[0];s/^0x//i;unshift@x,$&while/\w\w/g;print'\\x',join'\\x',@x" -- 0x123456ab


Вывод:

\xab\x56\x34\x12


Это на винде, в линуксе просто поменяйте апострофы на двойные кавычки и двойные кавычки на апострофы

Автор: Tailz 2.11.2007, 07:54
2pompei,
спасибо большое за код
блин писец не фига не пойму или у меня битая версия перла или хз
пытался менял строки знаки хочет работает хочет ошибки выдает

скажите плиз какая у вас рабочия версия перла
у меня This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

странно но не один код ис вышеприведенных на етой версии не работает :(
в чем же дело может быть ?
не ужели там такие значительные изменения между версиями :((((

pompei,
посмори плис что значит?
Код

Can't modify constant item in scalar assignment at -e line 1, near "];"
Execution of -e aborted due to compilation errors.

Автор: pompei 2.11.2007, 08:09
У Вас Перл нормальный, просто в консоли дело, она отличается в винде и линуксе (там по разному воспринимаются апострофы и дв.кавычки). В линуксе в двойных кавычках, например, $x - обозначает что нужно на это место поставить значение переменной окружения x. А в винде уже апострофы имеют специальное значение. Поэтому проблемма совсем не в перле.

В выше приведённых примерах, чтобы они работали на линуксе поменяйте апострофы на двойные кавычки и двойные кавычки на апострофы

Автор: Tailz 2.11.2007, 09:48
огромное спасибо pompei !
давно мне нормально не кто не помогал были бы права добавил
бы репутацию или модером бы сделал ;)
спасибо что указал на мои ошибки очень благодарен !
незная перла я и не подозревал что противоположные расличия ковычек
на винде и линуксе.

Автор: pompei 2.11.2007, 11:05
Перл на винде и на линуксе ОДИНАКОВО использует кавычки (одна из догм перла - платформонезависимость). РАЗЛИЧИЯ же наблюдаются только у консолей.

Автор: amg 2.11.2007, 12:17
Как всегда в перле, возможны и другие варианты. Например:
Код

perl -le '$_=shift; print map {q(\\).$_} reverse /(..)(..)(..)(..)$/' 0xbfffffde
perl -e '$_=shift; print($1 ne "0x" ? "\\$1" : "\n") while s/(..)$//' 0xbfffffde
Эти команды - для linux. Для винды нужно внешние одинарные кавычки заменить на двойные, а двойные внутри программы - забэкслешить.

Автор: Tailz 3.11.2007, 23:37
большое спасибо amg
восникло пару вопросов
Код


m00n@local:~$ perl -l -e '$_ = shift; print unpack("H*", $_)' //bi
2f2f6269
m00n@local:~$ perl -l -e '$_ = shift; print reverse /(..)(..)(..)(..)$/' 2f2f6269
69622f2f


как обьединить ети 2 запроса в один?
так как я новичок к перлу пытался у меня не получалось
также помогите плис с реверсом етого запроса
Код

perl -l -e '$_ = shift; print unpack("H*", $_)' //bi

ето у нас идет char to hex
а как на перле сделать hex to char ?
спасибо большое всем за помошь

Автор: amg 5.11.2007, 11:21
Цитата(Tailz @  3.11.2007,  23:37 Найти цитируемый пост)
как обьединить ети 2 запроса в один?
Для начала скажу, что опции перла особенно хорошо приспособлены для обработки строк из потока или из файлов. Можно, конечно, подавать перлу данные и через аргументы, вводя их вручную или с помощью xargs, но обычно данные все же берутся из файла или поступают с выхода другой программы. И так, объединить команды:
Код

# Подать выход одной команды на вход другой.
echo -n //bi | perl -ne 'print unpack("H*", $_)' | perl -lne 'print reverse /(..)(..)(..)(..)$/'
# Либо внести код одной программы в другую, тупо
echo -n //bi | perl -lne 'print reverse unpack("H*", $_)=~/(..)(..)(..)(..)$/'
# или не очень
echo -n //bi | perl -lne 'print unpack("H*", reverse $_)'


Добавлено через 11 минут и 13 секунд
Цитата(Tailz @  3.11.2007,  23:37 Найти цитируемый пост)
также помогите плис с реверсом етого запроса

Самое очевидное решение в данном случае отлично работает
Код

echo -n 2f2f6269 | perl -lne 'print pack("H*", $_)'

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)