Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает декремент и xor, Не работает декремент и xor 
V
    Опции темы
StillPhelix
Дата 27.1.2016, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не работает декремент и xor. Коппилируется нормально. Не ребочие строки откоментированны. Исходник ниже. 
Код

#include <Windows.h>
#include <cstdlib>
#include <stdio.h>
#include <time.h>
#include <iso646.h>

using std::srand;
using std::rand;

int main()
{
    printf("CrackMe 09 \n");
    PHKEY hKey;
    DWORD res;
    DWORD TYPE;        
    DWORD Count1;
    DWORD Count2;

    if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, &res)!=ERROR_SUCCESS)
        return 0;
    if(res==REG_CREATED_NEW_KEY)
    {
        srand((unsigned)time(0));
        Count1=(unsigned)rand();
        Count2=0x100^Count1;
        RegSetValueEx(*hKey, "Count1", 0, REG_DWORD, (CONST BYTE *) &Count1, 4);
        RegSetValueEx(*hKey, "Count2", 0, REG_DWORD, (CONST BYTE *) &Count2, 4);
        printf("Base count have saved! \n");
    } 
    else
    {
        res = 4;
        RegQueryValueEx(*hKey, "Count1", 0, &TYPE, (LPBYTE)&Count1, &res);
        RegQueryValueEx(*hKey, "Count1", 0, &TYPE, (LPBYTE)&Count2, &res);

        Count2 = Count2^Count1;//тут не работает
        Count2--;//тут не работает
        printf("Count  %x \n",Count2);
        if (!Count2) return 0;

        srand((unsigned)time(0));
        Count1 = (unsigned)rand();
        Count2 = Count2^Count1;

        RegSetValueEx(*hKey, "Count1", 0, REG_DWORD, (CONST BYTE *) &Count1, 4);
        RegSetValueEx(*hKey, "Count2", 0, REG_DWORD, (CONST BYTE *) &Count2, 4);
    }
    RegCloseKey(*hKey);
    return 0;
}


Это сообщение отредактировал(а) StillPhelix - 27.1.2016, 19:52
PM MAIL   Вверх
StillPhelix
Дата 27.1.2016, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

else
    {
        res = 4;
        RegQueryValueEx(*hKey, "Count1", 0, &TYPE, (LPBYTE)&Count1, &res);
        RegQueryValueEx(*hKey, "Count1", 0, &TYPE, (LPBYTE)&Count2, &res);//Count1 исправить на Count2


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Это как так? Память под указатель не выделена, hKey указывает неизвестно куда...
Цитата(StillPhelix @  27.1.2016,  19:46 Найти цитируемый пост)
    PHKEY hKey;
    ...
    if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, &res)!=ERROR_SUCCESS)
        return 0;


Добавлено через 1 минуту и 52 секунды
Должно быть:
Код
HKEY hKey = NULL;
...
if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, &res)!=ERROR_SUCCESS)
        return 0;
Соответственно, никаких *hKey, просто hKey.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
StillPhelix
Дата 28.1.2016, 01:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @  27.1.2016,  20:47 Найти цитируемый пост)
Это как так? Память под указатель не выделена, hKey указывает неизвестно куда...

прямая цитата из MSDN:
PHKEY
 Pointer to an HKEY. 
This type is declared in WinDef.h as follows:
typedef HANDLE *PHANDLE;

Цитата(feodorv @  27.1.2016,  20:47 Найти цитируемый пост)
Соответственно, никаких *hKey, просто hKey. 

Нет. Прямая цитата из MSDN:
inline LSTATUS CAtlTransactionManager::RegCreateKeyEx(
     HKEY hKey,
     LPCTSTR lpSubKey,
     DWORD dwReserved,
     LPTSTR lpClass,
     DWORD dwOptions,
     REGSAM samDesired,
     CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
     PHKEY phkResult,
     LPDWORD lpdwDisposition
  );

Проблема уже решена; смотри мой второй пост. Компилятор - visual studio 2010. Это чистый C++. Ваши правки подойдут только для MFC C++ и в этом случае не канают.


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(StillPhelix @  28.1.2016,  01:14 Найти цитируемый пост)
Проблема уже решена

Это я понял.


Цитата(StillPhelix @  28.1.2016,  01:14 Найти цитируемый пост)
Ваши правки подойдут только для MFC C++ и в этом случае не канают.

Это глупость.


Цитата(StillPhelix @  28.1.2016,  01:14 Найти цитируемый пост)
Нет.

Дело, конечно, Ваше, но когда программа рухнет, не жалуйтесь.


PS Вы бы хоть примеры посмотрели, что ли.
Цитата
    HKEY hkSub = NULL;
    ...
