Что нового

Работа с инструкциями Ассемблера

TpeTTep

Новичок
Сообщения
45
Репутация
1
Доброго времени суток. Пишу скрипт, который считывает память процесса. Появилась необходимость редактирования некоторых инструкций. На самом деле я не думал , что до этого дойдёт. Предполагал, что хватит и стандартных функций чтения и записи в память. Разумеется я нашел нужный мне адрес в памяти, но когда я пытался изменить его значение на 0, то какая-то инструкция норовила изменить значение на прежнее. Средствами самого Cheat Engine мне удалось найти эту инструкцию и заменить её на "NOP", т.е сделать так, что она ничего не делает. Это сработало. Но теперь мне нужно сделать это через AutoIt. Никто не подскажет как это сделать?

P.S. На просторах интернета я нашел библиотеку, которая якобы позволяет это сделать. Я не силен в английском, а рабочих примеров кот наплакал. Было бы здорово, если бы помогли разобраться с ней. Называется она FASM UDF
 

SealAlbinos

Продвинутый
Сообщения
152
Репутация
57
не совсем понимаю вопроса, так как изменение памяти это уже asm
Скорее всего вы меняете адрес так
Код:
_memorywrite(0x00481422, $Open, "1435209872", "long")


когда правильно будет так

Код:
_memorywrite(0x00481422,$open,0x9090,'byte[2]')


а вот если вам нужно будет делать прыжок в пустую область (память которая не используется) и там уже менять вызов, тогда нужно будет использовать
Код:
$hp1 = _MemoryScanEx($Open, "D9 45 FC 8B E5 5D C3 CC CC CC CC CC CC CC CC CC CC CC CC CC 55 8B EC 51 89 4D FC 8D 45 08 50 8B 0D 54 85","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")

$MyHP = _AllocMem(ProcessExists("процесс приложения"), 2048)
$page = _AllocMem(ProcessExists("процесс приложения"), 2048)

Case $HP
	If GUICtrlRead($HP) = 1 Then
	$hex = Hex($MyHP, 8)
	$byte[0] = 4
	$step = 1
	For $i = 1 To 8
		$byte[$step] = StringRight($hex, 2)
		$i += 1
		$hex = StringLeft($hex, 8 - $i)
		$step += 1
	Next
	_MemoryWrite($hp1, $open, "0xE9" & Byte_Reverse(Calc($page + 1, $hp1+1)), "byte[5]")
	_MemoryWrite($page, $open, "0xA1" & $byte[1] & $byte[2] & $byte[3] & $byte[4], "byte[5]")
	_MemoryWrite($page + 0x5, $open, "0x8945FCD945FC8BE5E9" & Byte_Reverse(Calc($page + 0xD, $hp1+5, 1)), "byte[13]")
	_MemoryWrite($MyHP, $open, "200", "float")
Else
    _memorywrite($hp1,$open,0x5DE58BFC45D9,'byte[6]')
EndIf 

Func Calc($dwCall, $dwAddress, $i = 0)
	If Not IsInt($dwCall) Then $dwCall = Dec(StringReplace($dwCall, "0x", ""))
	If Not IsInt($dwAddress) Then $dwAddress = Dec(StringReplace($dwAddress, "0x", ""))

	If $i = 1 Then
		Local $tmp = $dwCall
		$dwCall = $dwAddress
		$dwAddress = $tmp
	EndIf

	Return Hex($dwCall - $dwAddress - 5, 8)
EndFunc   ;==>Calc

Func Byte_Reverse($sBytes)
	Local $sReversed = ""
	For $i = StringLen($sBytes) - 1 To 1 Step -2
		$sReversed &= StringMid($sBytes, $i, 2)
	Next
	Return $sReversed
EndFunc   ;==>Byte_Reverse

Func _AllocMem($ProcessId, $size)
	If $ProcessId == 0 Then Return SetError(1, "", False)
	$Kernel32 = DllOpen("kernel32.dll")
	If @error Then Return SetError(4, "", False)
	$hProcess = DllCall($Kernel32, "DWORD", "OpenProcess", "DWORD", 0x1F0FFF, "int", 0, "DWORD", $ProcessId)
	If @error Then Return SetError(6, "", False)
	$hModule = DllCall($Kernel32, "DWORD", "GetModuleHandleA", "str", "kernel32.dll")
	If @error Then Return SetError(7, "", False)
	$lpStartAddress = DllCall($Kernel32, "DWORD", "GetProcAddress", "DWORD", $hModule[0], "str", "LoadLibraryA")
	If @error Then Return SetError(8, "", False)
	$lpParameter = DllCall($Kernel32, "DWORD", "VirtualAllocEx", "int", $hProcess[0], "int", 0, "int", $size, "DWORD", 0x3000, "int", 4)
	If @error Then Return SetError(9, "", False)
	DllCall($Kernel32, "BOOL", "CloseHandle", "DWORD", $hProcess[0])
	DllClose($Kernel32)
	Return $lpParameter[0]
EndFunc   ;==>_AllocMem
 
Верх