Сейчас на форуме: _MBK_, asfa (+5 невидимых)

 eXeL@B —› Вопросы новичков —› как внести модификацию в асм код проги?
Посл.ответ Сообщение

Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 20:08
· Личное сообщение · #1

может подскажет хто... короче есть функция в проге.
для меня ее содержимое бесполезно, и хочу как то заменить на свое содержимое.

в эту функцию передается указатель на память и размерность SX, SY
надо сохранить в файл данные
на С++ без проблем - а как нить можно в ольке это сделать красиво?

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




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 26 июня 2009 20:19 · Поправил: FrenFolio
· Личное сообщение · #2

progman пишет:
может подскажет хто... короче есть функция в проге.
для меня ее содержимое бесполезно, и хочу как то заменить на свое содержимое.
в эту функцию передается указатель на память и размерность SX, SY
надо сохранить в файл данные
на С++ без проблем - а как нить можно в ольке это сделать красиво?

Делай переход на свободное место в коде проги, там пиши свой код, и возвращайся обратно, на следующую инструкцию. Естественно, нужно будет позаботиться о восстановлении регистров и затертом коде, если таковой будет иметься. Можно не в код переход делать, а в PE-заголовок. По сути это инлайн патч получается.

progman пишет:
FrenFolio
ну тоесть классически сделать
pusha / popa
pushad / popad
и тупо забыть о регистрах?

Ну в общем, да. Желательно еще сохранить регистр флагов. То есть типа такого
Code:
  1. PUSHAD
  2. PUSHFD
  3. <CODE>
  4. POPFD
  5. POPAD


-----
Программист SkyNet




Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 20:29 · Поправил: progman
· Личное сообщение · #3

FrenFolio
ну тоесть классически сделать
pusha / popa
pushad / popad

и тупо забыть о регистрах?




Ранг: 67.4 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 26 июня 2009 20:56
· Личное сообщение · #4

progman пишет:

FrenFolio
ну тоесть классически сделать
pusha / popa
pushad / popad

и тупо забыть о регистрах?


Конечно, ты же их сохраняешь в стеке.
И за своим кодом тоже следи.



Ранг: 39.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 26 июня 2009 21:06
· Личное сообщение · #5

progman
Пишешь DLL (на C++). Добавляешь ее в таблицу импорта подопытной проги.
В нужном месте вызываешь свою функцию (call dword ptr[xxxxxxxx]).



Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 21:25 · Поправил: progman
· Личное сообщение · #6

чОрт... а как замутить такой код:
Code:
  1. char text[256]={0};
  2. sprintf( text, "%d", EAX );
]



Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 21:26
· Личное сообщение · #7

SVIN95
dll написать мне не проблема. а вот добавить в таблицу - я не настолько силен в моде ехе файлов
чтобы с ними такое вытворять ((



Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 21:27
· Личное сообщение · #8

хотя наврено можно через LoadLibrary и GetProcAddress извратиться



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 26 июня 2009 21:37
· Личное сообщение · #9

progman
> в эту функцию передается указатель на память и размерность SX, SY
Как передаётся, откуда, может через регистры, может через память, может прямо в код данные забивает .
Соответственно ответ - создать файл, промапить себе в процесс, скопировать туда передаваемые данные, сохранить образ и освободить хэндл.



Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 22:52 · Поправил: progman
· Личное сообщение · #10

замутил dll
проверил на своем ехе - работает. вставляю ее загрузчик в код "жертвы"

Code:
  1. CALL DWORD PTR DS:[5FD138] ; LoadLibrary - OK
  2. push ecx; function name
  3. push eax; dll name
  4. CALL DWORD PTR DS:[5FD0D8]; GetProcAddress
  5. push 0 ; param1
  6. push 0 ; param2
  7. push 0 ; param3
  8.  
  9. call DWORD PTR DS:[eax]; - падем.


в ольке смотрю в еах адрес функции в моей dll - export.export
для удобства я либу export назвал и функцию вызывемую так же

вот работающий C++ код:

Code:
  1. HMODULE hModule = ::LoadLibraryA(lib);
  2. typedef int ( *FnGetObject )(unsigned char*, unsigned long, unsigned long );
  3. FnGetObject getObject = (FnGetObject) ::GetProcAddress( hModule, "export");
  4. int ret = getObject(0, 0, 0);


кто подскажет - как вызвать правильно функцию после GetProcAddress в асме ?

ЗЫ DllMain тоже вызывается ОК



Ранг: 16.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 июня 2009 23:04
· Личное сообщение · #11

блин. вопрос решен...
call eax надо и все




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 июня 2009 08:43
· Личное сообщение · #12

Тогда можно закрыть, видимо.


 eXeL@B —› Вопросы новичков —› как внести модификацию в асм код проги?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати