Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1

VkLib

20.06.2011, 08:32. Показов 7511. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я написал либу с помощью которой можно выполнить методы Вконтакте API, собственно которые представлены здесь:
Обычные методы: http://vkontakte.ru/developers... E%E2%20API
Расширенные методы: http://vkontakte.ru/developers... 4%FB%20API
vklib.rar
vk.h - заголовочный файл
vklib.dll - собственно сама библиотека
vklib.lib - lib для подключения
libeay32.dll - для HTTPS
ssleay32.dll - для HTTPS
А теперь собственно как пользоваться..
Авторизация проходила по алгоритму который описывается здесь:http://vkontakte.ru/developers... 5%ED%E8%E9
и так сначала надо создать приложение через которые либа и будет выполнять все методы
приложение создается по этой ссылке: http://vkontakte.ru/editapp?act=create&site=1 нужно выбрать "Standalone-приложение"
Теперь вы должны разрешить методы:
Code
1
http://api.vkontakte.ru/oauth/authorize?client_id=APP_ID&scope=friends,photos,audio,video,docs,notes,pages,offers,questions,wall,messages,offline&redirect_uri=http://api.vkontakte.ru/blank.html&display=touch&response_type=token
APP_ID - айди вашего приложение.
теперь можно свободно пользоваться библиотекой... вот маленький примерчик->
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "vk.h"
using namespace std;
#pragma comment(lib, "vklib.lib")
 
int main()
{
    if(LoginVK("danvern1%40mail.ru","пароль"))
           {
         if(LearnAccessToken("2345463"))
                {
            sendFuncVkAPI("wall.post","owner_id=58185685&message=xai",10,0,true);
         }
                 else
                   cout << "Айди приложение указано не правильно либо вы не разрешили доступ!!!" << endl;
           }
           else
              cout << "Логин или пароль введены не верно!!!" << endl;
    getchar();
    return 0;
}
LoginVK("danvern1%40mail.ru","пароль"); Эта функция получает куки которые будут нужны для получение AccessToken.
Параметры:
1: Логин (вместо @ надо писать %40)
2: Пароль


LearnAccessToken("2345463"); Эта функция получает AccessToken который нужен для вызовов методов.
Параметры:
1:айди приложения.

sendFuncVkAPI("wall.post","owner_id=5818 5685&message=xai",10,0,true);Функция выполняет методы Вконтакте апи
Параметры:
1: метод
2: параметры метода (перечисляются через &)
3: количество вызовов
4: задержка между вызовами (в секундах)
5: будет выводить на экран ответ от сервера или не будет

возвращает ссылку на структуру с ответами сервера..
C++
1
2
3
4
recvServ * rv;
rv = sendFuncVkAPI("wall.post","owner_id=58185685&message=xai",10,0,false);
for(int i = 0;i < 10;i++)
        cout << rv[i].reply << endl;
жду комментариев...
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
20.06.2011, 14:45
в функции LoginVK() вы копируете входные аргументы в статический размер фиксированного размера (256 байт) имеем возможность классического переполнения буфера.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include "vk.h"
#pragma comment(lib, "vklib.lib")
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char login[1024] = {0}, password[1024] = {0};
    memset(login, 'A', sizeof(login) - 1);
    memset(password, 'A', sizeof(password) - 1);
 
    // получить CRASH :)
    bool signin = LoginVK(login, password);
 
    std::cout <<
        (signin ?
        "Залогинились удачно." :
        "Логин или пароль введены не верно!!!")
              << std::endl;
 
    system("pause");
    return 0;
}
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
20.06.2011, 14:50  [ТС]
переполнение буфера будет наврятли так как логин из 256 символов это на грани фантастики да пароль тоже... а переменные перед каждым вызовом очищаются и наврятли будет крах программы
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
20.06.2011, 15:07
Danvern, целью переполнения буфера является исполнение кода в целевой системе с правами пользователя, а не тупо завал программы. http://ru.wikipedia.org/wiki/Переполнение_буфера