lRes = RegCreateKeyEx(HKEY_CURRENT_USER, _T("mykey"), 0, _T(""), 0, 
            KEY_READ | KEY_WRITE, &sa, &hkSub, &dwDisposition); 

Вызов RegCreateKeyEx заносит результат по адресу phkResult, то есть по этому адресу обязана располагаться доступная память. Прямая цитата из MSDN:
Цитата
A pointer to a variable that receives a handle to the opened or created key.
Указатель у Вас есть, но переменной, на которую он указывает, у Вас нет. Почему для lpdwDisposition вы пишете:
Цитата(StillPhelix @  27.1.2016,  19:46 Найти цитируемый пост)
    DWORD res;
    if (RegCreateKeyEx( ..., &res)!=ERROR_SUCCESS)
а для hKey так не делаете?



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
StillPhelix
Дата 28.1.2016, 12:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @  28.1.2016,  03:59 Найти цитируемый пост)
Это глупость.

MFC C++ не вызавает API. Вместо этого она обращается к библиотеке MFC, а та в свою очередь вызывает этот API.  Чистый C++ вызывает API на прямую. Если не верите, то дизассемблируйте две программы, с соответствующими вызовами (на С++ и MFC C++). Все проекты MFC в 2 раза больше по размеру, чем проекты С++. И в visual studio они создаються разными путями. 

Цитата(feodorv @  28.1.2016,  03:59 Найти цитируемый пост)
а для hKey так не делаете?

Переменная, содержащая адрес (hKey) и сам адрес - это две разные вещи. Поэтому, *hKey даст функции значение самой переменной, адрес которой храниться в hKey. Что и нужно данной API. Такой её прототип. Если вас интересует как работать с указателями, то прочитайте об этом, например в этой книге : Харви М. Дейтел, Пол Дж. Дейтел Как программировать на C++ (2008).
Вобщем, &res - это адрес. А hKey, переменная, содержащая адрес.
Поэтому программа не рухнет. С точки зрения С++ и компилятора С++ она написана правильно.

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


Бывалый
*


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

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



Раз уж Вы так рьяно рассказываете про С++ и советуете читать книги (при этом не самые удачные, ИМХО), то feodorv Вас совершенно правильно ткнул носом в тот факт, что указатель hKey у Вас есть, но вот на что он указывает никому не известно. По стандарту С++ указатели не инициализируются значениями по умолчанию. Таким образом, в один "прекрасный" момент, ваш hKey будет указывать на какой-нибудь участок памяти, который, при записи в него из Вашей программы, сможет вызвать серьезную ошибку в работе ОС. Так что прежде чем грубить, попытайтесь понять, что до Вас хотят донести  smile 
PM MAIL   Вверх
xvr
Дата 28.1.2016, 14:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



2 ТС - очень рекомендуется почитать буквари (можно те, что сами тут и упоминули) прежде чем нести ахинею прикрываясь красивыми словами про MFC/API/C++/прототипы

PM MAIL   Вверх
StillPhelix
Дата 28.1.2016, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



baldman88, 
xvr,
Код

 if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, &res)!=ERROR_SUCCESS)
 
В этой строке инициализируется дескриптор. smile  smile  smile 
PM MAIL   Вверх
xvr
Дата 28.1.2016, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(StillPhelix @ 28.1.2016,  16:35)
Код

 if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, &res)!=ERROR_SUCCESS)
 
В этой строке инициализируется дескриптор. smile  smile  smile

В этой строке вызов RegCreateKeyEx запишет по указателю hKey ваш дескриптор. Так как этот указатель никто не инициализировал, то и попадет он неизвестно куда. Вам повезло, что там оказалась память и она ни с кем не пересеклась.

Напишите в строке 13 ( PHKEY hKey;) так -
Код

    PHKEY hKey = NULL;
и вы сами все наглядно увидите (если уж чужим словам не верите  smile  )

PM MAIL   Вверх
StillPhelix
Дата 28.1.2016, 19:36 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @  28.1.2016,  18:00 Найти цитируемый пост)
и вы сами все наглядно увидите (если уж чужим словам не верите  smile  )

Код

PHKEY hKey

это значит, что компилятор выделяет переменной hKey память и адрес.
А код
Код

 if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, &res)!=ERROR_SUCCESS)

её и так инициализирует. Адрес-то этой переменной функции известен. Памать под переменную выделена. Поэтому обнулять эту переменную смысла никакого нет. Это же не счётчик. 
Современный оптимизирующий копилятор из кода
Код

PHKEY hKey = NULL

 = NULL скорее всего выбросит.
