|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.07.2013, 07:51 | #1 |
Новичок
Джуниор
Регистрация: 15.07.2013
Сообщений: 3
|
Назначение участка ассемблерного кода
Добрый день,
Занимаюсь изучением работы программ без исходных текстов (reverse engineering). Пока опыта немного, столкнулся с ассемблерной конструкцией, суть которой не могу уловить. Что за компилятор - неизвестно, но известно, что язык исходной программы - C/C++. Исходно в регистре ECX находится указатель на char-строку. Код ассемблерной конструкции таков: Код:
|
15.07.2013, 08:05 | #2 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
проверка третьего бита на ноль, если считать с 1.
Правильно поставленная задача - три четверти решения.
Последний раз редактировалось DiemonStar; 15.07.2013 в 08:17. |
15.07.2013, 08:56 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
|
15.07.2013, 09:48 | #4 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
для двух младших хватило бы обычного xor. А neg работает чуть иначе... ecx + neg ecx = 0
Правильно поставленная задача - три четверти решения.
|
15.07.2013, 10:00 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
А, ну да, поправка, проверка младших двух битов на единицу, хотя сами по себе последние две инструкции проверяют младшие два бита на ноль.
Последний раз редактировалось waleri; 15.07.2013 в 10:02. |
15.07.2013, 16:01 | #6 |
Новичок
Джуниор
Регистрация: 15.07.2013
Сообщений: 3
|
Технически так... Интересно кому/чему и для чего требуется этот код... Взять указатель на участок памяти, отнять его от нуля и потом еще на основе двух последних битов результата выбирать следующую ветку исполняемого кода...Интересно, кому вообще понадобилось в клиентском коде (функции самой программы) производить такую арифметику с указателями...Если бы этот код лежал в памяти ядра, я бы мог предположить, что это какая-то проверка на выравнивание адресов в памяти, хотя смысл NEG все равно остается загадкой... Может обфускация? Набор инструкций, который ничего не меняет в логике программы... Отродясь не видел, чтобы что-то с указателями выполняли, кроме вычитания, инкремента/декремента, и проверки на равенство 0...
|
15.07.2013, 16:35 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
функция memcpy() выравнивает адреса
|
15.07.2013, 20:51 | #8 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,770
|
Похоже на подготовку к сканированию или поиску подстроки из обычных символов, двигаясь сразу двойными словами. Такая техника часто используется для ускорения, поскольку доступ к 32-битным словам быстрее, чем побайтный перебор.
|
16.07.2013, 09:31 | #9 | |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
Цитата:
Код:
Правильно поставленная задача - три четверти решения.
Последний раз редактировалось DiemonStar; 16.07.2013 в 09:34. |
|
17.07.2013, 18:04 | #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 |