2016-09-27 10 views
0

Я пытаюсь найти connect символ в файле libcrypto.so с помощью dlsym() и хочу заменить этот connect моим методом.Как изменить dlsym() return pointer value

void * lib_orig_tols = dlopen(libcrypto.so, RTLD_GLOBAL); 

void * p_orig_connectOriginal; 
    p_orig_connectOriginal = (void*)dlsym(lib_orig_tols, "connect"); 

    if (p_orig_connectOriginal != NULL) 
     { 
     LOGI(" is not NULL"); 

     void *p_orig_connect = (void*)*((unsigned *)p_orig_connectOriginal); 

     *((unsigned *)p_orig_connectOriginal) = (unsigned)(my_crypto_connect); 
     } 


    int my_crypto_connect(int , const struct sockaddr , socklen_t){ 
     ** 
     *********** 
     *************** 
     ********** 
    } 

Мое мое приложение получило разбилось с ошибкой
is not NULL

Fatal signal 11 (SIGSEGV), code 2, fault addr 0xb6e4755d in tid 7909

делать я делаю что-то неправильно.

+0

Почему android отметил? – Zarwan

+0

Исправьте код вашего кода. Вы должны использовать указатели на функции. «Unsigned *» не является допустимым указателем функции. – RedX

+0

1. Вы не можете этого сделать. 2. Этот код не имеет смысла, даже если вы можете это сделать. – hobbs

ответ

1

Ну, ваш код является неполным, он полон синтаксическими ошибками, а также содержит фиктивное преобразование типов (используйте intptr_t)

Плюса, нет «Connect» в libcrypto.so. Выберите один из них:

BIO_CONNECT_free 
BIO_CONNECT_new 
BIO_new_connect 
BIO_s_connect 
+0

Я хочу сделать swizzling в этом коде. хочу сменить систему SO' connect' с моей функцией 'connect'. Поэтому, когда любой вызов приложения, который« connect »я получил вызов после некоторой модификации я вызываю SO 'connect', используя его оригинальный указатель функции. – vinit

+0

Я не понимаю часть« SO », но это вполне возможно - конечно, вы не должны перезаписывать код общего доступа и другую бессмыслицу Вот экзамен ple: http://tsocks.sourceforge.net/ –