Что нового

Обсуждение: _UnloadModule() - Выгрузка dll из чужого процесса!

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
DelphiExpert, ты уверен что ты это писал?


Добавлено:
Сообщение автоматически объединено:

Это я писал, даже ошибка моя!!!
 

Arei

Скриптер
Сообщения
938
Репутация
115
я подтверждаю, что Ganibal95 сделал эту UDF и вас прошу Garrett удалить этого DelphiExpert с форума или бан.Прощу ответить.Заранее спасибо.
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Оригинал вот:
Код:
#include-once
#include <Memory.au3>
#include <WinAPI.au3>
#include <Array.au3>
;#=================================================================================================
;
;__________$$$$$$__________________$$$$$$___________ 
;_______$$$$$$$$________$$$$$_______$$$$$$$$________ 
;_____$$$$$$$$$$$$____$$$$$$$$$____$$$$$$$$$$$______ 
;___$$$$$$$$$$$$$$$__$$$$$$$$$$$__$$$$$$$$$$$$$$____ 
;__$$$$$$$_$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_$$$$$$$___ 
;__$$$$$____$$$$$$$$$$$$$$$$$$$$$$$$$$$$___$$$$$$___ 
;__$$$$________$$$$$$$$$$$$$$$$$$$$$$$_______$$$$___ 
;___$$$____________$$$$$$$$$$$$$$$___________$$$____ 
;____$$$___________$$$$$$$$$$$$$$$__________$$$_____ 
;____$$$___________$$$$$$$$$$$$$__________$$$______ 
;______$$__________$$$$$$$$$$$$$$__________$$_______ 
;_______$$________$$$$$$$$$$$$$$$_________$$________ 
;________$_________$$$$$$$$$$$$$__________$_________ 
;________$___________$$$$$$$$$$$__________$_________ 
;_______$_____________$$$$$$$$$____________$________ 
;______$_______________$$$$$$$______________$_______ 
;_____$_______________$$$$$$$$$______________$______ 
;____$_____________$$$$$$$____________________$_____ 
;_________________$$$$______________________________ 
;__________________$$_______________________________ 
;__________________$________________________________
;
;By Ganibal95
;==================================================================================================


;#=================================================================================================
;Название функции: _UnloadModule()
;$procidx - пид процесса
;$Mod - Имя длл
;========================By Ganibal95==============================================================
Func _UnloadModule($procidx,$Mod) ; Пид процесса, Имя длл
	Local $err = 0, $return = 0,$hModule = 0
	        $g_aMods = _EnumModules($procidx)
			For $i=0 To UBound($g_aMods) - 1
				if $Mod = $g_aMods[$i][1] Then
				Local $hModule = $g_aMods[$i][0]
				ExitLoop
			    EndIf
		    Next
if $hModule <> 0 Then
			Local $hProcess = _GetProcHandle($procidx)
			If Not $hProcess Then
				$err = 3
			Else
				; get FreeLibrary address and call the remote thread with a pointer to hModule
				Local $kernelidx = _ArraySearch($g_aMods, "kernel32.dll", 0, 0, 0, 0, 1, 1)
				If $kernelidx == -1 Then
					$err = 4
				Else
	                Local $hKernel32 = _WinAPI_LoadLibrary("kernel32.dll")
	                $g_FreeLibrary = _GetProcAddress($hKernel32, "FreeLibrary") - $hKernel32
					$g_LoadLibraryA = _GetProcAddress($hKernel32, "LoadLibraryA") - $hKernel32
	                _WinAPI_FreeLibrary($hKernel32)
					Local $FreeLibrary = $g_aMods[$kernelidx][0] + $g_FreeLibrary ; add offset to base address
					Local $ret = DllCall("kernel32.dll", "ptr", "CreateRemoteThread", "ptr", $hProcess, "ptr", 0, "uint", 0, "ptr", $FreeLibrary, "ptr", $hModule, "dword", 0, "ptr", 0)
					If Not $ret[0] Then
						$err = 4 ; create remote thread failed
					Else
						_WinAPI_WaitForSingleObject($ret[0]) ; wait for thread to finish
						_WinAPI_CloseHandle($ret[0]) ; close thread handle
					EndIf
				EndIf
				_WinAPI_CloseHandle($hProcess)
			EndIf
EndIf
	
	If $err Then $return = 1
	Return SetError($err, 0, $return)
EndFunc

