C# 'Bir hata oluştu: Aritmetik işlem taşmayla sonuçlandı' hatası nasıl düzeltilir?

reddiington

Picopat
Katılım
24 Ekim 2024
Mesajlar
92
Çözümler
2
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar, kodlamayı bilmiyorum, eğer basit bir şeyse kusura bakmayın, sadece eğlencesine ChatGPT'ye yazdırıyorum. Game Builder Tycoon oyununa bir mod menü yaptırmaya çalışıyorum. 'Para Ekle' butonunu ekledim, her tıklamada mevcut paraya 10.000 eklemeyi amaçladım. Ancak her bastığımda şu hatayı alıyorum: 'Bir hata oluştu: Aritmetik işlem taşmayla sonuçlandı'. Eğer işe yararsa, oyundaki anlık para 43717, oyunda ise 43,72K olarak görünüyor.

Kod:

C#:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace GameBuilderTycoonTrainer
{
    public partial class Form1 : Form
    {
        // Gerekli Windows API fonksiyonlarını tanımlıyoruz
        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll")]
        public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref ulong lpBuffer, uint nSize, out uint lpNumberOfBytesRead);

        [DllImport("kernel32.dll")]
        public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref ulong lpBuffer, uint nSize, out uint lpNumberOfBytesWritten);

        // Belleğe okuma işlemi
        public static ulong ReadUInt64(IntPtr processHandle, IntPtr address)
        {
            ulong value = 0;
            uint bytesRead = 0;
            if (ReadProcessMemory(processHandle, address, ref value, 8, out bytesRead))
            {
                return value;
            }
            return 0; // Okuma hatası durumunda 0 döndür
        }

        // Belleğe yazma işlemi
        public static void WriteUInt64(IntPtr processHandle, IntPtr address, ulong value)
        {
            uint bytesWritten = 0;
            WriteProcessMemory(processHandle, address, ref value, 8, out bytesWritten);
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Form yüklendiğinde yapılacak işlemler
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Process[] processes = Process.GetProcessesByName("Game Builder Tycoon");
                if (processes.Length > 0)
                {
                    Process gameProcess = processes[0];
                    IntPtr moneyAddress = (IntPtr)0x13B164BFD38;  // Para adresi (doğru adresi kullandık)

                    IntPtr processHandle = OpenProcess(0x1F0FFF, false, gameProcess.Id);
                    if (processHandle != IntPtr.Zero)
                    {
                        // Mevcut para miktarını okuyoruz
                        ulong currentMoney = ReadUInt64(processHandle, moneyAddress);
                        if (currentMoney == 0)
                        {
                            MessageBox.Show("Oyun belleğinden para alınamadı!");
                            return;
                        }

                        // Eklemek istediğimiz miktar
                        ulong addAmount = 10000;

                        // Para eklemeden önce taşma kontrolü
                        if (currentMoney > ulong.MaxValue - addAmount)
                        {
                            // Para eklerken taşma olursa, maksimum değeri yaz
                            ulong newMoney = ulong.MaxValue;
                            WriteUInt64(processHandle, moneyAddress, newMoney);
                            MessageBox.Show($"Para eklerken taşma meydana geldi! Maksimum değere ulaşıldı: {newMoney}");
                        }
                        else
                        {
                            // Taşma olmayacaksa, yeni para miktarını hesapla ve yaz
                            ulong newMoney = currentMoney + addAmount;
                            WriteUInt64(processHandle, moneyAddress, newMoney);
                            MessageBox.Show($"Para başarıyla eklendi! Yeni para: {newMoney}");
                        }
                    }
                    else
                    {
                        MessageBox.Show("Oyun belleğine erişilemedi!");
                    }
                }
                else
                {
                    MessageBox.Show("Oyun bulunamadı!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Bir hata oluştu: {ex.Message}");
            }
        }
    }
}
 
Belki de bu saatte baktığım için göremedim ama bana kod normal geldi. Oyun 64 bit ise sorun olmamalı. Belki aralara message prompt koyarak sorunun tam olarak nerede olduğunu yakalayabilirsin. Mesela:

C#:
public static void WriteUInt64(IntPtr processHandle, IntPtr address, ulong value)
{
    uint bytesWritten = 0;
    bool success = WriteProcessMemory(processHandle, address, ref value, 8, out bytesWritten);

    if (!success || bytesWritten != 8)
    {
        MessageBox.Show($"Belleğe yazma işlemi başarısız oldu. Yazılan byte sayısı: {bytesWritten}");
    }
}
 
1731539006394.png
@WAR10CK
şöyle bir şey geldi
 
Geri
Yukarı