Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Как программно узнать Динамическое значение

-

Вопросы и ответы, обсуждения

- Ваши вопросы по ASM/WinAPI только в данном разделе

Ответ
 
Опции темы
Старый 24.02.2015, 01:06   #1
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
Question Как программно узнать Динамическое значение

Есть вот такой код:

Код:
004A02DC - call dword ptr [ArenaOnline3D._imp___invalid_parameter_noinfo]
004A02E2 - mov edx,[esi+000001A8]
004A02E8 - mov edi,[edx+ebx*4]
004A02EB - sub esp,1C
004A02EE - mov ecx,esp
Проблема заключается в 004A02E8 - mov edi,[edx+ebx*4]. Значение данной ebx может измениться от 0..9 A..F * 4

Цепочка оффсета вот такая BA+1A8+??*4+1BC

Как программно узнать чему будет равно ebx?
Пишу на delphi XE7.

Ой извините не туда добавил тему (не сразу заметил)

Последний раз редактировалось Foreworld; 24.02.2015 в 01:09.
  Ответить с цитированием
Старый 25.02.2015, 20:57   #2
 Разведчик
Аватар для Paladin
 
Paladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слуху
Регистрация: 13.08.2009
Сообщений: 0
Популярность: 1303
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для Paladin с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Выделяй кусок памяти, ставь туда прыжок и сохраняй значение.

То есть, вместо mov edi,[edx+ebx*4] подставь jmp на выделенную память. А в памяти:

Код:
mov [адрес куда сохранить значение ebx], ebx
mov edi,[edx+ebx*4]
jmp назад
В выделенном куске памяти ты сохраняешь себе значение регистра ebx (в свою переменную или куда там тебе надо), чуть ниже выполняешь инструкцию, которую ты подменил инструкцией прыжка, а потом прыгаешь назад на следующую инструкцию

Добавлено через 21 минуту
Ты внедряешь в адресное пространство DLL или работаешь через Read\WriteProcessMemory?

Последний раз редактировалось Paladin; 25.02.2015 в 21:19. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 25.02.2015, 23:25   #3
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

Работаю через Read...
Читаю вот таким способом:

Код:
ReadProcessMemory (hProcess, Pointer(BA), @addr, sizeof(addr), NoB);
ReadProcessMemory (hProcess, Pointer(addr+$1A8), @game_addr, sizeof(game_addr), NoB);
ReadProcessMemory (hProcess, Pointer(game_addr+(i*$4)), @WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP+$1B4), @WHP, sizeof(WHP), NoB); //Читаем значение HP
И вот понятие не имею как с i поступить.

Новичок, даже пытался Olly рассмотреть какая команда заносит значение в стек. Но... еще туп, но и забрасывать я это не собираюсь ибо мне это очень интересно.

Добавлено через 15 минут
кстати ты имеешь ввиду сделать inject? насильно вставить в edi любое значение???

Последний раз редактировалось Foreworld; 25.02.2015 в 23:40. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.02.2015, 00:17   #4
 Разведчик
Аватар для Paladin
 
Paladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слуху
Регистрация: 13.08.2009
Сообщений: 0
Популярность: 1303
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для Paladin с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
Сообщение от ForeworldПосмотреть сообщение
кстати ты имеешь ввиду сделать inject? насильно вставить в edi любое значение???

Я имею ввиду модифицировать оригинальный код, воткнуть между asm инструкциями сохранение значения регистра.

1) Выделяешь кусочек памяти через VirtualAllocEx в чужом процессе;
2) Пишешь в выделенную память инструкцию:
Код:
mov [адрес куда сохранить значение], ebx
3) Чуть ниже вписываешь инструкции:
Код:
mov edi,[edx+ebx*4]
4) Под конец ставишь прыжок на sub esp,1C

В итоге в выделенной тобой памяти получается следующее:

Код:
mov [адрес куда сохранить значение], ebx
mov edi,[edx+ebx*4]
jmp $004A02EB // sub esp,1C
5) Инструкцию mov edi,[edx+ebx*4] (по адресу 004A02E8) заменяешь на прыжок (jmp) на кусочек выделенной тобой ранее памяти:

