Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Безопасность, Шифрование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2015, 20:49   #1
xqr
 
Регистрация: 22.05.2012
Сообщений: 8
Восклицание расшифрование кода во время исполнения

Доброго времени суток. Имеется следующий код:

Код:
void decrypt()
{
	HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,TRUE,GetCurrentProcessId());
	BYTE buffer[19];
	UINT* memaddr = (UINT*)0x00411648;
	ReadProcessMemory(hProc, (PBYTE*)memaddr, buffer, sizeof(buffer), NULL);
	for (int i = 0; i < 19; i++)
	{
		buffer[i] ^= 1;
	}
	WriteProcessMemory(hProc, (PBYTE*)memaddr, &buffer, sizeof(buffer), NULL);
}
С помощью OllyDbg узнаю memaddr и размер буфера, необходимый для зашифровки участка кода начинаемого с адреса memaddr. ReadProcessMemory и WriteProcessMemory возвращают 0. Что я сделал не так?

Последний раз редактировалось Stilet; 10.05.2015 в 21:01.
xqr вне форума Ответить с цитированием
Старый 10.05.2015, 21:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Что я сделал не так?
Все. Начиная с адреса, который вообще-то неверный (а его нужно получать согласно адресу процесса, т.е. куда его винда посадила) и заканчивая доступом на запись в секцию кода.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.05.2015, 21:50   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

И еще - читаете в buffer а пишете - &buffer
waleri вне форума Ответить с цитированием
Старый 10.05.2015, 21:54   #4
xqr
 
Регистрация: 22.05.2012
Сообщений: 8
По умолчанию

Каким образом возможно исправить?
xqr вне форума Ответить с цитированием
Старый 10.05.2015, 21:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А, кстати. Еще одна ошибка: Функции WinAPI возвращают результат. Твоя программа их не обрабатывает (результат в смысле), а стоило бы. Стоило бы получать код ошибки с помошью GetLastError() чтоб знать какая функция и в чем затык.
Цитата:
Каким образом возможно исправить?
Да я боюсь что винда так просто тебе это не позволит... Есть конечно функции, которые дают разрешение на запись в заблокированную память, но безопасность винды... Не думаю что это будет однозначно работать везде.
Да и зачем делать такое? Смысл сего криптования?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.05.2015, 21:58   #6
xqr
 
Регистрация: 22.05.2012
Сообщений: 8
По умолчанию

понял, спасибо. я хотел таким образом скрыть функцию, проводящую аутенфикацию.
xqr вне форума Ответить с цитированием
Старый 11.05.2015, 06:50   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Это слабая защита. Так поступают пакеры, но криптуют посерьезнее. Тем не менее после раскриптовки функция как на ладони, и если иметь терпение можно и ее тело получить.
Вообще смотря что за аутентификация и для чего все же можно написать защиту попроще и поэффективнее. Но не криптованием части кода.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 16:58   #8
xqr
 
Регистрация: 22.05.2012
Сообщений: 8
По умолчанию

можешь что-нибудь посоветовать?
xqr вне форума Ответить с цитированием
Старый 11.05.2015, 17:00   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Посоветовать в плане защиты?
Расскажи тогда что и от чего защищаешь. Есть ли доступ к сети. Какие затраты на защиту планируются. Ну короче подробности. Иначе любой протектор бери и не парься сочинениями )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2015, 19:40   #10
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Ваще не понял че ты делаешь. Если ты расшифровываешь функцию, то ее адрес можно получать через &, например: &Func где Func какая-то функция. В OllyDbg ты получишь адрес в памяти процесса ( а.л.я ImageBase + VirtualAddress ), в VisualStudio по умолчанию ImageBase рандомный при каждой новой загрузке модуля твоего приложения в память, аля ASLR.

Что ты неправильно делаешь? А начать с того, что только... ладно, лучше промолчу:

HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,TRUE,GetCurrentProc essId());

Замени на HANDLE hProc = GetCurrentProcess(); или HANDLE hProc = (HANDLE)-1;

Про остальное вроде-бы сказали.

P.S.

buffer[i] ^= 1;

эммм, xor'ить с ключем 1, как бэ нэт смысла, мэн.

ReadProcessMemory...WriteProcessMem ory... facepalm

*(LPBYTE)((DWORD)&Buffer[0] + i) ^= 10;

Если на то пошло, то че за пи...

Короче:
BYTE buffer[19];
ReadProcessMemory(GetCurrentProcess (), (LPVOID)0x00411648, buffer, sizeof(buffer), 0);

Но так делать нельзя.

Твой код можно переписать в три строчки кода.

Конец.

P.S. Не забудь, что код имеет атрибуты доступа PAGE_EXECUTE_READ, а тебе надо с помощью VirtualProtect сделать PAGE_EXECUTE_READWRITE, а то вылетит эксепшн. Если ты, конечно, расшифровываешь все-таки функцию, а не что-то другое, в .data секции, вредоносное =))

Цитата:
можешь что-нибудь посоветовать?
Самодельная LoadLibrary функция, которая грузит dll'ку в твою память из твоей памяти в .data секции, настраивает релоки, заполняет таблицу импорта. Далее вызывает DllMain, который возвращает результат аутентификации. Если аутентификация - это банальная проверка ключа по алгоритму, не вызывающего функции, то на релоки и таблицу импорта можешь забить. Единственное что, что к переменным получай доступ через дельта смещение:
Код:
call	delta
delta:
pop	ebp
sub	ebp, delta
Потом тупо ebp + адрес переменной, и получишь значение из нее независимо от адреса, по которому тебя прогрузили. Или заполняй релоки. И придумай, как будешь возвращать значение. Думаю запрячешь. Dll'ку в памяти храни пошифрованную, твой LoadLibrary будет ее расшифровывать. Для запутывания реверсеров можешь перехватить легальную LoadLibraryA из kernel32.dll на свою. И вызывать тогда LoadLibraryA из kernel32.dll, будет вызываться твоя. Можешь сделать проще, и грузить dll, зашифрованную, с диска. Установив перехват, перехватить не сложно. В памяти меняешь в IAT адрес LoadLibraryA и готово. Или пиши E9 00 00 00 00 в начало функции перехватываемой, где нули - адрес перехватчика, который вычисляется по формуле из этой статьи: http://habrahabr.ru/post/90377/ ( читай, по памяти не помню )

Ну и все, вангую удивление реверсера, который при попытки дизассемблировать подгружаемую dll получит сообщение о невалидности файла, однако LoadLibraryA из kernel32.dll будет успешно ее грузить, он подумает - магия. Ведь по его мнению, никаких манипуляций с dll'кой не происходит

Но проблема, что с таким кодом ты вряд ли реализуешь выше-сказанное.

Всем мир, слава роботом, истребить всех человеков, ура!

Последний раз редактировалось Malriser; 12.05.2015 в 19:56.
Malriser вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как добавить время исполнения операций в моём коде ? ion leahu Помощь студентам 11 28.11.2014 17:19
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
Создание во время исполнения xakkkkker Общие вопросы Delphi 0 20.05.2010 17:46
Алгоритм АЕS шифрование, расшифрование max38934 Win Api 11 27.05.2009 22:42
С++ Builder Изменение размеров компонентов на форме во время исполнения программы Bair C++ Builder 3 18.12.2008 13:43