;#=============================================================================================
;Название функции: _InjectModule()
;$procidx - Пид процесса
;$dllpath - Полный путь к длл
;=======================By Ganibal=============================================================
Func _InjectModule($procidx,$dllpath) ;Пид, путь к длл
	Local $err = 0, $hModule = 0
	If StringRight($dllpath, 4) <> ".dll" Then
			$err = 3
	Else			
				Local $hProcess = _GetProcHandle($procidx)
				If Not $hProcess Then
					$err = 4
				Else
					; allocate memory in remote process for dll path
					Local $pMem = _MemVirtualAllocEx($hProcess, 0, 260, $MEM_COMMIT, $PAGE_READWRITE)
					If Not $pMem Then
						$err = 5
					Else
						; write dll path to remote process
						Local $ret = DllCall("kernel32.dll", "int", "WriteProcessMemory", "ptr", $hProcess, "ptr", $pMem, "str", $dllpath, "uint", 260, "uint*", 0)
						If $ret[5] <> 260 Then
							$err = 6
						Else
							; get LoadLibraryA address and call the remote thread with a pointer to the dll path
							$g_aMods = _EnumModules($procidx)
							Local $kernelidx = _ArraySearch($g_aMods, "kernel32.dll", 0, 0, 0, 0, 1, 1)
							If $kernelidx == -1 Then
								$err = 7
							Else
								$hKernel32 = _WinAPI_LoadLibrary("kernel32.dll")
								$g_LoadLibraryA = _GetProcAddress($hKernel32, "LoadLibraryA") - $hKernel32
								_WinAPI_FreeLibrary($hKernel32)
								Local $LoadLibraryA = $g_aMods[$kernelidx][0] + $g_LoadLibraryA ; add offset to base address
								$ret = DllCall("kernel32.dll", "ptr", "CreateRemoteThread", "ptr", $hProcess, "ptr", 0, "uint", 0, "ptr", $LoadLibraryA, "ptr", $pMem, "dword", 0, "ptr", 0)
								If Not $ret[0] Then
									$err = 8 ; create remote thread failed
								Else
									Local $hThread = $ret[0]
									_WinAPI_WaitForSingleObject($hThread) ; wait for thread to finish
									; get thread return value, which is the HMODULE (base address) of the injected dll
									$ret = DllCall("kernel32.dll", "int", "GetExitCodeThread", "ptr", $hThread, "dword*", 0)
									$hModule = Ptr($ret[2])
									_WinAPI_CloseHandle($hThread) ; close thread handle
								EndIf
							EndIf
						EndIf
						_MemVirtualFreeEx($hProcess, $pMem, 260, $MEM_DECOMMIT) ; release memory for dll path
					EndIf
					_WinAPI_CloseHandle($hProcess)
				EndIf
			EndIf
	
	Return SetError($err, 0, $hModule)
EndFunc

Func _GetProcAddress($module, $function)
	Local $call = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", $module, "str", $function)
	Return $call[0]
EndFunc

Func _EnumModules($process)
	; enumerate all modules in a process
	Local $aMods
	Local $hProcess = _GetProcHandle($process)
	If $hProcess Then
		Local $modules = DllStructCreate("ptr[1024]")
		Global $PSAPI = DllOpen("psapi.dll")
		Local $ret = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($modules), "dword", DllStructGetSize($modules), "dword*", 0)
		If $ret[4] > 0 Then
			Local $nummods = $ret[4] / 4
			Local $aMods[$nummods][3]
			For $i = 1 To $nummods
				$aMods[$i - 1][0] = DllStructGetData($modules, 1, $i) ; base address
				$aMods[$i - 1][1] = "n/a" ; module name
				$aMods[$i - 1][2] = "n/a" ; module path
				Local $name = _GetModuleBaseNameW($hProcess, Ptr($aMods[$i - 1][0]))
				If $name Then $aMods[$i - 1][1] = $name
				Local $path = _GetModuleFileNameW($hProcess, Ptr($aMods[$i - 1][0]))
				If $path Then $aMods[$i - 1][2] = $path
			Next
		EndIf
		_WinAPI_CloseHandle($hProcess)
		$modules = 0
	EndIf
	
	Return $aMods
EndFunc

Func _GetModuleFileNameW($hProcess, $hModule = 0)
	Local $path = ""
	Local $ret = DllCall($PSAPI, "dword", "GetModuleFileNameExW", "ptr", $hProcess, "ptr", $hModule, "wstr", "", "dword", 260)
	If $ret[0] Then
		$path = $ret[3]
	EndIf
	
	Return $path
