2016-09-27 17 views
1

У меня есть простая прикладная программа командной строки (пользовательская dir двоичная), которую я хотел бы использовать. Символы отладки включены, и я могу видеть глобальный указатель строки, который меня интересует, the_full_path_name на выходе objdump и nm -D.C - Значение печати, хранящееся на месте символа

Можно ли, в , чтобы как-то Lookup, что имя символа/место, и распечатать содержимое памяти, на которую он указывает при использовании инъекции кода (то есть: LD_PRELOAD библиотека с пользовательской gcc attribute((constructor)) и дополнительные функции)? Мне нужно выполнить это, не прилагая к этому процессу gdb.

спасибо.

+0

C делает не су интроспекция. Но если вы знаете переменную, вы можете просто «printf («% d », the_var)» (иначе, чем «int» использовать разные типы спецификаций типа преобразования). – Olaf

+2

Из того, что я понимаю, это должно быть возможно через 'LD_PRELOAD'. Вы пытались импортировать символ, используя глобальное объявление 'extern char * the_full_path_name;' (или какой бы то ни было его точный тип), а затем его распечатать? –

+0

Вы скомпилировали программу с помощью '-rdynamic'? – jxh

ответ

1

Я не совсем уверен, понял ли я ваш вопрос, но всегда ли вам помогает?

Файл, содержащий глобальный указатель

$ cat global.c  
char mylongstring[] = "myname is nulled pointer"; 

$ gcc -fPIC -shared global.c -o libglobal.so 

Оригинальная библиотека

$ cat get_orig.c 
#include <stdio.h>  
extern char * mylongstring; 
char *get() 
{ 
    mylongstring = "get from orig"; 
    return mylongstring; 
} 

$ gcc -fPIC -shared get_orig.c -o libget_orig.so -L. -lglobal 

Поддельный Библиотека

$ cat get_dup.c 
#include <stdio.h> 
extern char * mylongstring; 
char *get() 
{ 
    mylongstring = "get from dup"; 
    return mylongstring; 
} 

$ gcc -fPIC -shared get_dup.c -o libget_dup.so -L. -lglobal 

Фактический потребитель глобальной переменной:

$ cat printglobal.c 
#include <stdio.h> 

char *get(); 

int main(void) 
{ 
printf("global value=%s\n",get()); 
return 0; 
} 
$ gcc printglobal.c -L. -lglobal -lget_orig -o a.out 

otool выход

$ otool -L a.out 
a.out: 
     libglobal.so (compatibility version 0.0.0, current version 0.0.0) 
     libget_orig.so (compatibility version 0.0.0, current version 0.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 

Запуск a.out

$ DYLD_LIBRARY_PATH=./ ./a.out                                       
global value=get from orig 

Заменить библиотеку

$ cp /tmp/libget_dup.so libget_orig.so 
$ DYLD_LIBRARY_PATH=./ ./a.out 
global value=get from dup 

BTW, я испытал это на MAC так .so действительно неправильно для .dylib