1

Я работаю над обманом для одиночной игры. Мне нравится функциональная композиция, неизменность и код без шаблона, поэтому я решил написать чит в F #. Я закончил что-то, что прекрасно работает. Я знаю, что код далеко не идеальный, но сегодня я начал свое путешествие с F #.чтение/запись другой монады памяти процесса в F #

Интересно, есть ли способ как-то удалить побочные эффекты из моего кода. Не могли бы вы дать мне какой-то намек на то, как это можно достичь?

Спасибо,

Рафал

open System; 
open System.Diagnostics; 
open System.Runtime.InteropServices; 
open System.Text; 
open System.ComponentModel; 

let flip f x y = f y x 
let curry f a b = f (a,b) 
let uncurry f (a,b) = f a b 
type MemoryOperation = int -> int -> int -> byte[] 
//(f:int * int * byte[] * int * byref<int> -> bool) 

[<DllImport("kernel32.dll")>] 
extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId) 

[<DllImport("kernel32.dll")>] 
extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, int& lpNumberOfBytesWritten) 

//let WriteMemory hProcess lpBaseAddress dwSize = 
// let mutable buffer = Array.init dwSize byte 
// let mutable lpNumberOfBytesWritten = 0 
// WriteProcessMemory(hProcess, lpBaseAddress, buffer, dwSize, &lpNumberOfBytesWritten) |> ignore 
// buffer 

[<DllImport("kernel32.dll")>] 
extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, int& lpNumberOfBytesRead) 

let ReadMemory hProcess lpBaseAddress dwSize = 
    let mutable buffer = Array.init dwSize byte 
    let mutable lpNumberOfBytesRidden = 0 
    ReadProcessMemory(hProcess, lpBaseAddress, buffer, dwSize, &lpNumberOfBytesRidden) |> ignore 
    buffer 


let gameProcesses = Array.toList(Process.GetProcessesByName("gameName")) 

let openProcess (p: Process) = 
    let PROCESS_WM_READ = 0x0010 
    OpenProcess(PROCESS_WM_READ, false, p.Id) 


let readMemory<'a>(bitConverter:byte[] -> 'a)(length:int)(memoryOperation: MemoryOperation)(memory:int)(ptr:IntPtr) = 
    (memoryOperation ((int)ptr) memory length) |> bitConverter 


let bitConverter func = func 
         |> curry 
         |> flip <| 0 
         |> readMemory 

let intIO  = bitConverter BitConverter.ToInt32 4 
let booleanIO = bitConverter BitConverter.ToBoolean 1 
let charIO = bitConverter BitConverter.ToChar 1 

let readInt  = intIO  ReadMemory 
let readBoolean = booleanIO ReadMemory 
let readChar  = charIO ReadMemory 

//let writeInt  = intIO  WriteMemory 
//let writeBoolean = booleanIO WriteMemory 
//let writeChar = charIO WriteMemory 

let readHp = readInt 0x00A20D58 

[<EntryPoint>] 
let main argv = 
    while true do 
     gameProcesses |> (openProcess |> List.map) 
         |> (readHp |> List.map) 
         |> List.iter(printfn "%d") 
    0 
+0

'DllImport' в основном говорят, что вы все равно ничего не получите - если вы только что начали, пожалуйста, забудьте все вещи монады на данный момент – Carsten

ответ

0

ИМХО вы используете неправильный инструмент для работы.

Вы хотите преднамеренно ввести «непреднамеренный» побочный эффект, который идет вразрез с оригинальными авторами, в то время как ваш язык намеревается помочь вам сделать обратное.

Я бы сказал, что использовать что-то более традиционное (C?), Если вы хотите взломать память процесса другого. Также проверьте лицензию приложения, которое вы пытаетесь взломать. Вероятно, вы намерены нарушить условия.

+0

Ну, сама игра - с открытым исходным кодом. Я мог бы просто отредактировать исходный код, но я хочу улучшить свои обратные инженерные навыки. Мне нравится также краткая форма функционального кода, поэтому я останусь с F # и проверю, чего можно добиться. – NieMaszNic

+0

Наверное, много, потому что под ним есть CLR (это имя?), Но это больше не будет F #;) –