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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2015, 20:43   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию Работа с памятью

Всем привет. Есть задача - зашифровать исполняемый код после его выполнения.

Как я делаю ...

объявляю 2 переменных, и между ними указываю код, который необходимо зашифровать после выполнения ...

Код:
int val1;
int val2;
Но для проверки вообще того, что я делаю, решил указать 2 переменные подряд и определить их адреса ...

Код:
ShowMessage(IntToHex(val1, 8));
ShowMessage(IntToHex(val2, 8));
И вот, что я получаю ...
Цитата:
5005F831
0018FF78
Или я адреса определяю неверно, или вообще что я делаю - полнейший бред ...
-Jack- вне форума Ответить с цитированием
Старый 29.08.2015, 20:57   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Конечно бред - где у вас операция получения адреса?


ShowMessage(IntToHex(&val1, 8));
waleri вне форума Ответить с цитированием
Старый 29.08.2015, 23:28   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

С этим моментом разобрался, спасибо ...


Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int i = 0;
	while (i<5){

		int va=0;
		i=i+1;
		int vad=0;

		Memo1->Lines->Add("i = "+IntToStr(i));

		crypt(System::PByte(&vad), System::PByte(&va));
	}

}
Код:
procedure crypt(from_addr: PByte; to_addr:PByte);
var
  dwOldProtect: DWORD;
begin

  VirtualProtect(from_addr, 1024, PAGE_EXECUTE_READWRITE, @dwOldProtect);

  while from_addr <> to_addr do
  begin
    from_addr^:=from_addr^ xor $41;
    inc(from_addr);
  end;

end;
В итоге в мемо у меня выводится результат всего цикла, хотя я надеялся, что вылетит ошибка ...
Цитата:
i = 1
i = 2
i = 3
i = 4
i = 5
Кто может подсказать, в чем дело ? )
-Jack- вне форума Ответить с цитированием
Старый 30.08.2015, 00:55   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А почему должна быть ошибка?

И кстати, системные вызовы неплохо проверять на предмет ошибок.
waleri вне форума Ответить с цитированием
Старый 30.08.2015, 01:28   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

-Jack-, посмотрите как выглядит код в дизассемблере и станет все понятно. Так можно только зашифровать данные в стеке, но никак не код. К тому же, вполне возможно, что оптимизатор может менять последовательность переменных в стеке.

Код C++ Builder 6:

Код:
void tempFunc(){
        int i = 0;
	while (i<5){
		int va=0;
		i=i+1;
		int vad=0;
	}
}
Код на asm:

Код:
//  [EBP-4]  -  int i
//  [EBP-8]  -  int va
//  [EBP-C]  -  int vad
 
00401D84 > 55               PUSH EBP
00401D85   8BEC             MOV EBP,ESP
00401D87   83C4 F4          ADD ESP,-0C
00401D8A   33C0             XOR EAX,EAX                    //  int i = 0; (часть 1)
00401D8C   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX   //  int i = 0; (часть 2)
00401D8F   33D2             XOR EDX,EDX                    //  int va=0; (часть 1)
00401D91   8955 F8          MOV DWORD PTR SS:[EBP-8],EDX   //  int va=0; (часть 2)
00401D94   FF45 FC          INC DWORD PTR SS:[EBP-4]       //  i=i+1;
00401D97   33C9             XOR ECX,ECX                    //  int vad=0; (часть 1)
00401D99   894D F4          MOV DWORD PTR SS:[EBP-C],ECX   //  int vad=0; (часть 2)
00401D9C   837D FC 05       CMP DWORD PTR SS:[EBP-4],5     //  while(i<5) goto 0x401D8F; (часть 1)
00401DA0  ^7C ED            JL SHORT Project1.00401D8F     //  while(i<5) goto 0x401D8F; (часть 2)
00401DA2   8BE5             MOV ESP,EBP
00401DA4   5D               POP EBP
00401DA5   C3               RETN
Цитата:
Сообщение от -Jack- Посмотреть сообщение
Код:
procedure crypt(from_addr: PByte; to_addr:PByte);
var
  dwOldProtect: DWORD;
