Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поясните c (* ** &) 
V
    Опции темы
eXa
Дата 6.1.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Пробуя себя в C++ и никак недоходят до меня использование ссылок и в чём их разница(* ** &) 
Код

 char **request;
 (*request)[0] = 0x01;
 (*request)[1] = 0x0A;
 memcpy(&(*request)[6], "\x00\x01\x00\x01\x00\x01", 6);
 memcpy(&(*request)[0x0D], &strlen, 1);



такой код несъедобен для компиллятора, почему?
Код

 char request;
 request[0] = 0x01;
 request[1] = 0x0A;
 memcpy(request[6], "\x00\x01\x00\x01\x00\x01", 6);
 memcpy(request)[0x02], strlen, 1);


И вот ещё мой моск никак не понимает что за [0],[1],[6],[0x0D] после request этож массивO_o, тоесть ставя ** переменная = массив(глупость канеш)

PM MAIL   Вверх
JackYF
Дата 6.1.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(eXa @  5.1.2008,  23:02 Найти цитируемый пост)
char request;

один символ.

Цитата(eXa @  5.1.2008,  23:02 Найти цитируемый пост)
request[0]

что ты этим хотел сказать?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 6.1.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



int *p - это указатель на переменную типа int. Пока ты не присвоишь значение, указатель считается "диким" - т.е. указывает непонятно куда.
int i; это переменная типа int. К ней нельзя применять операторы [] и "унарная звездочка", так как это не указатель
p = &i - теперь указателю p присваивается адрес переменной i
Чтобы присвоить переменной, на которую указывает p, значение, нужно "разыменовать указатель": *p = 10
p = (int*)malloc(sizeof(*p)*10) - а тут указателю p присваивается адрес динамического массива из 10 переменных типа int. Теперь доступ к ним можно получить так: p[0], p[1] - доступ к первой и второй переменный соответственно. Можно и так, что тоже самое: *(p+0), *(p+1)
int v[10] - это статический массив из 10 элементов. По сути своей v аналогичен p в предыдущем примере, только с самого начала указывает на массив. Можно даже выполнить такую операцию: p = v; после чего можно будет работать с массивом через p
int **pp - это указатель на переменную типа int* (int* - это указатель на тип int). Вот тут во второй половине первого поста (про двумерные динамические массивы) есть пример использования.
PM   Вверх
eXa
Дата 6.1.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



 JackYF хотел сказать 
Код
char *request;

bsa +1 Доходчиво
НОооо...
Код

#include <winsock2.h>
#include <stdio.h>
 int main()
 {
  char **request;
 (*request)[0] = 0x01;
 (*request)[1] = 0x00;
 *request = (char*)malloc(13);
 memcpy(&(*request)[2], "\x00\x01\x00\x01\x00\x01", 6);
 memcpy(&(*request)[8], "\x01\x0\x01\x00\x01", 5);
 printf(*request);
 }

При компиляции выскакивает еррор  и тыкает на инструкцию 0x000000X  которая неможет прочитать 0x000000X. Поправьте меня  smile  


Это сообщение отредактировал(а) eXa - 6.1.2008, 01:13
PM MAIL   Вверх
bsa
Дата 6.1.2008, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



eXa, ты читал ссылку, которую я тебе дал?
А еще ты не понял про "дикие указатели".
И это ошибка не при компиляции, а при исполнении - ты пытаешься прочитать значение по неизвестно какому адресу - срабатывает защита операционной системы.
PM   Вверх
onsql
Дата 6.1.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: 1
Всего: 3



Пытаешься писать неизвестно куда в память, вот у тебя access violation и вылезает...
 
Код

char **request;
 (*request)[0] = 0x01;
 (*request)[1] = 0x00;
 


PM MAIL   Вверх
onsql
Дата 6.1.2008, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: 1
Всего: 3



eXa
А чтобы заставить твой код заработать, надо его исправить както так :
Код

