1

シングルプレイヤーゲームのチートに取り組んでいます。私は関数合成、不変性、ボイラープレートのないコードが好きなので、チートを 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 
4

1 に答える 1

0

仕事に間違ったツールを使用している私見。

元の作成者に反する「意図しない」副作用を意図的に導入したいのに対し、言語は反対のことを行うのに役立ちます。

他のプロセスメモリをハックしたい場合は、より伝統的なもの(C?)を使用すると思います。また、ハッキングしようとしているアプリケーションのライセンスを確認してください。あなたはおそらく規約に違反するつもりです。

于 2015-11-24T10:03:33.483 に答える