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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2013, 07:51   #1
Schmidt
Новичок
Джуниор
 
Регистрация: 15.07.2013
Сообщений: 3
Вопрос Назначение участка ассемблерного кода

Добрый день,

Занимаюсь изучением работы программ без исходных текстов (reverse engineering). Пока опыта немного, столкнулся с ассемблерной конструкцией, суть которой не могу уловить. Что за компилятор - неизвестно, но известно, что язык исходной программы - C/C++. Исходно в регистре ECX находится указатель на char-строку. Код ассемблерной конструкции таков:

Код:
.text:00405324                 neg     ecx
.text:00405326                 and     ecx, 3
.text:00405329                 jz      short loc_405337
Сломал себе голову, исчеркав кучу бумаги...Что же проверяется на этом участке?
Schmidt вне форума Ответить с цитированием
Старый 15.07.2013, 08:05   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

проверка третьего бита на ноль, если считать с 1.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 15.07.2013 в 08:17.
DiemonStar вне форума Ответить с цитированием
Старый 15.07.2013, 08:56   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
проверка третьего бита на ноль, если считать с 1.
А может проверка младших двух битов на ноль?
Кратность четырем, не?
waleri вне форума Ответить с цитированием
Старый 15.07.2013, 09:48   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

для двух младших хватило бы обычного xor. А neg работает чуть иначе... ecx + neg ecx = 0
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 15.07.2013, 10:00   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А, ну да, поправка, проверка младших двух битов на единицу, хотя сами по себе последние две инструкции проверяют младшие два бита на ноль.

Последний раз редактировалось waleri; 15.07.2013 в 10:02.
waleri вне форума Ответить с цитированием
Старый 15.07.2013, 16:01   #6
Schmidt
Новичок
Джуниор
 
Регистрация: 15.07.2013
Сообщений: 3
По умолчанию

Технически так... Интересно кому/чему и для чего требуется этот код... Взять указатель на участок памяти, отнять его от нуля и потом еще на основе двух последних битов результата выбирать следующую ветку исполняемого кода...Интересно, кому вообще понадобилось в клиентском коде (функции самой программы) производить такую арифметику с указателями...Если бы этот код лежал в памяти ядра, я бы мог предположить, что это какая-то проверка на выравнивание адресов в памяти, хотя смысл NEG все равно остается загадкой... Может обфускация? Набор инструкций, который ничего не меняет в логике программы... Отродясь не видел, чтобы что-то с указателями выполняли, кроме вычитания, инкремента/декремента, и проверки на равенство 0...
Schmidt вне форума Ответить с цитированием
Старый 15.07.2013, 16:35   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

функция memcpy() выравнивает адреса
waleri вне форума Ответить с цитированием
Старый 15.07.2013, 20:51   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Похоже на подготовку к сканированию или поиску подстроки из обычных символов, двигаясь сразу двойными словами. Такая техника часто используется для ускорения, поскольку доступ к 32-битным словам быстрее, чем побайтный перебор.
Vapaamies вне форума Ответить с цитированием
Старый 16.07.2013, 09:31   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Интересно, кому вообще понадобилось в клиентском коде (функции самой программы) производить такую арифметику с указателями...Если бы этот код лежал в памяти ядра, я бы мог предположить, что это какая-то проверка на выравнивание адресов в памяти, хотя смысл NEG все равно остается загадкой..
вообще-то проверить адрес на содержание x...xxxx100b не так и просто одной операцией. еще один вариант такой проверки выглядит так:
Код:
and ecx,7
xor ecx, 4  (или cmp ecx, 4)
jz short loc_405337
но первый вариант будет и короче (в байтах исполняемого кода) и немного быстрее
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 16.07.2013 в 09:34.
DiemonStar вне форума Ответить с цитированием
Старый 17.07.2013, 18:04   #10
Schmidt
Новичок
Джуниор
 
Регистрация: 15.07.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Похоже на подготовку к сканированию или поиску подстроки из обычных символов, двигаясь сразу двойными словами. Такая техника часто используется для ускорения, поскольку доступ к 32-битным словам быстрее, чем побайтный перебор.
Да, вы правы, это оно! Процедура, содержащая данный код заполняет память по указателю ASCII-символом, повторяя его определенное количество раз. Данный код проверяет, нужно ли выровнять указатель по двойному слову, вычисляя остаток до следующего 0xHHHHHH00 адреса. Если остаток не 0, то код выравнивает указатель внутри буфера, записывая нужное количество байт.

Если кому-то любопытно, код дизассемблированной процедуры во вложенном текстовом файле. Благодарю за помощь
Вложения
Тип файла: txt fillBufferWithCharacter.txt (4.1 Кб, 122 просмотров)
Schmidt вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение участка кода без ожидания ввода БалаШагаЛ Общие вопросы 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