![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 15.07.2013
Сообщений: 3
|
![]()
Добрый день,
Занимаюсь изучением работы программ без исходных текстов (reverse engineering). Пока опыта немного, столкнулся с ассемблерной конструкцией, суть которой не могу уловить. Что за компилятор - неизвестно, но известно, что язык исходной программы - C/C++. Исходно в регистре ECX находится указатель на char-строку. Код ассемблерной конструкции таков: Код:
![]() |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]()
проверка третьего бита на ноль, если считать с 1.
Правильно поставленная задача - три четверти решения.
Последний раз редактировалось DiemonStar; 15.07.2013 в 08:17. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]() |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]()
для двух младших хватило бы обычного xor. А neg работает чуть иначе... ecx + neg ecx = 0
Правильно поставленная задача - три четверти решения.
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
А, ну да, поправка, проверка младших двух битов на единицу, хотя сами по себе последние две инструкции проверяют младшие два бита на ноль.
Последний раз редактировалось waleri; 15.07.2013 в 10:02. |
![]() |
![]() |
![]() |
#6 |
Новичок
Джуниор
Регистрация: 15.07.2013
Сообщений: 3
|
![]()
Технически так... Интересно кому/чему и для чего требуется этот код... Взять указатель на участок памяти, отнять его от нуля и потом еще на основе двух последних битов результата выбирать следующую ветку исполняемого кода...Интересно, кому вообще понадобилось в клиентском коде (функции самой программы) производить такую арифметику с указателями...Если бы этот код лежал в памяти ядра, я бы мог предположить, что это какая-то проверка на выравнивание адресов в памяти, хотя смысл NEG все равно остается загадкой... Может обфускация? Набор инструкций, который ничего не меняет в логике программы... Отродясь не видел, чтобы что-то с указателями выполняли, кроме вычитания, инкремента/декремента, и проверки на равенство 0...
![]() |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
функция memcpy() выравнивает адреса
|
![]() |
![]() |
![]() |
#8 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]()
Похоже на подготовку к сканированию или поиску подстроки из обычных символов, двигаясь сразу двойными словами. Такая техника часто используется для ускорения, поскольку доступ к 32-битным словам быстрее, чем побайтный перебор.
В разработке: воспроизводственный контур ИТ
|
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]() Цитата:
Код:
Правильно поставленная задача - три четверти решения.
Последний раз редактировалось DiemonStar; 16.07.2013 в 09:34. |
|
![]() |
![]() |
![]() |
#10 | |
Новичок
Джуниор
Регистрация: 15.07.2013
Сообщений: 3
|
![]() Цитата:
![]() Если кому-то любопытно, код дизассемблированной процедуры во вложенном текстовом файле. Благодарю за помощь ![]() |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выполнение участка кода без ожидания ввода | БалаШагаЛ | Общие вопросы C/C++ | 5 | 09.06.2011 12:17 |
Преобразование ассемблерного кода в опкоды | kaledonia007 | Компоненты Delphi | 4 | 26.03.2011 23:48 |
Вычислить количество символов участка кода на интернет странице | Shinnok91 | Общие вопросы Delphi | 20 | 23.03.2011 09:06 |
Вызов события из произвольного участка кода в WPF | Casper-SC | Общие вопросы .NET | 1 | 24.07.2010 10:23 |