2016-04-28 7 views
0

мне нужно выполнить следующие две команды для каждого файла в каталоге:Script раздеться секции из ELF бинарных файлов

A) Первая команда:

readelf -aW A_FILE | grep Machine 

где A_FILE это имя конкретного файла ,

Выход из первой команды выглядит примерно так:

Machine: <unknown>: 0xXXX 

0xXXX где есть некоторое шестнадцатеричное число.

B) Вторая команда

objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil --alt-machine-code=<Machine> A_FILE A_FILE.STRIPPED 

где <Machine> является шестнадцатеричное число из первой команды, и A_FILE.STRIPPED это имя выходного файла из objcopy. (STRIPPED произвольно, может быть любым фрагментом текста)

+0

Если '0x' быть включен во второй команде, или только шестнадцатеричные цифры, которые следуют? –

+0

... Я также пытался обновить заголовок вопроса, чтобы быть немного менее «write-this-for-me!». и представлять то, что на самом деле скрипт * делает *, поскольку эта вещь, которую он делает, связана с разработкой, и поэтому актуальна. :) –

+0

Большое спасибо, Чарльз. Да, '0x' должен быть включен во вторую команду. – Jacko

ответ

1
#!/bin/bash 
#  ^^^^- important, not /bin/sh 

# define a regex, in ERE form, to extract the content you want in a match group 
re='machine.*(0x[[:xdigit:]]{2,}) ' 

# iterate over files, putting each in $f 
for f in *; do 

    # don't operate on files we previously generated 
    [[ $f = *.stripped ]] && continue 

    # actually run readelf, taking first matching line 
    m_line=$(readelf -aW "$f" | egrep -m 1 "$re") 

    [[ $m_line =~ $re ]] || continue # check whether we match the regex 

    # if we get here, the regex matched; copy the first match group into a variable 
    code=${BASH_REMATCH[1]} 

    # ...and use that variable in calling objcopy 
    objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil \ 
    --alt-machine-code="$code" \ 
    "$f" "$f.stripped" 
done 
+0

Отлично! Еще раз спасибо. – Jacko

 Смежные вопросы

  • Нет связанных вопросов^_^