取得Process程序裡的基址(baseAddress)和偏移(offset)就在另一篇另外說
名。
(1)如果有用過CE(Cheat Engine),就會知道可以直接寫入Assembly對程序進
行Hook的動作,只改寫原本的AOB(Array Of Bytes )或者是在另外跳躍至
自行宣告的記憶體函數來進行更多動作。在這一方面,我採用了原本CE
的AutoAssembler.dll,裡面已經帶有可以直接寫入Asm的函數,需要做的就
是去引入dll並且宣告,然後在自己的程序中就能直接對其他程序寫入ASM
。
(因為C#中沒辦法使用直接使用像_asm這種東西,可以看這個說明,自行用
C++做出可以讓C#調用的DLL,就像AutoAssembler.dll或者這個和這個。)
首先,我們先使用AutoASM來寫入
在C#中宣告加以調用
[DllImportAttribute("ceautoassembler.dll", EntryPoint = "CEInitialize")]
public static extern bool CEInitialize
(
int PassedPID,
IntPtr handle
);
[DllImportAttribute("ceautoassembler.dll", EntryPoint = "CEAutoAsm")]
public static extern bool CEAutoAsm
(
string script,
bool AllocID,
int Alloc
);
可以很清楚的看出他要我們傳進哪些訊息。在使用kernel32.dll裡的OpenProcess傳進pid和其他參數,取得Handle。
再來只要建一個TextBox讓使用者將Script貼上,再傳進CEAutoAsm就是
以前常見的打勾掛之一。
(2)直接使用kernel32.dll裡的ReadProcessMemory和WritePorcessMemory
下去寫入Bytes,寫入可以在其他地方用asm方式寫入看他的byte,記錄從多少
變為多少。讀取則是可以讀出byte後去翻譯成asm或者是其他資料型態(int,float)
然而這只使用nop去替代原本那一行而已,如果要加入更多動作應該要再跳躍到空白
記憶體去寫入AOB。那要怎找出空白記憶體呢? 在AutoASM中是用Alloc下去分配空白
記憶體給你,我想在這邊也許也可以先用AutoASM先分配記憶體,再去寫入指令。
又或者,去查找有哪邊的AOB是 00 00 00這種連續一大排的,然後空間夠你寫入動作
。


沒有留言:
張貼留言