begin

  VirtualProtect(from_addr, 1024, PAGE_EXECUTE_READWRITE, @dwOldProtect);

  while from_addr <> to_addr do
  begin
    from_addr^:=from_addr^ xor $41;
    inc(from_addr);
  end;

end;


void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int i = 0;
	while (i<5){
		int va=0;
		i=i+1;
		int vad=0;
		Memo1->Lines->Add("i = "+IntToStr(i));
		crypt(System::PByte(&vad), System::PByte(&va));
	}
}
А какой это язык программирования? Гибрид C++ и Pascal?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 30.08.2015 в 01:35.
Krasiosoft вне форума Ответить с цитированием
Старый 30.08.2015, 01:37   #6
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
-Jack-, посмотрите как выглядит код в дизассемблере и станет все понятно. Так можно только зашифровать данные в стеке, но никак не код. К тому же, вполне возможно, что оптимизатор может менять последовательность переменных в стеке.
А можно по подробней про "данные в стеке", или где об этом узнать можно по подробней ?


Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
А какой это язык программирования? Гибрид C++ и Pascal?
Ну да, сама процедура написана на паскале,а всё остальное на С++

Последний раз редактировалось -Jack-; 30.08.2015 в 01:40.
-Jack- вне форума Ответить с цитированием
Старый 30.08.2015, 01:43   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от -Jack- Посмотреть сообщение
А можно по подробней про "данные в стеке", или где об этом узнать можно по подробней ?
Объявленные переменные в теле функции хранятся в стеке, и если брать адрес таких переменных, то получите адрес на стек, где хранится в нем эта переменная.

Цитата:
Сообщение от -Jack- Посмотреть сообщение
Ну да, сама процедура написана на паскале,а всё остальное на С++
Никогда подобного не встречал, это в какой среде разработки такое можно сделать?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 30.08.2015 в 01:47.
Krasiosoft вне форума Ответить с цитированием
Старый 30.08.2015, 01:47   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Полагаю для указателей надо нужно использовать константы. Задали константам dummy-значения, скомпилировали программу, посмотрели по какому адресу получился нужный код, поменяли значения констант на нужные в каком-нить hex-редакторе. Ну или как-то извне их получать, в виде ключа программы.
Но я не работал с подобным, подозреваю может не быть доступа к этим адресам runtime, не?
ResourceSpace вне форума Ответить с цитированием
Старый 30.08.2015, 01:52   #9
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Объявленные переменные в теле функции хранятся в стеке, и если брать адрес таких переменных, то получите адрес на стек, где хранится в нем эта переменная.
А каким способом можно тогда зашифровать исполняемый код в функции ?

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Никогда подобного не встречал, это в какой среде разработки такое можно сделать?
Не помню, с какой версии это стало возможным, но в XE7 точно такое можно вытворять )
-Jack- вне форума Ответить с цитированием
Старый 30.08.2015, 01:58   #10
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от -Jack- Посмотреть сообщение
А каким способом можно тогда зашифровать исполняемый код в функции ?
Никогда подобного не делал, но через переменные это не получиться сделать. В C++ есть label и goto, но как взять адрес label, не знаю, а так бы это был отличный вариант.


Цитата:
Сообщение от -Jack- Посмотреть сообщение
Не помню, с какой версии это стало возможным, но в XE7 точно такое можно вытворять )
Ааа, ясно)) просто у меня все еще старенькие Delphi 7 и C++ Builder 6.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с памятью в С++ Пaвeл Общие вопросы C/C++ 24 14.10.2013 09:31
Работа с памятью mufesto Win Api 1 30.01.2012 15:13
работа с памятью Mr_ViK Win Api 13 16.01.2012 01:53
Работа с памятью. nazavrik Общие вопросы C/C++ 0 07.10.2009 23:17
Работа с памятью Shurik Hacker Общие вопросы Delphi 7 22.06.2007 20:51