#include <winsock2.h>
#include <stdio.h>
int main()
{
  char **request;
  request = (char **) malloc(sizeof(char *));
  *request = (char *) malloc (sizeof(char) * 13);

  (*request)[0] = 0x01;
  (*request)[1] = 0x00;
  //*request = (char*)malloc(13);
  memcpy(&(*request)[2], "\x00\x01\x00\x01\x00\x01", 6);
  memcpy(&(*request)[8], "\x01\x0\x01\x00\x01", 5);
  printf(*request);
}


Другой вопрос, что приведенный пример настолько же бесполезен, насколько и безумен smile  Чего ты хочешь добиться - непонятно....

Это сообщение отредактировал(а) onsql - 6.1.2008, 01:46
PM MAIL   Вверх
bsa
Дата 6.1.2008, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



eXa, если содержимое массива меняться не будет, то попробуй переписать так:
Код
#include <winsock2.h>
#include <stdio.h>
int main()
{
      static const char request[] = {1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1};
      ...
      //printf(request); //операция бессмысленна, так как содержимое request содержит не печатаемые символы
      return 0;
}

PM   Вверх
eXa
Дата 6.1.2008, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Спасибо за быстрые ответы smile  В своём примере я глюканул, прекрасно понимаю что выделение памяти для request должно быть выше чём запись в неё, но ошибка тем не менее не пропала onsql также и с твоим примером. Да и извеняюсь, правильно выскакивает ошибка не при компиляции, а при исполнении, опять моя невнимателность smile 


Это сообщение отредактировал(а) eXa - 6.1.2008, 04:55
PM MAIL   Вверх
bsa
Дата 6.1.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



eXa, ты хоть напиши, что ты хочешь получить. Потому что указатель типа char **p обычно применяется для создания массива строк. А тебе, помоему, не это нужно. Тебе, видимо, нужен один массив. Очень рекомендую почитать это и это.
PM   Вверх
onsql
Дата 6.1.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: 1
Всего: 3



eXa
Цитата

...но ошибка тем не менее не пропала onsql также и с твоим примером. Да и извеняюсь, правильно выскакивает ошибка не при компиляции, а при исполнении...

Довольно странно всё это. Я сейчас собрал это дело под cygwin, запустил под gdb - никаких ошибок нет. Попросил товарища собрать в VS2008 - тоже результат, за исключением того что хидер winsock2.h он убрал (непонятно, зачем он вообще в этом примере), а stdlib.h и string.h добавил.

Кстати что за сообщение, unhandled exception, ещё что-то? Ты бы написал под чем собираешь и текст ошибки, которую получаешь? Вполне возможно, что сообщение которое ты получаешь возникает в каком либо модуле, который линкуется к твоему экзешнику. Попробуй запустить этот код под отладчиком и посмотреть в каком месте происходит ошибка.
PM MAIL   Вверх
eXa
Дата 6.1.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



bsa это отрывок участка кода от авторизации icq, в нём то я и хочу разобраться. Насколько я понимаю, надо собрать строку для последуюшей отправки. Про массивы обязательно почитаю.

Авторизация ICQ из исходника ZBrute
Код