Код:
jmp = $E9
Адрес прыжка = [Адрес выделенной памяти] - [Адрес оригинальной инструкции] - 5;
Всё, код будет выполняться, а у тебя по адресу, который ты указал для сохранения регистра - будет его значение, которое можно считывать через ReadProcessMemory. Но проще конечно с памятью процесса работать из заинжекченной DLL


Кстати, вредная привычка - не проверять возврат у функций

Последний раз редактировалось Paladin; 26.02.2015 в 00:27.
  Ответить с цитированием
Старый 26.02.2015, 00:29   #5
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

А этот inject подойдет?

Код:
procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer;
  aParamsSize: DWord);
var
  hThread: THandle;
  lpNumberOfBytes: DWord;
  ThreadAddr, ParamAddr: Pointer;
begin
  if ProcessID<>0 then
  begin
    // ---- Выделяем место в памяти процесса, и записываем туда нашу функцию
    ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);

    // ---- Также запишем параметры к ней
    ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);

    // ---- Создаем поток, в котором все это будет выполняться.
    hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);

    // ---- Ожидаем завершения функции
    WaitForSingleObject(hThread, INFINITE);

    // ---- подчищаем за собой
    CloseHandle(hThread);
    VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
    VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
  end
end;
  Ответить с цитированием
Старый 26.02.2015, 00:35   #6
 Разведчик
Аватар для Paladin
 
Paladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слуху
Регистрация: 13.08.2009
Сообщений: 0
Популярность: 1303
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для Paladin с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
А этот inject подойдет?

Подойдёт для чего?
  Ответить с цитированием
Старый 26.02.2015, 00:38   #7
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

Вот скрин в Olly. Как я заметил тут много проверок и прыжков.
[Ссылки могут видеть только зарегистрированные пользователи. ]

А что за адресс?
"mov [адрес куда сохранить значение], ebx"

Добавлено через 2 минуты
Цитата:
Сообщение от PaladinПосмотреть сообщение
Подойдёт для чего?

Чтобы внести свой код в чужой процессор

Последний раз редактировалось Foreworld; 26.02.2015 в 00:40. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.02.2015, 01:02   #8
 Разведчик
Аватар для Paladin
 
Paladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слуху
Регистрация: 13.08.2009
Сообщений: 0
Популярность: 1303
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для Paladin с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
Сообщение от ForeworldПосмотреть сообщение
А что за адресс?
"mov [адрес куда сохранить значение], ebx"

Адрес твоей переменной или кусочка памяти (который нужно выделить дополнительно) куда ты будешь копировать значение регистра.


Цитата:
Сообщение от ForeworldПосмотреть сообщение
Чтобы внести свой код в чужой процессор

Такого рода вещи должны использоваться с осторожностью и полным пониманием того, что они делают.

У тебя дельфийская функция может дёргать какие-то другие методы\функции\процедуры, юзать переменные - которых в другом адресном пространстве не окажется и получишь в лучшем случае access violation.



Ну а вообще ответ на заданный вопрос я дал во 2 и 4 постах
  Ответить с цитированием
Старый 26.02.2015, 01:11   #9
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

Твой метод это модефецировать клиент и сохранить его. Я правильно понял тебя?

"Адрес твоей переменной или кусочка памяти (который нужно выделить дополнительно) куда ты будешь копировать значение регистра." - а где я его возьму, я не совсем понял.

Это и есть адреса?
Код:
0049CFD4 - call ebx
0049CFD6 - mov eax,[esi+000001A8]
0049CFDC - mov ecx,[eax+edi*4]
0049CFDF - cmp byte ptr [ecx+18],00
0049CFE3 - jne ArenaOnline3D.NGEGUIManager::Render+216

Последний раз редактировалось Foreworld; 26.02.2015 в 01:13.
  Ответить с цитированием
Старый 26.02.2015, 01:16   #10
 Разведчик
Аватар для Paladin
 
Paladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слуху
Регистрация: 13.08.2009
Сообщений: 0
Популярность: 1303
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для Paladin с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
Сообщение от ForeworldПосмотреть сообщение
Твой метод это модефецировать клиент и сохранить его. Я правильно понял тебя?

Нет, я предполагал, что ты работаешь с уже запущенным процессом через стороннюю программу. Ну а если нужно, чтобы "само" всё делалось - вариант закинуть свою дллку в импорт к экзешнику

Цитата:
Сообщение от ForeworldПосмотреть сообщение
а где я его возьму, я не совсем понял.

