« 1 2» Pages: ( 1/2 total )
本页主题: [原創][VB]內存修改器制作教學-附源代碼 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

owenhk
级别: 家徒四壁


精华: 1
发帖: 55
威望: 3 点
金钱: 11 胜利币
贡献值: 0 点
在线时间:10(小时)
注册时间:2006-05-14
最后登录:2008-10-02

 [原創][VB]內存修改器制作教學-附源代碼

0
管理提醒:
本帖被 superttl 执行置顶操作(2008-02-17)
先說明一下~這只是想說怎樣用vb做出一個內存修改器,,,找出遊戲中的數據這裏就不講解了 這個教程對像是那些懂得用不同內存修改工具,如gamemaster那些但又不知怎做一個修改器出來的人士 好~~首先

說明一下用到的window api~主要有六條FindWindow,GetWindowThreadProcessId,OpenProcess,WriteProcessMemory,ReadProcessMemory,closehandle


下面就是這六條api及一個const~相關解釋用到時再說明~這些直接複製到模塊就行了
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Long, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function closehandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
Private Const PROCESS_ALL_ACCESS = &H1F0FFF


之後就要寫一點function了
Function FindGame() As Boolean '這是用來搜尋遊戲用的function
Dim GamehWnd As Long, Pid As Long, I As Long
hProcess = 0
For I = 0 To 3 '因為這個修改器是修改模擬器的有不同模擬器所以要讓使用者選擇不同的模擬器以搜尋
If Main.Emulator1(I).Checked = True Then
Select Case I
Case 0, 1
GamehWnd = FindWindow("EPSX", vbNullString) '這裏調用了FindWindow這條api,內容是搜EPSX類, vbNullString指是不用搜窗口名稱,之後把該視窗的Handle傳回
Case 2
GamehWnd = FindWindow("SSSPSX", vbNullString) '這條跟上面一樣指是搜尋SSSPSX類
Case 3
GamehWnd = FindWindow("pSX", vbNullString)'這也是大同小異搜尋的是pSXEnd Select '搜尋窗口類還是搜窗口名稱要看你的目標程式是什麼,不過個一建議用類會好點End If
Next
If GamehWnd = 0 Then Exit Function '如果搜不到窗口就跳出function
GetWindowThreadProcessId GamehWnd,ProcessID '調用GetWindowThreadProcessId這api,內容為取得GamehWnd的程序ID
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID) '調用OpenProcess這條api,PROCESS_ALL_ACCESS為const = &H1F0FFF ,這api為以PROCESS_ALL_ACCESS權限取得ProcessID的程序的handle,中間的false可以不用理,傳回的值為程序handle
If (hProcess = 0) Then Exit Function '如果獲取不動則跳出function
FindGame = True '最後成功獲得程序handle傳回true
End Function


Function ReadMem(vAdd As Long, L As Integer) As Long ''寫function而讀取內存,在用function時要輸入vADD及L兩個變數
Dim I As Long
For I = 0 To 3
If Main.Emulator1(I).Checked = True Then
Select Case I
Case 1
vAdd = vAdd - 4608
Case 2
vAdd = vAdd + 1067749824
Case 3
vAdd = vAdd + 23695840
End Select
End If '簡單解釋上面幾句就是在不同版本內存讀取地址要因選擇的模擬器不同而作出偏移
Next
Call ReadProcessMemory(hProcess, vAdd, result, L, 0&) '調用ReadProcessMemory這api,內容是讀取hProcess的內存地址為vAdd長度為L,數值傳回為result,0&是什麼我也不記得了....
ReadMem = result '把ReadMem這個function最後傳回為result
End Function


Function WriteMem(vAdd As Long, value As Long, L As Integer) '這其實跟讀取的差不多,多出的Value就是要寫入的數值,vADD同樣是地址,L同樣是長度
Dim I As Long
For I = 0 To 3
If Main.Emulator1(I).Checked = True Then
Select Case I
Case 1
vAdd = vAdd - 4608
Case 2
vAdd = vAdd + 1067749824
Case 3
vAdd = vAdd + 23695840
End Select
End If '這些同樣是因為多版本而作出地址偏移
Next
Call WriteProcessMemory(hProcess, vAdd, value, L, 0&) '這簡單說說就是把value寫入hProcess的vAdd內存地址,長度為L
End Function


到這裏基本上一個修改器已經構成出來了之後就要看你要有什麼功能了再說具體怎樣完成一個修改器完成模塊後就可以創建表單了,,,具體修改器是怎樣就各位自行設計了我在這裏引用一下我修改器一個按鈕再解釋一下吧Private Sub Modify_Click()'這是當Modify被按下時會執行以下程序,其實....這句有點廢話...當各位完全沒有接觸VB才解釋的...有接觸過的人不要罵我...
Select Case Now
Case 1
I = 0
Case 2
I = 144
Case 3
I = 288
Case 4
I = 432
Case 5
I = 576
Case 6
I = 720
Case 7
I = 864
Case 8
I = 1008
Case 9
I = 1152
End Select '以上是我根據我選擇了那個人物以讀取不同以要作出偏移,NOW是一個變數,我借NOW來檢查要改那個人物而決定要加的偏移數值,,其實這裏是可以簡單點不用這樣寫的...不過我當初是自學沒有想到其他方法所以程序變得很長了...請高手不要笑我...
Call WriteMem(&H6468D7 + I, Val(Lv), 1)'這就是調用之前寫的WriteMem function,地址為6468D7,數值為LV,val()是用來用把String轉為Double來讀取LV這個變數,長度為1
For P = 0 To 3
Call WriteMem(&H6468FC + I + P, Val(Status(P)), 1)
Next
For P = 0 To 3
Call WriteMem(&H6468F4 + I + P, Val(Status1(P)), 1)
Next
Call WriteMem(&H6468D8 + I, Val(EXP), 4)
Call WriteMem(&H6468E4 + I, Val(MaxHp), 2)
Call WriteMem(&H6468E6 + I, Val(MaxMp), 2)
Call WriteMem(&H6468EB + I, Val(MaxStone), 1)
Call WriteMem(&H6468DC + I, Val(NowHp), 2)
Call WriteMem(&H6468DE + I, Val(NowMp), 2)
Call WriteMem(&H6468E3 + I, Val(NowStone), 1)
Call WriteMem(&H646900 + I, Val(pic1), 1)
Call WriteMem(&H646901 + I, Val(skill1), 1)
For J = 0 To 4
EQtext1 = EQ1(J)
EQtext1 = code2(EQtext1) - 1
Call WriteMem(&H646905 + I + J, Val(EQtext1), 1)
Next
End Sub'其他就大同小異的不解釋了


之後就解釋一下讀取的情況了
Private Sub Command1_Click(Index As Integer)
If FindGame Then '先要調用function findgame如果為true才執行
.........
Lv = ReadMem(&H6468D7 + I, 1)'其實大部份東東也是大同小異的,這是讀取地址6468D7+I的數值長度為1,之後把結果傳回而LV則等於該值
..........End Sub
因為這個代碼較多就不會貼上了,只節錄一些出來好了


之前忘了說一點~~那就是關閉修改器時要調用closehandle~就要停止對該進程的調用
寫一個
Function closehandle1() As Long
GamehWnd = FindWindow("EPSX", vbNullString)
closehandle (GamehWnd)
End Function
當unload修改器時調用這個function就行了


這樣理論上一個內存修改器就完成了
另外那些有關動態內存就要用其他方法了~這裏就不說了
這主要就是教怎樣做出一個修改器了
師傅領進門,修改在個人嘛~呵呵呵~怎樣實現其他功能多想想就可以的了

還有歡迎轉貼...雖然不知對各位有沒有用...但還是貢獻一下,希望對各位有用吧...
如果轉貼加上作者:owenhk(細細粒)就行了~
[ 此贴被owenhk在2008-02-17 18:57重新编辑 ]
附件: FFIX.rar (148 K) 下载次数:65
本帖最近评分记录:
  • 威望:+1(superttl) WW++
  • 金钱:+30(superttl) 欢迎owenhk来到胜利,感 ..
  • 顶端 Posted: 2008-02-16 23:43 | [楼 主]
    allenluck
    级别: 家徒四壁


    精华: 0
    发帖: 21
    威望: 1 点
    金钱: 128 胜利币
    贡献值: 0 点
    在线时间:18(小时)
    注册时间:2006-06-19
    最后登录:2008-10-06

     

    顶楼主一下。请问一下如果把修改器改成使用时手动选择进程该怎么做
    顶端 Posted: 2008-02-17 06:37 | 1 楼
    superttl
    级别: 论坛版主


    精华: 1
    发帖: 578
    威望: 138 点
    金钱: 586 胜利币
    贡献值: 0 点
    在线时间:497(小时)
    注册时间:2006-04-20
    最后登录:2008-10-11

     

    Quote:
    引用第1楼allenluck于2008-02-17 06:37发表的  :
    顶楼主一下。请问一下如果把修改器改成使用时手动选择进程该怎么做

    可以参考楼主的源码
    Hold infinity in the palm of your hand, and eternity in an hour
    顶端 Posted: 2008-02-17 12:24 | 2 楼
    allenluck
    级别: 家徒四壁


    精华: 0
    发帖: 21
    威望: 1 点
    金钱: 128 胜利币
    贡献值: 0 点
    在线时间:18(小时)
    注册时间:2006-06-19
    最后登录:2008-10-06

     

    谢BZ谢楼主
    顶端 Posted: 2008-02-17 14:17 | 3 楼
    owenhk
    级别: 家徒四壁


    精华: 1
    发帖: 55
    威望: 3 点
    金钱: 11 胜利币
    贡献值: 0 点
    在线时间:10(小时)
    注册时间:2006-05-14
    最后登录:2008-10-02

     

    之前忘了要說在關閉修改器時要closehandle~~雖然感覺好像沒有什麼關係...但做人有點手尾吧用完就關閉好了...相關的東東已經加上了
    顶端 Posted: 2008-02-17 18:59 | 4 楼
    allenluck
    级别: 家徒四壁


    精华: 0
    发帖: 21
    威望: 1 点
    金钱: 128 胜利币
    贡献值: 0 点
    在线时间:18(小时)
    注册时间:2006-06-19
    最后登录:2008-10-06

     

    再请教一下。如果用下拉框或列表框来显示启动的所有进程供给使用者自己选择又该怎么做
    顶端 Posted: 2008-02-20 09:22 | 5 楼
    owenhk
    级别: 家徒四壁


    精华: 1
    发帖: 55
    威望: 3 点
    金钱: 11 胜利币
    贡献值: 0 点
    在线时间:10(小时)
    注册时间:2006-05-14
    最后登录:2008-10-02

     

    這...我也答不了你...我vb完全是自學的...很多東西也不太懂...
    但是我也幫你上網過...要做不是不能...但個人建議沒有必要還是不要這樣做...
    顶端 Posted: 2008-02-20 19:42 | 6 楼
    allenluck
    级别: 家徒四壁


    精华: 0
    发帖: 21
    威望: 1 点
    金钱: 128 胜利币
    贡献值: 0 点
    在线时间:18(小时)
    注册时间:2006-06-19
    最后登录:2008-10-06

     

    Quote:
    引用第6楼owenhk于2008-02-20 19:42发表的  :
    這...我也答不了你...我vb完全是自學的...很多東西也不太懂...
    但是我也幫你上網過...要做不是不能...但個人建議沒有必要還是不要這樣做...

    呵呵,本人也是接触这个不多就想请教一下。就是想做成如GM那样能选择的那种
    顶端 Posted: 2008-02-20 20:48 | 7 楼
    owenhk
    级别: 家徒四壁


    精华: 1
    发帖: 55
    威望: 3 点
    金钱: 11 胜利币
    贡献值: 0 点
    在线时间:10(小时)
    注册时间:2006-05-14
    最后登录:2008-10-02

     

    雖然我也沒有做過相關的東東~但我剛找到一個不錯的你可以看看
    下載點
    顶端 Posted: 2008-02-20 23:02 | 8 楼
    allenluck
    级别: 家徒四壁


    精华: 0
    发帖: 21
    威望: 1 点
    金钱: 128 胜利币
    贡献值: 0 点
    在线时间:18(小时)
    注册时间:2006-06-19
    最后登录:2008-10-06

     

    Quote:
    引用第8楼owenhk于2008-02-20 23:02发表的  :
    雖然我也沒有做過相關的東東~但我剛找到一個不錯的你可以看看
    下載點

    万分感谢楼上
    顶端 Posted: 2008-02-21 06:50 | 9 楼
    « 1 2» Pages: ( 1/2 total )
    帖子浏览记录 版块浏览记录
    胜利之歌超级论坛 » PC修改专区


    浙ICP备05022506号
    Total 0.429721(s) query 5, Time now is:10-11 12:17, Gzip enabled
    Powered by PHPWind v6.3.2 Certificate Code © 2003-08 PHPWind.com Corporation