unsigned short make_auth_request(char* icq, char* password, char** request, short uinlen, short passwordlen){
        char        *xored_password;
        unsigned short    reqlen = 81,
             i;


        xored_password  = (char*)malloc(passwordlen);
        xor(password, (char*)&xor_key[0], xored_password);



    reqlen += uinlen + passwordlen;
    *request = (char*)malloc(reqlen);
        
        zeromem(*request, reqlen);
        
        (*request)[0] = 0x2A;
        (*request)[1] = 0x01;

        i = _random() % 0x7FFF;

    memcpy(&(*request)[2], &i, 2);

              
        i = htons(reqlen - 6); // 75 + uinlen + passwordlen
    memcpy(&(*request)[4],                        &i, 2);
        
    memcpy(&(*request)[6],                        "\x00\x00\x00\x01\x00\x01", 6);
    memcpy(&(*request)[0x0D],                      &uinlen, 1); // =)
    memcpy(&(*request)[14],                        icq, uinlen);
    memcpy(&(*request)[14 + uinlen],                  "\x00\x02", 2);
    memcpy(&(*request)[17 + uinlen],                  &passwordlen, 1);
    memcpy(&(*request)[18 + uinlen],                  xored_password, passwordlen);
    memcpy(&(*request)[18 + uinlen + passwordlen],
        "\x00\x03\x00\x09\x97\x97\x97\x97\x97\x97\x97\x97\x97\x00\x16\x00\x02"
        "\x00\xea\x00\x17\x00\x02\x00\x00\x00\x18\x00\x02\x00\x02\x00\x19\x00"
        "\x02\x00\x01\x00\x1a\x00\x02\x00\x01\x00\x14\x00\x04\x00\x00\x00\x55"
        "\x00\x0f\x00\x02\x72\x75\x00\x0e\x00\x02\x72\x75",    63
    );

        free(xored_password);

        return reqlen;


}


onsql пересобрал ещё разок, в моём примере примере при отладке пишет про нарушениие сегметации при вызове 
Код
*request = (char*)malloc(reqlen)
 С твоим всё окэ O_o странно вчера не окэ было. Компилю на Dev-C++ 4.9.9.2 Без хидера Winsock2 непонимает функцию malloc, в любом случии в дальнейшем мне без этого хидера никак.


Это сообщение отредактировал(а) eXa - 6.1.2008, 15:30
PM MAIL   Вверх
onsql
Дата 6.1.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: 1
Всего: 3



А ну тогда понятно, ты просто про другой код писал smile
А в этой функции:
Код

unsigned short make_auth_request(char* icq, char* password, char** request, short uinlen, short passwordlen)

двойной указатель char ** request нужен для того что бы возвращать значение указателя из функции. Если просто написать char * request то можно будет изменять значения по адресу request, но сам request поменять будет нельзя, т.е:
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void foo(char * s) {
 static char * s1 = "def";
 s[0] = '1';
 s = s1;
}

void foo2(char ** s) {
 static char * s2 = "def";
 (*s)[0] = '2';
 *s = s2;
}

int main(int argc, char ** argv) {
  char * x = (char *) malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  printf("&x = 0x%08X, x='%s'\n", x, x);
  foo(x);
  printf("&x = 0x%08X, x='%s'\n", x, x);
  foo2(&x);
  printf("&x = 0x%08X, x='%s'\n", x, x);
  return 0;
}

PM MAIL   Вверх
eXa
Дата 6.1.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Понемногу вникаюсь! Сотни жаль нету, плюсанул бы вас
onsql вот только поясни эту хитрую строчку,   
Код

printf("&x = 0x%08X, x='%s'\n", x, x);

И вот вопросек ещё один назрел, далёкий от сабжа но всёже smile 
После отправки этих строк, я получаю ответ из нечитаемых символов, как мне их перевести в читабельный вид?  


PM MAIL   Вверх
bsa
Дата 6.1.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(eXa @ 6.1.2008,  23:17)
Код

printf("&x = 0x%08X, x='%s'\n", x, x);


функция printf - это форматированный вывод. соответсвенно, есть спецификаторы форматирования - они начинаются со знака % (процент) и определяют количество и тип параметров.
в твоем случае:
%08X - выводит восьмизначное шестнадцатиричное число (32 бита) (например: 000123AB)
%s - текст
В твоем случае в этой строке есть ошибка. надо вместо %08X использовать %08p. Так как x - это не 32-х битное целое, а указатель. А он далеко не всегда 32-х битный.
Цитата(eXa @ 6.1.2008,  23:17)
[code=cpp]
После отправки этих строк, я получаю ответ из нечитаемых символов, как мне их перевести в читабельный вид?

только в цикле должен перебрать весь набор (массив) и распечать числа.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.