PDA

Просмотр полной версии : [Помогите!] Инжект пакета, реализация на FreeBASIC


Sirioga
23.11.2011, 21:13
РЕШЕНО
В asm блоке вместо mov ecx,[&h34] нужно было записать mov ecx,[&h20].
Подсказал Sanych89 постом ниже!

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

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

Для тех кто не хочет качать FreeBASIC, а охота заглянуть в стек, даю в приложении тот самый скомпилированный исходник. Обратите внимание, после pushad стоит брекпоинт int3, запускать следует после податачивания отладчика (OllyDbg например)!

Инжект представляет собой жестко заданные 6 байт, взятия НПС в таргет, наставник новичков в людской нуболоке (тот самый респ на котором получаем сундук который открывается каждые 5 лвл).


#Include "windows.bi"

Type PParams
mParam (0 To 5) As UByte = {&h02, &h00, &h32, &h18, &h10, &h80 }
Param1 As Dword
CallAddress as Dword = &h6737B0
End Type

Dim PID As UInteger
Dim hProcess As Handle
Dim Shared aParams As PParams

Declare Function PacketCall StdCall (ByVal pData As PParams Ptr = @aParams) As HMODULE
Declare Sub InjectFunc(ByVal ProcessID As Handle, ByVal Func As Any Ptr, ByVal aParams As Any Ptr, aParamsSize As DWORD)

aParams.Param1 = 6
aParams.mParam(0) = &h02
aParams.mParam(1) = &h00
aParams.mParam(2) = &h32
aParams.mParam(3) = &h18
aParams.mParam(4) = &h10
aParams.mParam(5) = &h80

GetWindowThreadProcessId(FindWindow("ElementClient Window", NULL), @PID)
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
InjectFunc(hProcess, @PacketCall, @aParams, SizeOf(aParams))


Function PacketCall StdCall (ByVal pData As PParams Pointer = @aParams) as HMODULE

Dim pPacket As UByte ptr = @pData -> mParam(0)
Dim pLen As DWORD = pData -> Param1
Dim CallFunc as DWord = pData -> CallAddress

asm
pushad
int3
mov ecx,[&hB27A04]
mov ecx,[ecx+&h34]
push [pLen]
push [pPacket]
call [CallFunc]
popad
end asm

End Function


Sub InjectFunc(ByVal ProcessID As Handle, ByVal Func As Any Ptr, ByVal aParams As Any Ptr, aParamsSize As DWORD)
Dim hThread As HANDLE
Dim lpNumberOfBytes As UInteger
Dim ThreadAddr As LPVOID Ptr
Dim ParamAddr As LPVOID Ptr
Print @aParams ;" - Inside Adress"
Print aParams
Print aParamsSize ;" - aParamsSize"
Print "-------------"
Print "Press any key to continue function InjectFunc"
Sleep
If ProcessID <> 0 Then
' // ---- Âûäåëÿåì ìåñòî â ïàìÿòè ïðîöåññà, è çàïèñûâàåì òóäà íàøó ôóíêöèþ
ThreadAddr = VirtualAllocEx(ProcessID, NULL, 256, MEM_COMMIT, PAGE_READWRITE)
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, @lpNumberOfBytes)
Print lpNumberOfBytes ;" - TargetCall"

'// ---- Òàêæå çàïèøåì ïàðàìåòðû ê íåé
ParamAddr = VirtualAllocEx(ProcessID, NULL, aParamsSize, MEM_COMMIT, PAGE_READWRITE)
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, @lpNumberOfBytes)
Print lpNumberOfBytes ;" - aParams"

'// ---- Ñîçäàåì ïîòîê, â êîòîðîì âñå ýòî áóäåò âûïîëíÿòüñÿ.
hThread = CreateRemoteThread(ProcessID, NULL, 0, ThreadAddr, ParamAddr, 0, @lpNumberOfBytes)

'// ---- Îæèäàåì çàâåðøåíèÿ ôóíêöèè
WaitForSingleObject(hThread, INFINITE)

'// ---- ïîä÷èùàåì çà ñîáîé
CloseHandle(hThread)
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE)
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE)
Print "Im inside of function InjectFunc"
Print "Press any key for exit..."
EndIf
Sleep
End Sub


Собственно и всё... Спасибо за внимание, надеюсь на вашу помощь и поддержку!

Sanych89
23.11.2011, 21:58
о! третьим будешь

mov ecx,[&hB27A04]
mov ecx,[ecx+&h34]

а надо

mov ecx,[&hB27A04]
mov ecx,[ecx+&h20]

Sirioga
23.11.2011, 22:13
о! третьим будешь
Это ты к чему?

а надо

Код:
mov ecx,[&hB27A04]
mov ecx,[ecx+&h20]
почему 20, а не 34?... Объясни)

PS: Крэш клиента не произошел, но и нпс в таргет не взялся...

Sanych89
23.11.2011, 22:23
Это ты к чему?

Я делал так же. И ещё один человек недавно.
почему 20, а не 34?... Объясни)

PS: Крэш клиента
$34 - смещение host_player'а, к отправке пакетов отношения не имеет.
Что ещё бросилось в глаза:
@lpNumberOfBytes - адрес lpNumberOfBytes? В случае с Delphi, отправляется сама переменная, а не её адрес. Остальное очень похоже.

И забыл. С ассемблером у меня совсем печально, но, может быть, корректнее так:

mov ecx, dword ptr [base_addr]
mov ecx, dword ptr [ecx+$20]

Sirioga
23.11.2011, 22:41
Почему в первый раз отказалось работать сказать точно не могу, но потом после изменения 34 на 20 оно начало работать...

@lpNumberOfBytes - адрес lpNumberOfBytes? В случае с Delphi, отправляется сама переменная, а не её адрес. Остальное очень похоже.

lpNumberOfBytesWritten [out]
A pointer to a variable that receives the number of bytes transferred into the specified process. This parameter is optional. If lpNumberOfBytesWritten is NULL, the parameter is ignored.

т.е. поместить "в".
И забыл. С ассемблером у меня совсем печально, но, может быть, корректнее так:
Может и корректнее, но в данной ситуации оно роли не отыграло.

Спасибо большое за помощь!

hiho
24.11.2011, 00:31
подписываюсь, недавно тоже была такая проблема =)