Я эту программу прогонял не только через отладчик (visual studio и winDbg), но и дизассемблер. Код полностью работоспособен. Можете проверить сами.
PM MAIL   Вверх
baldman88
Дата 28.1.2016, 19:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я только сейчас понял, что эта функция делает. Видимо внутри она делает что-то вроде:
Код

hKey = new HKEY(...);

Мда. Такое уродливое API еще поискать нужно. Надеюсь никогда не доведется с ним иметь дело.
PM MAIL   Вверх
StillPhelix
Дата 28.1.2016, 21:05 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если коротко, то в SDK от Microsoft, сказано следующее. RegCreateKeyEx передаёт адрес дескриптора созданного ключа в переменную, адрес которой храниться в указателе типа PHKEY ( это hKey). А PHKEY, в свою очередь, указывает на HKEY. RegQueryValueEx, RegSetValueEx и RegSetValueEx требуют значение дескриптора. Сам дескриптор - показывает на нужный объект. Для этого указатель hKey нужно разыменовать. Поэтому пишем: *hKey.
PM MAIL   Вверх
feodorv
Дата 28.1.2016, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(StillPhelix @  28.1.2016,  21:05 Найти цитируемый пост)
Если коротко, то в SDK от Microsoft, сказано следующее. RegCreateKeyEx передаёт адрес дескриптора созданного ключа в переменную, адрес которой храниться в указателе типа PHKEY ( это hKey). А PHKEY, в свою очередь, указывает на HKEY. RegQueryValueEx, RegSetValueEx и RegSetValueEx требуют значение дескриптора. Сам дескриптор - показывает на нужный объект. Для этого указатель hKey нужно разыменовать. Поэтому пишем: *hKey. 

В логике Вам не окажешь. Осталось только понять, где именно в коде
Цитата(StillPhelix @  27.1.2016,  19:46 Найти цитируемый пост)
    PHKEY hKey;
    ...
    if (RegCreateKeyEx( ..., hKey, &res)!=ERROR_SUCCESS) return 0;
Вы передаёте в функцию RegCreateKeyEx адрес переменной, в которую будет помещён дескриптор (не адрес дескриптора, конечно) созданного или открытого ключа. Адрес Вы передаёте, не спорю, но адрес чего???


Цитата(StillPhelix @  28.1.2016,  19:36 Найти цитируемый пост)
PHKEY hKey

это значит, что компилятор выделяет переменной hKey память и адрес.
Это значит, что определяется переменная типа "указатель на HKEY", и... всё. Более ничего. Переменная даже не инициализируется. Компилятор автоматом создавать память, на которую указывает hKey, не будет. Разименовывать такой указатель категорически нельзя.


Цитата(StillPhelix @  28.1.2016,  19:36 Найти цитируемый пост)
А код
    
 if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\crack09", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, &res)!=ERROR_SUCCESS)

её и так инициализирует. Адрес-то этой переменной функции известен.
Данный код никоим образом не может проинициализировать переменную hKey, то есть присвоить ей какой-либо адрес типа PHKEY. Но может по адресу, который хранится в hKey, записать какое-либо значение типа HKEY (что не есть инициализация hKey). Поскольку адрес, хранящийся в переменной hKey, мусорный (hKey-то не инициализирована), то и запись возвращаемого функцией RegCreateKeyEx значения типа HKEY произойдёт по мусорному адресу. И адрес какой именно переменной известен функции RegCreateKeyEx? 


Цитата(StillPhelix @  28.1.2016,  19:36 Найти цитируемый пост)
Современный оптимизирующий копилятор

Современный компилятор на подобные конструкции выдаёт предупреждение об использовании переменной hKey без инициализации. У Вас такое предупреждение есть?

Добавлено через 2 минуты и 9 секунд
Цитата(baldman88 @  28.1.2016,  19:53 Найти цитируемый пост)
Такое уродливое API еще поискать нужно.

Зря Вы так. Тогда и fopen тоже уродлив. Что же не уродливо?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldman88
Дата 29.1.2016, 00:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(feodorv @ 28.1.2016,  22:13)
Цитата(baldman88 @  28.1.2016,  19:53 Найти цитируемый пост)
Такое уродливое API еще поискать нужно.

Зря Вы так. Тогда и fopen тоже уродлив. Что же не уродливо?

Про fopen не соглашусь, там все интуитивно понятно. Передаем имя файла и режим в котором хотим открыть файл. В случае успеха получаем адрес, а в случае неудачи -- NULL. Здесь же 100500 параметров, да еще и непонятно что передавать. То ли нужно передать указатель на уже выделенную память, то ли просто указатель, в который будет занесен адрес памяти, которая будет выделена в функции.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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