EndFunc

Func _GetModuleBaseNameW($hProcess, $hModule = 0)
	Local $name = ""
	Local $ret = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", $hModule, "wstr", "", "dword", 260)
	If $ret[0] Then
		$name = $ret[3]
	EndIf
	
	Return $name
EndFunc

Func _GetProcHandle($process)
	Local $hProcess = 0
	Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE

	If IsInt($process) Then
		If $process > 0 Then
			Local $ret = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $process)
			If $ret[0] Then
				$hProcess = $ret[0]
			EndIf
		EndIf
	EndIf

	Return $hProcess
EndFunc


и ошибка заключалась именно в выгрузке:
Код:
$g_aMods = _EnumModules($procidx)
			For $i=0 To UBound($g_aMods) - 1
				if $Mod = $g_aMods[$i][1] Then
				Local $hModule = $g_aMods[$i][0]
				ExitLoop
			    EndIf
		    Next


Так как надо сравнивать не по названию, а по хенделу, которого нужно извлеч из названия!!!

Требую указать автора!!!


Добавлено:
Сообщение автоматически объединено:

DelphiExpert
Ты не обнаглел? Ganibal_mc2 - Добавляйся, поговорим...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ganibal95
Вы можете указать первоисточник, где публиковался ваш код? Инными словами как ваш код мог попасть к DelphiExpert?
 

Arei

Скриптер
Сообщения
938
Репутация
115
DelphiExpert
добавь и меня arei91
Поговорим...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Прошу всех участников данной дискуссии не горячится, разберёмся. Уважайте себя и других коллег!
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Попал он спомощью Дмитрия, а этот Наглец выложил и типо он автор!!!
А настоящий автор Я!!! Я целую ночь летом не спал делал этот скрипт!!!
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Ganibal95 в Вашем коде имеются комментарии на английском языке?
Откуда они взялись ?
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
А вот докозательства, спросите у того наглеца что делает каждая функция, пускай он сходу отвечает!!!
Он не сможет вам по строчно обьяснить что делает каждая строчка!!!


Добавлено:
Сообщение автоматически объединено:

VladUs
Тебе ссылку дать? или сам разберешся откуда аглийский язык?
Зайди в Google, я все UDF делаю на английском, а друг по просил перевести, ну я перевел самое выжное и все!


Добавлено:
Сообщение автоматически объединено:

Есть еще 1 доказательство, в моей UDF можно еще и ВГРУЗИТЬ DLL В процесс и пользуются это одноименные функции как и при выгрузке!!!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
OffTopic:
А куда делась первая половина темы?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ganibal95 это ваш ник KING536?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles [?]
А куда делась первая половина темы?
Возник конфликт по поводу авторских прав и я вынес обсуждение в "Общение"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett [?]
вынес обсуждение в "Общение"
Понял, разобрался, спасибо.

Хотелось бы услышать, что скажет DelphiExpert по поводу возникшего конфликта.
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Вот скрин с перепиской, и датой создания
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Ganibal95 [?]
Тебе ссылку дать? или сам разберешся откуда аглийский язык?

Английский язык, как я понял взят из официального форума. Я это к тому, что если Вы оспариваете авторские права, то в Вашей UDF необходимо обозначать то, что Ваши функции созданы на основе чужего кода. Вот допустим функция _InjectModule() (вплоть до комментариев ) взята отсюда
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
VladUs
Да от туда...
Только я запарился выдерать от туда эти функции!!!
Я же не публиковал эту UDF на форуме...
Все таки из того примера я сделал отдельную UDF, и у меня эту UDF украли!!!
Я не отрицаю что я выдрал ее от туда... Если бы публиковал на форуме я указал источник, но в целом из того кода я сделал UDF...


Добавлено:
Сообщение автоматически объединено:

а точнее сказать я сделал UDF на основе того скрипта, думаю вы все пользуетесь примерами!!!
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Ganibal95 [?]
Все таки из того примера я сделал отдельную UDF
Я не говорю, что Вы не работали над своей UDF, я просто считаю, что необходимо указывать источник с помощью которого Вы выработали создали свой код.
Просто когда Вы говорите , что
А настоящий автор Я!!! Я целую ночь летом не спал делал этот скрипт!!!
получается, что Вы тоже немного лукавите.
 
Верх