Выделишь (через VirtualAllocEx)
  Ответить с цитированием
Старый 26.02.2015, 01:20   #11
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

Пойду почитаю что за зверь VirtualAllocEx. Сложно найти пример на pascal'e Он может создать адрес???

Добавлено через 2 минуты
Ни разу не работал в таком направлении

Мне это нужно?

lpvAddress [in]
Указывает желаемый базовый адрес региона памяти, для которого будет произведено выделение памяти.

Последний раз редактировалось Foreworld; 26.02.2015 в 01:24. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.02.2015, 01:24   #12
 Разведчик
Аватар для Paladin
 
Paladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слухуPaladin у всех на слуху
Регистрация: 13.08.2009
Сообщений: 0
Популярность: 1303
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для Paladin с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
Сообщение от ForeworldПосмотреть сообщение
Пойду почитаю что за зверь VirtualAllocEx. Сложно найти пример на pascal'e Он может создать адрес???

Да зачем там пример на паскале, если по msdn всё понятно?
[Ссылки могут видеть только зарегистрированные пользователи. ]


Пример:
Код:
var
  Memory: Pointer;
begin
  Memory := VirtualAllocEx( дескриптор процесса, Nil, требуемый размер в байтах, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
end;
Функция вернёт указатель (Pointer) на выделенный кусок памяти (или Nil в случае неудачи). В случае неудачи вызываешь GetLastError и смотришь в чём проблема.


Но лучше всего начинать с изучения основ прежде, чем лезть в такие дебри
  Ответить с цитированием
Старый 26.02.2015, 01:30   #13
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
Сообщение от PaladinПосмотреть сообщение
Да зачем там пример на паскале, если по msdn всё понятно?
[Ссылки могут видеть только зарегистрированные пользователи. ]


Пример:
Код:
var
  Memory: Pointer;
begin
  Memory := VirtualAllocEx( дескриптор процесса, Nil, требуемый размер в байтах, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
end;
Функция вернёт указатель (Pointer) на выделенный кусок памяти (или Nil в случае неудачи). В случае неудачи вызываешь GetLastError и смотришь в чём проблема.


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

Если желаемый адрес равен nil, то система сама определит место, где будет выделен регион памяти. - Это и будет адрес?

Добавлено через 5 минут
я делаю бота не только для себя но и для других А что делать через dll лучше?

Добавлено через 7 минут
Я знания набиваю через опыт. Вот такой вот я

Последний раз редактировалось Foreworld; 26.02.2015 в 01:38. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.02.2015, 01:45   #14
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Как программно узнать Динамическое значение

Вообще-то лучше уж использовать не безусловные переходы, а вызов функции.
Кроме того, Paladin, мог бы рассказать ему как сделать собственно сплайсинг кода.
В третьих - свою переменную так или иначе он подгрузить в процесс (с условием получения из нее данных) не сможет ровно до тех пор, пока весь его код не будет загружен в виде библиотеки (а этого не требуется).

Ну и напоследок инструкция типа mov edi,[edx+ebx*4] используется при цикличном переборе указателей на структуры данных, а значит конкретное значение может быть и не столь нужным.
Первым делом следовало бы задать вопрос что именно хочет написать автор.

Итак. Foreworld что именно ты пишешь?
  Ответить с цитированием
Старый 26.02.2015, 01:53   #15
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как программно узнать Динамическое значение

Цитата:
Итак. Foreworld что именно ты пишешь?

Пишу бота для себя, если смогу осилить, выложу его и поделюсь своим опыт с другими. Я благодарен людям которые открыли этот сайт и особо благодарен тем кто поделился своим опытом написав статьи. Если бы не эти статьи я не стал бы изучать pascal и не давно стал читать книги по asam и вообще тупа забил бы на это. Но, я увлекся и даже забив на целый год, я вновь вернулся чтобы решить эту проблему.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Программно узнать Name Babls77 Вопросы и ответы, обсуждения 5 22.05.2012 23:16
[Помогите!] Динамическое множество визуальных компонентов. Sinyss Вопросы и ответы, обсуждения 4 11.04.2012 01:50
[Руководство] Динамическое создание миниатюр изображений с помощью PHP Я убью:Frost:DD Web-программирование и технологии 0 11.06.2011 21:42

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 11:03.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net