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 :
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 :
Voilà le code source du programme. Je l'ai commenté pour ceux qui ne connaissent pas les pointeurs :
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.
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: