[CHEAT] Need For Speed Underground 2 tool-hack

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Jan 6, 2010
1,308
0
942
Non loin de ce forum
Bonjour,

voici un utilitaire que j'ai programmé pour NFS Underground 2, en AutoIt. Si je juge bon de vous le donner c'est surtout car j'utilise des pointeurs et des offsets, je pense donc que cela vous saura très utile, au moins à ceux qui savaient les trouver mais pas comment les placer avec AutoIt.

Voici une liste des choses intéressantes que vous pourrez trouver dans ce code source :

  • Écriture/lecture de valeurs et de différents types dans la mémoire
  • Utilisation des pointeurs et des offsets
  • Conversion de données en pourcentage
  • Affichage en temps réel d'une barre de progression en fonction d'une valeur mémoire

Normalement, tout bon programmeur de cheat(en AutoIt) se doit d'avoir l'include "NomadMemory", si vous ne l'avez pas, vous la trouverez facilement sur Internet. Cela dit, j'ai créé une fonction afin de pouvoir utiliser les pointeurs et offsets facilement :

PHP:
;==================================================================================
; Function:			_MemoryPointerToAdress($staticAdress,$arrayOffset,$memHandle,$type = 'dword')
; Description:		Gives the pointed adress from a pointer and offset.
; Parameter(s):		$adress : Adress of the pointer
;					$arrayOffset : Offset of the adress
; 					$memHandle : Handle from _MemoryOpen()
;					$type : Type of the value
; Return Value(s):	On Success - Returns next pointer adress
;					On Failure - Returns 0
;					@Error - 0 = No error.
;							 1 = Invalid $ah_Handle.
;							 2 = Unable to close the process handle.
; Author(s):		itachi26
; Note(s):
;==================================================================================

Func _MemoryPointerToAdress($adress,$arrayOffset,$memHandle,$type = 'dword')
	$rd = _MemoryPointerRead($adress,$memHandle,$arrayOffset,$type)
	If IsArray($rd) Then
		$split = StringSplit($rd[0],"")
		$lastpiece = ""
		For $i = 3 To UBound($split) -1
			If $i <= 10 Then
				Sleep(10)
			Else
				$lastpiece &= $split[$i]
			EndIf
		Next
		$lastpiece = "0x" & $lastpiece
		Return $lastpiece
	Else
		Return @error
	EndIf
EndFunc

Voilà le code source du programme. Je l'ai commenté pour ceux qui ne connaissent pas les pointeurs :
PHP:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Data\ico\nfs.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author: itachi26		- Gestion de la GUI
						- Fonctions
						- Recherche des adresses
						- Système

		 Drakka			- Explication sur les pointeurs
						- Récupération du PID

 Script Function: Cheat pour Need For Speed Underground 2.


#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

;~ Adresses :	- Argent : 0x00861E74
;~              - Profil (chargé) : 0x0083A9E0
;~              - NOS : 0x032BC744

#NoTrayIcon

#include <NomadMemory.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ProgressConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>

Global $process = "speed2.exe", $PID, $char, $iniSave = @ScriptDir & "\Data\config\saves.ini", $open, $init, $nfsMem

If Not ProcessExists($process) Then
	MsgBox(16,"Erreur","Le jeu n'est pas lancé.")
	Exit
EndIf

Global $Form1_1 = GUICreate("NFS Underground 2 - Tool hack", 578, 200, 208, 225)
Global $Group1 = GUICtrlCreateGroup("Informations", 8, 24, 201, 169)
Global $Label1 = GUICtrlCreateLabel("Profil chargé : NULL", 24, 56, 160, 17)
Global $Label2 = GUICtrlCreateLabel("Argent : NULL", 24, 88, 160, 17)
Global $Label3 = GUICtrlCreateLabel("NOS : NULL", 24, 120, 160, 17)
Global $Progress1 = GUICtrlCreateProgress(40, 160, 129, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group2 = GUICtrlCreateGroup("Modifications", 224, 24, 225, 169)
Global $Label5 = GUICtrlCreateLabel("Argent :", 240, 56, 44, 17)
Global $Input1 = GUICtrlCreateInput("NULL", 296, 56, 129, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER))
Global $Checkbox1 = GUICtrlCreateCheckbox("Argent infini", 264, 88, 113, 17)
Global $Checkbox2 = GUICtrlCreateCheckbox("NOS infini", 240, 120, 153, 17)
Global $Checkbox3 = GUICtrlCreateCheckbox("Effets NOS intensifiés", 264, 144, 129, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Button1 = GUICtrlCreateButton("Recharger", 464, 24, 97, 25)
Global $Button2 = GUICtrlCreateButton("Quitter le cheat", 464, 152, 97, 25)
Global $Button3 = GUICtrlCreateButton("Information", 464, 120, 97, 25)
Global $Button4 = GUICtrlCreateButton("Post du cheat", 464, 88, 97, 25)
GUISetState(@SW_SHOW)

If FileExists($iniSave) Then _UpdateGUI(true)

Global $money = 0x00861E74 ; adresse statique (facile à écrire)
Global $profile = 0x0083A9E0 ; adresse statique (facile à écrire)
Global Const $nosConst = 16000, $doubleNosConst = 32000
Global $nosStatAdress = 0x0089CDA8, $nosDyAdress = 0 ; Impossible d'utiliser en brute l'adresse du NOS, car celle-ci pointe seulement sur l'adresse dynamique
Dim $nosFirstOffset[2] = [0,0x58] ; première offset à utiliser
Dim $nosSecondOffset[2] = [0,0x41C] ; second offset à utiliser

$PID = ProcessExists($process) ; récupère le PID
$nfsMem = _MemoryOpen($PID) ; ouvre la mémoire

$nosDyAdress = _LastNOSAdress() ; on met à jour l'adresse dynamique

$init = TimerInit() ; timer pour la mise à jour automatique de la GUI
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_Exit()
		Case $Button1
			$moneyAsked = GUICtrlRead($Input1)
			If ($moneyAsked < 1000000) Then
				_MemoryWrite($money,$nfsMem,$moneyAsked) ; modifie l'argent
			Else
				MsgBox(16,"Erreur","Le montant est invalide.")
			EndIf
			$nosDyAdress = _LastNOSAdress() ; recharge l'adresse dynamique du NOS, celle-ci a tendance à changer selon les évènements
			_WriteSaves()
		Case $Button3
			MsgBox(64,"Information sur le cheat","Ce cheat a été programmé par itachi26, avec les explications assidues du membre Drakka. Ce programme est basé sur la modification des valeurs dans les différentes adresses mémoires consacrées au jeu, de plus, l'utilisation des pointeurs en font un programme tout le temps fiable sans aucune modification de votre part." & @CRLF & "Mode de jeu supporté : Carrière" & @CRLF & @CRLF & "itachi26 et Drakka vous souhaitent un bon jeu !")
		Case $Button2
			_Exit()
		Case $Button4
			_RunDos("start www.cheat-gam3.com")
	EndSwitch

	If TimerDiff($init) > 250 Then
		_UpdateGUI(false)
		$init = TimerInit()
	EndIf

	_UpdateGameDatas() ; met à jour les différentes valeurs

WEnd

#region functions
Func _UpdateGameDatas()
	If _IsChecked($Checkbox1) Then _MemoryWrite($money,$nfsMem,999999) ; si on coche argent infini
	If _IsChecked($Checkbox2) And _IsChecked($Checkbox3) Then ; si on coche NOS doublé + infini
		_MemoryWrite($nosDyAdress,$nfsMem,$doubleNosConst)
	ElseIf _IsChecked($Checkbox2) Then ; si on coche NOS infini
		_MemoryWrite($nosDyAdress,$nfsMem,$nosConst)
	EndIf
EndFunc

Func _UpdateGUI($bootMode) ; met à jour la GUI si le bot est déjà démarrer ou si c'est le premier démarrage
	Switch $bootMode
		Case True
		$uptMoneyOption = IniRead($iniSave,"Settings","infMoney","default")
		If $uptMoneyOption = "true" Then GUICtrlSetState($Checkbox1,$GUI_CHECKED)
		$uptNosOption = IniRead($iniSave,"Settings","infNOS","default")
		If $uptNosOption = "true" Then GUICtrlSetState($Checkbox2,$GUI_CHECKED)
		$uptDoubleNos = IniRead($iniSave,"Settings","intNOS","default")
		If $uptDoubleNos = "true" Then GUICtrlSetState($Checkbox3,$GUI_CHECKED)
	Case False
		GUICtrlSetData($Label1,"Profil : ")
		GUICtrlSetData($Label2,"Argent : ")
		GUICtrlSetData($Label3,"NOS : ")
		_GUICtrlUpdate_Label($Label1,_MemoryRead($profile,$nfsMem,'char[128]'))
		_GUICtrlUpdate_Label($Label2,_MemoryRead($money,$nfsMem))
		$readNos = _MemoryRead($nosDyAdress,$nfsMem)
		If _IsChecked($Checkbox3) Then
			$percent = _FlooredPercent($readNos,$doubleNosConst) ; calcule en pourcentage la quantité de NOS
			_GUICtrlUpdate_Label($Label3,_FlooredPercent($readNos,$doubleNosConst))
			GUICtrlSetData($Progress1,$percent) ; met à jour la ProgressBarr
		Else
			$percent = _FlooredPercent($readNos,$nosConst)
			_GUICtrlUpdate_Label($Label3,_FlooredPercent($readNos,$nosConst))
			GUICtrlSetData($Progress1,$percent)
		EndIf
	EndSwitch
EndFunc

Func _WriteSaves() ; enregistre les sauvegardes de l'utilisateur
	IniWrite($iniSave,"MySaves","profile",_MemoryRead($profile,$nfsMem))
	IniWrite($iniSave,"MySaves","cash",_MemoryRead($money,$nfsMem))
	If _IsChecked($Checkbox1) Then
		IniWrite($iniSave,"Settings","infMoney","true")
	Else
		IniWrite($iniSave,"Settings","infMoney","false")
	EndIf
	IniWrite($iniSave,"MySaves","NOS",_MemoryRead($nosDyAdress,$nfsMem))
	If _IsChecked($Checkbox2) Then
		IniWrite($iniSave,"Settings","infNOS","true")
	Else
		IniWrite($iniSave,"Settings","infNOS","false")
	EndIf
	If _IsChecked($Checkbox3) Then
		IniWrite($iniSave,"Settings","intNOS","true")
	Else
		IniWrite($iniSave,"Settings","intNOS","false")
	EndIf
	IniWrite($iniSave,"MySaves","car","default")
EndFunc

Func _GUICtrlUpdate_Label($lbl,$dt) ; met à jour les labels en conservant ce qu'il y'a à l'intérieur
	GUICtrlSetData($lbl,GUICtrlRead($lbl) & $dt)
EndFunc

Func _IsChecked($ToSee)
	Return BitAND(GUICtrlRead($ToSee), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func _Exit()
	_WriteSaves()
	_MemoryClose($nfsMem)
	Exit
EndFunc

Func _LastNOSAdress()
	$first = _MemoryPointerToAdress($nosStatAdress,$nosFirstOffset,$nfsMem,'dword') ; on chcerche à aller au premier pointeur
	$second = _MemoryPointerToAdress($first,$nosSecondOffset,$nfsMem,'dword') ; on cherche à atteindre l'adresse dynamique
	Return $second ; on retourne l'adresse dynamique pour le NOS
EndFunc

Func _FlooredPercent($toCalc,$max) ; on fait la moyenne du NOS selon la quantité de NOS choisie
	$toRet = Floor(($toCalc*100)/$max)
	Return $toRet
EndFunc

#endregion

Voilà tout. Si vous voulez voir le sujet dans la section Cheat, suivez ce lien.

EDIT : Et puisque l'on est là pour apprendre, si vous voulez avoir quelques explications sur les pointeurs, ou sur leur utilisation en AutoIt, faites-le moi savoir. Je peux comprendre que cette notion soit un peu floue.
 
Last edited: