黃易群俠傳M脫機外掛應用程式黃易神行
3910
13

[發問] 寫外掛遇到一些問題

a0912398712 發表於 2009-11-2 19:59:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |
版上的大大們都是使用VB6在撰寫
小弟是使用VB2008,所以小弟自己動手修改一些VB2008跟VB6
語法OR(caption把它換成textbox之類的)的差異
目前遇到兩個問題
1.雙視窗可以使用 但是他會把我的視窗標題整個消掉
   而不是變成像是原碼寫的 變成 Element Client&i
2.讀取腳色資料沒法讀取

附上小弟的原碼
  1. Public Class Form1

  2. '====================================================================================API Define

  3. Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
  4. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
  5. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByRef lpdwProcessId As Integer) As Integer

  6. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  7. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  8. Private Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Long, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

  9. Dim pid As Long
  10. Const PW_Base = &H95BAA4
  11. Dim W2I_DYNAMIC_BASE_ADDR As Long
  12. Dim W2I_ROLE_BASE_ADDR As Long
  13. Const PROCESS_ALL_ACCESS = &H1F0FFF

  14. Dim hp As Long, mp As Long, maxhp As Long, maxmp As Long, genki As Long
  15. Dim name_temp As Long
  16. Dim pplname As String

  17. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  18. Dim proc As Long
  19. TextBox1.Text = "Element Client"

  20. proc = FindWindow(vbNullString, TextBox1.Text) 'Text1.text = 完美的視窗標題"Element Client"
  21. If proc > 0 Then '找到"Element Client"的完美視窗
  22. GetWindowThreadProcessId(proc, pid) '取得 process ID (pid)
  23. Label1.Text = "遊戲啟動! pid = " & pid
  24. Else '沒找到"Element Client"
  25. Label1.Text = "遊戲未啟動"
  26. End If

  27. End Sub
  28. '====================================================================================雙視窗
  29. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  30. Dim proc As IntPtr
  31. Dim i As Integer

  32. proc = FindWindow(vbNullString, TextBox1.Text)
  33. If proc.Equals(IntPtr.Zero) Then '找到完美視窗"Element Client"
  34. MsgBox("請先執行完美世界主程式。")

  35. Else
  36. i = 2
  37. Do While FindWindow(vbNullString, TextBox1.Text & i) <> 0 '找不重複的視窗標題"Element Client" + 數字(從2開始)
  38. i = i + 1
  39. Loop
  40. TextBox1.Text &= i
  41. 'Call SetWindowText(proc, TextBox1.Text) '修改視窗標題
  42. SetWindowText(proc, TextBox1.Text)
  43. MsgBox("修改完成,請開啟另一個完美世界主程式。")
  44. End If

  45. End Sub
  46. '====================================================================================連線上角色
  47. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

  48. Dim hProcess As Long
  49. hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pid) '連上完美遊戲
  50. If hProcess = 0 Then '無法連上完美遊戲
  51. MsgBox("not found")
  52. Exit Sub '離開
  53. End If


  54. ReadProcessMemory(hProcess, PW_Base, W2I_DYNAMIC_BASE_ADDR, 4, 0&) '一級基址
  55. ReadProcessMemory(hProcess, W2I_DYNAMIC_BASE_ADDR + &H20, W2I_ROLE_BASE_ADDR, 4, 0&) '人物基址


  56. ReadProcessMemory(hProcess, W2I_ROLE_BASE_ADDR + &H5F0, name_temp, 4, 0&) '得到角色名稱
  57. ReadProcessMemory(hProcess, name_temp, pplname, 32, 0&)
  58. Me.Text = pplname '設定外掛的視窗標題為角色名稱

  59. Timer1.Enabled = True '打開Timer, 以便每隔1秒讀取人物HP, MP,元氣

  60. CloseHandle(hProcess)
  61. End Sub

  62. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

  63. pid = 0
  64. lbHP.Text = "0 / 0" '清空HP
  65. lbMP.Text = "0 / 0" '清空MP
  66. lbGenki.Text = "0" '清空元氣
  67. Timer1.Enabled = False '取消Timer

  68. End Sub

  69. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

  70. Dim hProcess As Long
  71. ReadProcessMemory(hProcess, W2I_ROLE_BASE_ADDR + &H464, hp, 4, 0&) 'HP
  72. ReadProcessMemory(hProcess, W2I_ROLE_BASE_ADDR + &H468, mp, 4, 0&) 'MP
  73. ReadProcessMemory(hProcess, W2I_ROLE_BASE_ADDR + &H494, maxhp, 4, 0&) 'Max HP
  74. ReadProcessMemory(hProcess, W2I_ROLE_BASE_ADDR + &H498, maxmp, 4, 0&) 'MAx MP
  75. ReadProcessMemory(hProcess, W2I_ROLE_BASE_ADDR + &H478, genki, 4, 0&) '元氣

  76. lbHP.text = hp & " / " & maxhp '顯示現在HP / Max HP
  77. lbMP.text = mp & " / " & maxmp '顯示現在MP / Max MP
  78. lbGenki.text = genki '顯示現在元氣值

  79. End Sub
  80. End Class
複製代碼
收藏收藏 分享分享 讚 幹 分享分享 FB分享
回覆

使用道具 舉報


samhwu 當前離線
UID
1233736
熱心
117 值
嘉獎
0 次
違規
0 次
在線時間
88 小時
經驗
119 點
積分
119
精華
0
最後登錄
2013-3-17
閱讀權限
20
註冊時間
2009-6-9
論壇幣
1308 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
samhwu 2009-11-2 21:05:10
1.TextBox1.Text &= i
記得VB好像不接受這種語法(不確定2008是否可以)
2.我也不太確定,我猜基址應該不是目前版本(133)的吧,待高手.
回覆

使用道具 舉報

t347 當前離線
UID
1332849
熱心
68 值
嘉獎
0 次
違規
0 次
在線時間
101 小時
經驗
63 點
積分
63
精華
0
最後登錄
2013-1-6
閱讀權限
20
註冊時間
2009-10-17
論壇幣
280 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
t347 2009-11-2 21:20:56
基址應該不是目前的版本可以參考zsnoopy大大所提供的133基址
http://bbs.wgun.net/thread-311940-1-1.html
回覆

使用道具 舉報

agerchen 當前離線
UID
1307155
熱心
66 值
嘉獎
0 次
違規
0 次
在線時間
50 小時
經驗
66 點
積分
66
精華
0
最後登錄
2011-3-25
閱讀權限
20
註冊時間
2009-9-7
論壇幣
2176 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
agerchen 2009-11-3 01:46:55
setwindowtext 的原型宣告應該是
BOOL SetWindowText(
    HWND hWnd, // handle of window or control
    LPCTSTR lpString  // address of string
   );

你呼叫的方法是
SetWindowText(proc, TextBox1.Text)
textbox1.text <-- 這個應該不是 address of string
你應該要傳址進去,而不是傳值…
vb 我不熟,如果是 delphi 應該是 @textbox1.text (代表取得 textbox1.text 這段文字的記憶體位址)
希望對你有幫助。
先為不可勝
以待敵之可勝
回覆

使用道具 舉報

kj102 當前離線
UID
863146
熱心
41 值
嘉獎
0 次
違規
0 次
在線時間
20 小時
經驗
41 點
積分
41
精華
0
最後登錄
2010-10-15
閱讀權限
20
註冊時間
2008-5-20
論壇幣
302 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
5
kj102 2009-11-3 10:54:05
你用 vb2008 是 .net 個版本嗎?
不知為何我用 vb2008 時, ReadProcessMemory 的傳回值是 0 ... 相同的 code 在 vb6 可以執行 ...
但在 vb2008 就無法讀取角色資料 ...
所以暫時只能用回 vb6 ...
回覆

使用道具 舉報

qzxc123 當前離線
UID
1340914
熱心
27 值
嘉獎
0 次
違規
0 次
在線時間
3 小時
經驗
27 點
積分
27
精華
0
最後登錄
2010-1-3
閱讀權限
20
註冊時間
2009-10-29
論壇幣
673 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
6
qzxc123 2009-11-4 16:55:03
有 看 沒 有 懂 ? ?
新手.....好多問號 ???????????????
中挨挨挨挨~~~
回覆

使用道具 舉報

a0912398712 當前離線
UID
1123856
熱心
32 值
嘉獎
0 次
違規
0 次
在線時間
6 小時
經驗
32 點
積分
32
精華
0
最後登錄
2009-11-19
閱讀權限
20
註冊時間
2009-2-1
論壇幣
445 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
7
a0912398712 2009-11-16 21:02:04
雖然有一些熱心的大大給我了一些回文做解答

小弟也有另外去找人問過

她給我 senmessage 作為提示

可是不管我怎麼測試 setwindowtxt 跟 sendmessage 只有第一個能成功

修改視窗 只是會把視窗整個銷掉 應該是變成NULL我想 有人能幫解惑嗎?
回覆

使用道具 舉報

agerchen 當前離線
UID
1307155
熱心
66 值
嘉獎
0 次
違規
0 次
在線時間
50 小時
經驗
66 點
積分
66
精華
0
最後登錄
2011-3-25
閱讀權限
20
註冊時間
2009-9-7
論壇幣
2176 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
8
agerchen 2009-11-17 14:06:40
我去查了一下 vb ,取得位址的方法你要不要試試看...

SetWindowText(proc, VarPtr(TextBox1.Text))

參考自 http://support.microsoft.com/kb/199824/zh-tw
先為不可勝
以待敵之可勝
回覆

使用道具 舉報

a0912398712 當前離線
UID
1123856
熱心
32 值
嘉獎
0 次
違規
0 次
在線時間
6 小時
經驗
32 點
積分
32
精華
0
最後登錄
2009-11-19
閱讀權限
20
註冊時間
2009-2-1
論壇幣
445 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
9
a0912398712 2009-11-20 00:02:29
但是在2008裡並沒有VarPtr這個功能
我有去網路上找了模擬VB6的效果 可惜還是失敗
還是會把整個標題變成NULL

網址http://bbs.yoyo-do.com/viewthrea ... 3Borderby%3Dreplies
回覆

使用道具 舉報

agerchen 當前離線
UID
1307155
熱心
66 值
嘉獎
0 次
違規
0 次
在線時間
50 小時
經驗
66 點
積分
66
精華
0
最後登錄
2011-3-25
閱讀權限
20
註冊時間
2009-9-7
論壇幣
2176 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
10
agerchen 2009-11-20 13:40:20
那…如果這樣呢?

SetWindowText(proc, byref TextBox1.Text)
用 byref 的方式傳遞?
不好意思…我VB不熟,幫不上忙。
先為不可勝
以待敵之可勝
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

12下一頁

手機版 | Archiver | 外掛聯合國

GMT+8, 2024-11-24 15:51 , Processed in 0.061522 second(s), 16 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?