【问题标题】:read/write another process memory monad in F#在 F# 中读/写另一个进程内存单子
【发布时间】:2016-02-26 06:21:22
【问题描述】:

我致力于单人游戏的作弊。我喜欢函数组合、不变性和没有样板的代码,所以这就是我决定用 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 

【问题讨论】:

  • DllImports 基本上说无论如何你都不会得到一个纯粹的东西 - 如果你刚刚开始那么请暂时忘记所有单子的东西

标签: f# functional-programming state-monad readprocessmemory io-monad


【解决方案1】:

恕我直言,您使用了错误的工具来完成这项工作。

您想故意引入不利于原作者的“无意”副作用,而您的语言旨在帮助您做相反的事情。

如果您想破解其他人的进程内存,我会说使用更传统的东西(C?)。此外,请检查您尝试破解的应用程序的许可证。您可能打算违反条款。

【讨论】:

  • 嗯,游戏本身是开源的。我可以只编辑源代码,但我想提高我的逆向工程技能。我也喜欢功能代码的简洁形式,所以我将继续使用 F# 并检查可以实现什么。
  • 可能很多,因为下面有 CLR(是这个名字吗?),但它不再是 F# ;)
  • 我喜欢有人点赞,但没有在答案下方发表评论... (-_-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多