Как изменился sendPacket? - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок
01.07.2015, 14:37
#1
Разведчик
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Как изменился sendPacket?
Когда-то давно работал такой вот код.
Код:
Global $kernel32 = DllOpen('kernel32.dll')
Global $pid = ProcessExists('elementclient.exe')
global $realBaseAddress = 0x00D2E444
global $sendPacketFunction = 0x00789820
;//Deselect target (example usage of sendPacket)
deselectTarget($pid)
DllClose($kernel32)
Func deselectTarget($pid)
;//Deselects the currently selected target
local $packet, $packetSize
$packet = '0800'
$packetSize = 2
sendPacket($packet, $packetSize, $pid)
EndFunc
Func sendPacket($packet, $packetSize, $pid)
;//Declare local variables
Local $pRemoteThread, $vBuffer, $loop, $result, $OPcode, $processHandle, $packetAddress
;//Open process for given processId
$processHandle = memopen($pid)
;//Allocate memory for the OpCode and retrieve address for this
$functionAddress = DllCall($kernel32, 'int', 'VirtualAllocEx', 'int', $processHandle, 'ptr', 0, 'int', 0x46, 'int', 0x1000, 'int', 0x40)
;//Allocate memory for the packet to be sent and retrieve the address for this
$packetAddress = DllCall($kernel32, 'int', 'VirtualAllocEx', 'int', $processHandle, 'ptr', 0, 'int', $packetSize, 'int', 0x1000, 'int', 0x40)
;//Construct the OpCode for calling the 'SendPacket' function
$OPcode &= '60' ;//PUSHAD
$OPcode &= 'B8'&_hex($sendPacketFunction) ;//MOV EAX, sendPacketAddress
$OPcode &= '8B0D'&_hex($realBaseAddress) ;//MOV ECX, DWORD PTR [revBaseAddress]
$OPcode &= '8B4920' ;//MOV ECX, DWORD PTR [ECX+20]
$OPcode &= 'BF'&_hex($packetAddress[0]) ;//MOV EDI, packetAddress //src pointer
$OPcode &= '6A'&_hex($packetSize,2) ;//PUSH packetSize //size
$OPcode &= '57' ;//PUSH EDI
$OPcode &= 'FFD0' ;//CALL EAX
$OPcode &= '61' ;//POPAD
$OPcode &= 'C3' ;//RET
;//Put the OpCode into a struct for later memory writing
$vBuffer = DllStructCreate('byte[' & StringLen($OPcode) / 2 & ']')
For $loop = 1 To DllStructGetSize($vBuffer)
DllStructSetData($vBuffer, 1, Dec(StringMid($OPcode, ($loop - 1) * 2 + 1, 2)), $loop)
Next
;//Write the OpCode to previously allocated memory
DllCall($kernel32, 'int', 'WriteProcessMemory', 'int', $processHandle, 'int', $functionAddress[0], 'int', DllStructGetPtr($vBuffer), 'int', DllStructGetSize($vBuffer), 'int', 0)
;//Put the packet into a struct for later memory writing
$vBuffer = DllStructCreate('byte[' & StringLen($packet) / 2 & ']')
For $loop = 1 To DllStructGetSize($vBuffer)
DllStructSetData($vBuffer, 1, Dec(StringMid($packet, ($loop - 1) * 2 + 1, 2)), $loop)
Next
;//Write the packet to previously allocated memory
DllCall($kernel32, 'int', 'WriteProcessMemory', 'int', $processHandle, 'int', $packetAddress[0], 'int', DllStructGetPtr($vBuffer), 'int', DllStructGetSize($vBuffer), 'int', 0)
;//Create a remote thread in order to run the OpCode
$hRemoteThread = DllCall($kernel32, 'int', 'CreateRemoteThread', 'int', $processHandle, 'int', 0, 'int', 0, 'int', $functionAddress[0], 'ptr', 0, 'int', 0, 'int', 0)
;//Wait for the remote thread to finish
Do
$result = DllCall('kernel32.dll', 'int', 'WaitForSingleObject', 'int', $hRemoteThread[0], 'int', 50)
Until $result[0] <> 258
;//Close the handle to the previously created remote thread
DllCall($kernel32, 'int', 'CloseHandle', 'int', $hRemoteThread[0])
;//Free the previously allocated memory
DllCall($kernel32, 'ptr', 'VirtualFreeEx', 'hwnd', $processHandle, 'int', $functionAddress[0], 'int', 0, 'int', 0x8000)
DllCall($kernel32, 'ptr', 'VirtualFreeEx', 'hwnd', $processHandle, 'int', $packetAddress[0], 'int', 0, 'int', 0x8000)
;//Close the Process
memclose($processHandle)
Return True
EndFunc
Func memopen($pid)
Local $mid = DllCall($kernel32, 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', 1, 'int', $pid)
Return $mid[0]
EndFunc
Func memclose($mid)
DllCall($kernel32, 'int', 'CloseHandle', 'int', $mid)
EndFunc
Func _hex($Value, $size=8)
Local $tmp1, $tmp2, $i
$tmp1 = StringRight("000000000" & Hex($Value),$size)
For $i = 0 To StringLen($tmp1) / 2 - 1
$tmp2 = $tmp2 & StringMid($tmp1, StringLen($tmp1) - 1 - 2 * $i, 2)
Next
Return $tmp2
EndFunc
Сейчас он крашит клиент. Подскажите, что не так?
01.07.2015, 19:37
#2
Разведчик
Регистрация: 08.10.2010
Сообщений: 9
Популярность: -69
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Re: Как изменился sendPacket?
Топому, что когда-то SendPacket начинался так:
Код:
PUSH -1
PUSH 008449C8
.........
А сейчас почти везде вот так:
Код:
MOV EAX,85C478
JMP EAX
........
Поправь эти 2 строки и твой код сработает.
PS. Примеры с сервера 1.3.9
01.07.2015, 21:57
#3
Разведчик
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Re: Как изменился sendPacket?
Не понимаю вас.
Функция начинается так (руоф).
elementclient.exe+389820 - 6A FF - push -01
elementclient.exe+389822 - 68 68A9B900 - push elementclient.exe+79A968
Передается в функцию, как мне кажется, то же самое, что и раньше. Тем не менее, если код запустить без админских прав, то ничего не происходит. Если запустить от имени админа, клиент вываливается с ошибкой.
Где косяк, понять не могу.
01.07.2015, 22:49
#4
Разведчик
Регистрация: 06.10.2013
Сообщений: 27
Популярность: 10
Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
Re: Как изменился sendPacket?
Цитата:
Не понимаю вас.
Функция начинается так (руоф).
elementclient.exe+389820 - 6A FF - push -01
elementclient.exe+389822 - 68 68A9B900 - push elementclient.exe+79A968
Передается в функцию, как мне кажется, то же самое, что и раньше. Тем не менее, если код запустить без админских прав, то ничего не происходит. Если запустить от имени админа, клиент вываливается с ошибкой.
Где косяк, понять не могу.
Игровой центр че-то делает с клиентом, решение - открыть процесс с правами дебагера/запускать клиент не через игровой центр.
Сам инжект вроде почти не менялся. Вот так у себя инжектирую:
Код:
Private Sub Write_packet(ByVal packet() As Byte)
Dim tmpint As UInteger
WriteProcessMemory(hProcess, PacketAllocMemory, packet, packet.Length, tmpint)
Me.Mov_EDI(PacketAllocMemory)
Me.Push6A(packet.Length)
Me.Push_EDI()
End Sub
Public Sub add_packet(ByVal packet() As Byte) '+++
'7D 00 01
'7D 00 00
Me.Clear()
Me.Pushad()
Me.Mov_ECX_DWORD_Ptr(Offsets.BaseAdress) 'base adress
Me.Mov_ECX_DWORD_Ptr_ECX_Add(&H20)
Me.Write_packet(packet)
Me.Mov_EAX(Offsets.PackCall) 'pacet send function
Me.Call_EAX()
Me.Popad()
Me.Ret()
Me.RunAsm(PacketSendAllocMemory)
End Sub
'PackCall As UInteger = &H789820
'
01.07.2015, 23:50
#5
Разведчик
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Re: Как изменился sendPacket?
Запускаю с правами дебаггера - такая же история.
В итоге CreateRemoteThread отрабатывает, а новый тред с нашим вызовом sendPacket крашит весь клиент. Видимо придется придумать, как дебажить заинжекченный код.
Каким образом можно запускать клиент не через игровой центр?
Ваш код вроде очень похож на мой.
Подозреваю, что происходит что-то неладное с защитой памяти.
02.07.2015, 00:23
#6
Разведчик
Регистрация: 06.10.2013
Сообщений: 27
Популярность: 10
Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
Re: Как изменился sendPacket?
Цитата:
Каким образом можно запускать клиент не через игровой центр?
1) Через автологины [
Ссылки могут видеть только зарегистрированные пользователи. ] (работает все, кроме входа в игру из-за обновления)
2) Послать запросы на сервер, получить из ответов аргументы для запуска, запустить клиент под этими аргументами(Аргументы такие: "startbypatcher " + "user:ИзОтвета " + "_user:ИзОтвета "+ "token2:ИзОтвета " + "role:Ник_Перса" )
02.07.2015, 02:15
#7
Разведчик
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Re: Как изменился sendPacket?
Дело все-таки не в гэйм-центре, а жаль.
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
Похожие темы
Тема
Автор
Раздел
Ответов
Последнее сообщение
[Программа] SendPacket 1.4.4
STIL23
Боты, скрипты и прочий софт для Perfect World
79
11.06.2012 08:58
[Информация] изменился список якорей
lektor-killer
Общение и обсуждение
10
03.02.2011 17:37
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 19:58 .