Добавлено через 2 минуты
Цитата Сообщение от Danvern Посмотреть сообщение
наврятли будет крах программы
a Вы запустите программку и сами увидите

Добавлено через 4 минуты
короче говоря, переполнению буфера подвержены большая часть внутренних функций Вашей библиотеки и все три экспортируемые.
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
20.06.2011, 16:05  [ТС]
все теперь понял... не подскажете как подправить программу чтоб таких крахов не было?
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
20.06.2011, 19:31
Вся соль проблемы заключается в использовании функций типа strcat(), strcpy() и т.д. В качестве временной заплаты можно вместо них использовать strncat(), strncpy() и т.д., а вообще, как избавиться от подобных проблем информации - полный интернет.

Добавлено через 1 минуту
Вот, например, реализация функции LoginVK (в общих чертах, реверсить полностью было лениво):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//
// ...
// 
 
// глобально объявленные буферы, вообще строго говоря
// наличие глобальных данных - признак непродуманного
// дизайна
char g_login[256];
char g_password[256];
char g_buff1[60];
char g_accessToken[128];
 
//
// ...
// 
 
int LoginVK(const char * login, const char * password)
{
    int result = 0;
    char *v3, *v4;
 
    memset(&g_login, 0, sizeof(g_login));
    memset(&g_password, 0, sizeof(g_password));
    memset(&g_buff1, 0, sizeof(g_buff1));
    memset(&g_accessToken, 0, sizeof(g_accessToken));
 
    strcat(&g_login, login);       // проблемы происходят вот здесь
    strcat(&g_password, password); // и здесь
 
    PARSE_URL("http://login.vk.com/?act=login");
    CREATE_HEADER(1);              // еще вот в этой функции
    v3 = HTTP_GET();
    PARSE_URL(v3);
    CREATE_HEADER(0);
    v4 = HTTP_GET();
 
    strcat(&g_buff1, v4);          // и вот здесь
 
    if ( strlen(g_buff1) == 60 )
    {
        result = 1;
    }
    else
    {
        memset(&g_buff1, 0, sizeof(g_buff1));
        result = 0;
    }
    return result;
}
 
//
// ...
//
1
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
21.06.2011, 06:03  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
// глобально объявленные буферы, вообще строго говоря
// наличие глобальных данных - признак непродуманного
// дизайна
но это было сделано просто для удобства...
и если ни секрет откуда вы знаете что у меня в библиотеки написано?
а на счёт strncat попытаюсь заменить strcat'ы.

Добавлено через 33 минуты
но все равно эту проблему до конца оч сложно решить так как если да же пользователь и введет пароль который состоит более чем из 256 символов(хотя такое наврятли будет) и если начать вот так записывать
strncat(str1,str2,sizeof(str1) - strlen(str1));

то это всех проблем не решает
а это значит что логин и пароль просто на просто до конца не запишутся в переменную и это значит что пользователь ни когда не авторизируется...
и тогда для этой библиотеки надо будет целую систему обработки ошибок писать
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
21.06.2011, 12:20
Цитата Сообщение от Danvern Посмотреть сообщение
и тогда для этой библиотеки надо будет целую систему обработки ошибок писать
А как по другому? Поймите, если Ваша библиотека будет "дырявой", то ей пользоваться просто-напросто никто не будет, ну кроме Вас самих, наверное.
Цитата Сообщение от Danvern Посмотреть сообщение
но все равно эту проблему до конца оч сложно решить так как если да же пользователь и введет пароль который состоит более чем из 256
проблема как раз таки в том что буфер фиксированного размера - если вы начнете работать с динамической памятью, то сразу заметите, что данной проблемы больше не будет возникать. Совет: взгляните на класс std::string вместо char *.

