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

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

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

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

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

Результаты опроса: есть вопросы?
да 0 0%
нет 0 0%
забираю деньги 1 50.00%
50/50 0 0%
помощь зала 1 50.00%
звонок другу 0 0%
Голосовавшие: 2. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2010, 16:09   #1
ассемблер123
Пользователь
 
Регистрация: 18.04.2010
Сообщений: 24
Лампочка запись кода в другой процесс

открываю процесс, выделяю в нём память, записываю туда инструкции и запускаю их при помощи CreateRemoteThread

некоторые инструкции вызывают ошибку, например операции ссылающиеся на память

может адреса нужно както корректировать?

Последний раз редактировалось ассемблер123; 20.04.2010 в 16:30.
ассемблер123 вне форума Ответить с цитированием
Старый 20.04.2010, 16:50   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Если речь о переменных, то тут все просто - нужно найти дельта-смещение.
Что касается API - адреса API Kernel32, если не ошибаюсь, во всех процессах одинаковые. Правда, я не проверял остаются ли они такими же после перезагрузки. Например вот адрес GetProcAddress для моей системы - 0x768A1837.
Можно в инъекторе заполнить своеобразную таблицу импорта вашего зонда и он уже по прибытии на место дополнит ее нужными ему функциями, с помощью той же GetProcAddress. Правда, этот метод очень накладный. Гораздо легче создать свою DLL и подгрузить ее в процесс.

Подгрузить свою DLL очень просто:
1. Получаем адрес LoadLibrary.
2. Выделяем в процессе участок памяти.
3. Записываем в него название вашей DLL
4. CreateRemoteThread, в качестве ThreadEntry - адрес LoadLibrary, в качестве Param - адрес выделенной памяти, куда мы записали название DLL.

PS: Сугубо в академических целях или специфическая задача?
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 20.04.2010 в 16:54.
Ivan_32 вне форума Ответить с цитированием
Старый 20.04.2010, 18:36   #3
ассемблер123
Пользователь
 
Регистрация: 18.04.2010
Сообщений: 24
По умолчанию

подгрузка dll не работает
извините за изменённый MASM синтаксис
# - offset
` - invoke


Код:
.data
window1name	db 'target window',0
secattr		SECURITY_ATTRIBUTES <sizeof SECURITY_ATTRIBUTES,0,0>
varb			dd ?
hmod		dd ?
hadd		dd ?
kern			db 'kernel32.dll',0
loadd		db 'LoadLibraryA',0
erro			db 'Окно не найдено',0

mylibb		db 'D:\masm32\projects\api перехват\window 2\dll\project.dll',0

sizze	equ sizeof mylibb
.code

`FindWindow 0,#window1name

.if eax>0
	`GetWindowThreadProcessId eax,#varb

	`OpenProcess PROCESS_ALL_ACCESS,0,varb
		mov hmod,eax

	`VirtualAllocEx hmod,0,sizze,MEM_COMMIT,PAGE_EXECUTE_READWRITE
		mov hadd,eax

	`WriteProcessMemory hmod,hadd,#mylibb,sizze,0
	
		`LoadLibrary #kern
		`GetProcAddress eax,#loadd
	`CreateRemoteThread hmod,#secattr,100,eax,#hadd,0,#varb
.else
	`CreateThread 0,100,#exitt,0,0,0
	`MessageBox 0,#erro,0,0
.endif

exitt:	`Sleep 1000
		`ExitProcess 0
если найдёте ошибку - скажите

Последний раз редактировалось ассемблер123; 20.04.2010 в 18:50.
ассемблер123 вне форума Ответить с цитированием
Старый 20.04.2010, 19:29   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
format PE Console
entry appEntry

include '%fasminc%\win32a.inc'
include '%fasminc%\equates\kernel32.inc'
include '%fasminc%\equates\gdi32.inc'
include '%fasminc%\equates\user32.inc'


section '.data' data readable writeable
  hProcess dd 0
  
  libName db "C:\ERRORMSG.DLL",0
  remMem    dd 0
  ioCounter dd 0
section '.code' code readable writeable executable

appEntry:
	invoke OpenProcess,PROCESS_ALL_ACCESS,0,21320 	
	mov [hProcess],eax
	invoke VirtualAllocEx,[hProcess],0,4096,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
	mov [remMem],eax
	invoke WriteProcessMemory,[hProcess],[remMem],libName,16,ioCounter
	invoke CreateRemoteThread,[hProcess],0,0,[LoadLibrary],[remMem],NULL,0
     
    exitf: 
    cinvoke getch
    invoke  ExitProcess, 0


	
section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
	  user32,'USER32.DLL',\
	  crtdll,'CRTDLL.DLL',\
	  msvcrt,'MSVCRT.DLL'
  
  import msvcrt,\
  	  getch,'_getch'

  include '%fasminc%/apia/kernel32.inc'
  include '%fasminc%/apia/user32.inc'
  include '%fasminc%/apia/crtdll.inc'
В моем случае использовать GetProcAddress не нужно т.к. в FASM-е название функции обозначает адрес переменной в которой находится адрес функции, а [название функции] - сам адрес функции. Тоже самое и для переменных.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 20.04.2010, 19:54   #5
ассемблер123
Пользователь
 
Регистрация: 18.04.2010
Сообщений: 24
Смущение

по симптомам я определил что моя библиотека всётаки подгружается, но её стартовый код почемуто выполняется тысячи раз
Код:
.386
.model flat,stdcall
option casemap:none

include \masm32\my\macro.mac

lib windows,user32,kernel32

.code



start proc abc:dword,bcd:dword,cde:dword
	invoke MessageBeep,0
	mov eax,1
	ret
start endp



include main.inc



end start

Последний раз редактировалось ассемблер123; 20.04.2010 в 20:05.
ассемблер123 вне форума Ответить с цитированием
Старый 20.04.2010, 20:34   #6
ассемблер123
Пользователь
 
Регистрация: 18.04.2010
Сообщений: 24
По умолчанию

бред какой-то: заменил mov eax,1 на mov eax,0 и теперь стартовый код выполняется только 2 раза

ООО чудо!!!

Код:
start proc abc:dword,bcd:dword,cde:dword
	push ebx
	push ecx
	push edx
	
	invoke MessageBeep,0
	
	pop edx
	pop ecx
	pop ebx
	
	xor eax,eax
	ret
start endp
работает как надо!

Всем спасибо

Последний раз редактировалось ассемблер123; 20.04.2010 в 20:40.
ассемблер123 вне форума Ответить с цитированием
Старый 21.04.2010, 08:18   #7
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

fdwReason может принимать 4 разных значения. Одно из них - DLL_PROCESS_ATTACH - вот его вам и нужно хендлить.
Если fdwReason == DLL_PROCESS_ATTACH - начинаем инициализацию итд, после инициализации - возвращаем TRUE. Вам нужно будет создать свой тред в котором будет идти дальнешая инициализация, поскольку процесс будет ждать пока завершится DllEntry. Если fdwReason == DLL_PROCESS_DETACH - завершаем тред.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать,так что бы запись в из одного ДБГрида добавлялась в другой ДБгрид Hito БД в Delphi 10 19.04.2009 21:14
чтение из одного exe файла, и запись в другой exe inndim Общие вопросы Delphi 2 04.02.2009 15:23
Как решить задачу по написанию кода для определения текущей или любой другой даты? Psyka Помощь студентам 5 25.04.2008 08:32
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51