Я работаю над обманом для одиночной игры. Мне нравится функциональная композиция, неизменность и код без шаблона, поэтому я решил написать чит в 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
'DllImport' в основном говорят, что вы все равно ничего не получите - если вы только что начали, пожалуйста, забудьте все вещи монады на данный момент – Carsten