Добавлено через 1 минуту
Цитата Сообщение от Danvern Посмотреть сообщение
и если ни секрет откуда вы знаете что у меня в библиотеки написано?
Если программа запускается - то ее исходный код можно восстановить. Нужно всего лишь небольшие знания ассемблера и все

Добавлено через 2 минуты
Еще одна бага: попробуйте отключить сетевуху и запустить один из примеров использования библиотеки. Наблюдаем зависание либо крэш программы.
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
21.06.2011, 12:23  [ТС]
всё пойду переписывать программу...
ну да там проверка на функцию connect() не стоит
Цитата Сообщение от schdub Посмотреть сообщение
Если программа запускается - то ее исходный код можно восстановить. Нужно всего лишь небольшие знания ассемблера и все
надо будет как нибудь также научиться
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
21.06.2011, 12:27
Если хотите узнать больше об исправлении подобных проблем - советую книгу: Howard, LeBlank "Writing Secure Code" (ISBN 5-7502-0238-0).
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
21.06.2011, 12:28  [ТС]
а такая же на русском есть?
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
21.06.2011, 12:32
Цитата Сообщение от Danvern Посмотреть сообщение
всё пойду переписывать программу...
кстати, вдогонку, подробнее почитайте назначение функций WSAStartup() и WSACleanup() - у Вас в программе неверный паттерн использования данных функций.

Добавлено через 1 минуту
Цитата Сообщение от Danvern Посмотреть сообщение
а такая же на русском есть?
Да, кажись вот она "Защищенный код 2 издание" ББК 32.973.26-018.2
1
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
21.06.2011, 13:07  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
кстати, вдогонку, подробнее почитайте назначение функций WSAStartup() и WSACleanup() - у Вас в программе неверный паттерн использования данных функций.
наверно потому что версию 1.1 инициализировал а библиотеку уже 2 версии подключал

Добавлено через 9 минут
а ещё скажите пожалуйста какими программами вы пользуетесь для дизассемблирования?
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
21.06.2011, 15:05
Цитата Сообщение от Danvern Посмотреть сообщение
а ещё скажите пожалуйста какими программами вы пользуетесь для дизассемблирования
HIEW, OllyDbg, IDA.
1
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
28.06.2011, 23:30
Для .net пойдет?
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
29.06.2011, 06:45  [ТС]
не знаю ... но сейчас эта библиотека не работоспособна так как контакт кое что изменил..
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
30.06.2011, 08:50  [ТС]
Переписал библиотеку и вот что в ней изменилось:
1: Убраны ошибки которые ведут к переполнению буфера.
2: Упрощен алгоритм получения ключа.
3: Теперь программа сама разрешает доступ к приложению.
4: Программа стала понимать русские буквы и специальные символы \n"#%+;<>&@\`№
5: Введена система ошибок.

Пример использования:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
#pragma comment(lib,"vklib.lib")
#include "vk.hpp"
 
char * er[] = {"No Errors","Close Connect","Login Failed","App Id wrong"};
int main()
{
    int res = LoginVK("danvern@mail.ru","Пароль","Айди");
    cout << er[res] << endl;
    sendVKfunc("Функция","Параметры",1,0,true);
    getchar();
    return 0;
}
Вложения
Тип файла: rar vklib2.rar (583.1 Кб, 24 просмотров)
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
30.06.2011, 11:16
Danvern, не могли бы вы аттачить Ваши dll, lib и hpp файлы отдельным архивом. Файлы libeay32.dll и ssleay32.dll установлены в каждой системе и качать их с каждым апдейтом имхо это слишком.
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
30.06.2011, 11:20  [ТС]
Окей.
Вложения
Тип файла: rar vklib2.rar (51.9 Кб, 19 просмотров)
1
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
30.06.2011, 13:18
Проблема с sendVKfunc(), а точнее в неверном использовании функции UrlEncode(). Более подробное описание в Перевод символа в Юникод.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru