Jump to content

Welcome to [ iT ] Forums
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. If you already have an account, login here - otherwise create an account for free today!
Cộng đồng Âm nhạc Việt Nam

Hình ảnh

Lập trình auto Kiếm Thế thì vào đây!!!

* * * * * 2 Bình chọn

  • Please log in to reply
189 replies to this topic

#21
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:
Mình là dân gà nên ai là dân gà giống mình thì chúng ta đi tuần tự từ căn bản đến nâng cao nhé, chứ mới vô mà đọc 3 cái này thì chỉ có nước khùng :busy

Download CheatEngine55 chương trình này dùng để debug vùng nhớ.

Trước tiên mình xin góp một bài rất là căn bản là dùng CheatEngine55 để mà debug ra địa chỉ vùng nhớ nhé.

Dùng CheatEngine để debug địa chỉ vùng nhớ



1. Chạy chương trinh game lên và đăng nhập vào game

Posted Image
H1. Nhân vật proakam của mình


2. Chạy chương trình CheatEngine lên và vào chọn menu Process->game.exe để chọn Kiếm Thế

Posted Image
H2. Chọn Kiếm Thế


3. Gõ giá trị máu của bạn vào textbox value. Ví dụ của mình là 708

Posted Image
H3. Nhập giá trị máu 708/708 vào textbox Value


4. Bấm vào nút "First Scan" để mà bắt đầu tìm các vùng nhớ có giá trị 708. Khi nào nó tìm xong thì sẽ hiện thị tất cả các vùng nhớ có giá trị 708 vào "Found:xxx". Nó thường có rất nhiều kết quả cho lần "First Scan"

Posted Image
H4. Kết quả của "First Scan" vùng nhớ có giá trị 708


5. Vì "First Scan" nó cho kết quả nhiều quá do đó chung ta phải lọc bớt các giá trị không đúng. Bạn vào game đem con tướng cho nó đi đánh quái để bớt đi một lượng máu (tìm con nào yếu thôi, không thì nó đánh chết đó).

Posted Image
H5. Cho quái đánh mất bớt một lượng máu


6. Quay lại chương trình CheatEngine ngồi canh gỏ vào số lượng máu còn lại rồi sau đó bấm "Next Scan", lúc đó CheatEngine sẽ tìm trong những vùng nhớ trong lần "First Scan" xem có vùng nhớ nào có giá trị này không. Ví dụ mình còn 593 mình gỏ vào textbox value giá trị 593 sau đó bấm "Next Scan". Lúc đó nó cho mình 2 giá trị. Và bạn sẽ thấy 2 giá trị (value) này sẽ tăng dần theo số lượng máu được phục hồi trong game. Như vậy là OK rồi đó

Posted Image
H6. "Next Scan" với số máu là 593


7. Giờ mình sẽ hướng dẫn các bạn cách tìm địa chỉ vùng nhớ KNPC_BASE_ADD. Bạn double click vào 2 dòng kết quá tìm được (trong Found:2 đó), khi đó nó sẻ thêm 2 dòng này vào cái lưới phía bên dưới. Bạn kích chuột phải vào một dòng nào đó chọn "Find out what accesses this address" để nó mở cửa sổ "The following opcodes accessed the select..." để theo giỏi sự truy cập vùng nhớ này.

Posted Image
H7. Theo giỏi sự truy cập vùng nhớ 0284B368


8. Giờ quay lại game chơi, ví dụ cho nhân vật nó chạy tới chạy lui hay làm gì đó khi nào trong cửa sổ "The following opcodes accessed the select..." có thêm các dòng lệnh asm mov.... thì dừng lại vào xem nhé.

Posted Image
H8. Cửa sổ theo giỏi sự truy cập vùng nhớ 0284B368


9. Giờ bạn double click vào một dòng nào đó (những dòng lệnh mov mới đó). Nó sẽ mở cửa sổ Extra Info nó cho biết thông tin chi tiết của dòng lệnh đó

Posted Image
H9. Thông tin chi tiết của dòng lệnh mov ecx,[eax+edx+00000338]


10. Hãy chú ý nhé: Dòng lệnh phía trên (dòng được bôi đỏ ở H9) nó chính là địa chỉ KNPC_BASE_ADD.

Thế là có một chút cơ sở để debug vùng nhớ rồi đó, các bác cố mà nhai ASM để mà đọc hiểu hơn (mình đang nhai muốn đuối quá :dede ).

Chúc các bạn thành công nhé :dede

Bài viết này được chỉnh sửa bởi Huỳnh Văn Thâm: 06 October 2009 - 01:38 PM


#22
Rong Dia Nguc

Rong Dia Nguc

    Thành viên mới

  • Member
  • 38 Bài Viết:
Bác OSND để ý chỗ này (xem trên hình hướng dẫn debug của bác Thâm):
imul edx, edx, 0000b00c
mov eax, [0078aeac]
mov ecx, [eax+edx+00000338]

Như vậy trong code của bác, chỗ
StaticAddress = TempAddress + SCORE_OFFSET
cần sửa lại thành
Const KNPC_SIZE As Long = &HB00C
StaticAddress = TempAddress + KNPC_SIZE + SCORE_OFFSET

P/S: Lý thuyết là thế nhưng không hiểu tại sao tớ cũng ko lấy được giá trị máu của nhân vật, do giá trị &HB00C bị VB hiểu là giá trị -20468 (âm), trong khi nó phải là 45068, không biết trên máy các bác thế nào, hoặc bác nào hiểu vấn đề này thì nói cho mọi người cùng biết nhé!

Bài viết này được chỉnh sửa bởi Rong Dia Nguc: 06 October 2009 - 01:03 PM


#23
mocluu

mocluu

    Trung cấp CSTH

  • Advance Member
  • PipPipPip
  • 263 Bài Viết:

P/S: Lý thuyết là thế nhưng không hiểu tại sao tớ cũng ko lấy được giá trị máu của nhân vật, do giá trị &HB00C bị VB hiểu là giá trị -20468 (âm), trong khi nó phải là 45068, không biết trên máy các bác thế nào, hoặc bác nào hiểu vấn đề này thì nói cho mọi người cùng biết nhé!

Bác khai báo thế này sẽ không bị âm
Const KNPC_SIZE As Long = &HB00C&
Nhớ là &HB00C& :dede
Xem tử vi để biết bản đồ của đời người. Biết mà chuẩn bị kỹ càng và vươn lên trên số phận con người.

#24
Tru Bat Gioi

Tru Bat Gioi

    Upload Team

  • VIP
  • PipPipPipPipPip
  • 1320 Bài Viết:

Bác OSND để ý chỗ này (xem trên hình hướng dẫn debug của bác Thâm):

imul edx, edx, 0000b00c
mov eax, [0078aeac]
mov ecx, [eax+edx+00000338]

Như vậy trong code của bác, chỗ
StaticAddress = TempAddress + SCORE_OFFSET
cần sửa lại thành
Const KNPC_SIZE As Long = &HB00C
StaticAddress = TempAddress + KNPC_SIZE + SCORE_OFFSET

P/S: Lý thuyết là thế nhưng không hiểu tại sao tớ cũng ko lấy được giá trị máu của nhân vật, do giá trị &HB00C bị VB hiểu là giá trị -20468 (âm), trong khi nó phải là 45068, không biết trên máy các bác thế nào, hoặc bác nào hiểu vấn đề này thì nói cho mọi người cùng biết nhé!


Cái này là lỗi cơ bản, VB để số hex không có giá trị âm thì phải khai báo &HB00C&

#25
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:
Nhớ đọc bài debug trước rồi hãy đọc bài này nha các bác, đừng vội quá rồi nhức đầu ráng chịu đó nha :jeje:
Tiếp theo mình sẽ hướng dẫn các bạn cách đọc thông tin máu nhé.

Cách đọc thông tin máu bằng VB6.0


1. Quay lại hình này nhé.
Posted Image
Bạn hãy để ý dòng lệnh sau:
mov eax, [0078aeac]
mov ecx, [eax+edx+00000338]
Trước tiên nó move giá trị [0078aeac] vào thanh gi EAX, sau đó nó move giá trị [eax+edx+00000338] vào thanh gi ecx như vậy bạn phải. Biết giá trị của các thanh ghi eax, edx

- Muốn biết giá trị của thanh ghi eax là bao nhiêu thì bạn phải đọc giá trị tại vùng nhớ [0078aeac] lấy ra 4 byte. (trong hình nó chính là 02840024)
- Muốn biết giá trị thanh ghi edx thì bạn nhìn vào hình đó nó chính là B00C
- Như vậy là bạn đã biết cách lấy thông tin máu rồi đó (Đọc giá trị vùng nhớ [02840024 + B00C + 00000338])

2. Codes VB lấy thông tin máu
Const PROCESS_VM_OPERATION As Long = &H8
Const PROCESS_VM_READ As Long = &H10
Const PROCESS_VM_WRITE As Long = &H20
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Const NPC_BASE_ADD = &H78AEAC
Const NPC_DATA_SIZE = &HB00C&
Const NPC_CURLIFE_OFFSET = &H338
Const NPC_MAXLIFE_OFFSET As Long = &H334

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 ReadProcessMemory 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 WriteProcessMemory Lib "kernel32" _
	(ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
	(ByVal hObject As Long) As Long

Private Sub Form_Load()
	Dim hKTWindow&, dwProcessId&, dwThreatID&, hProcess&
	Dim lpBaseAdd&, lpCurAdd&, bRead As Boolean
	Dim dwCurHP&
	
	hKTWindow = FindWindow("_Class", vbNullString)
	If hKTWindow = 0 Then Exit Sub
	GetWindowThreadProcessId hKTWindow, dwProcessId
	hProcess = OpenProcess(PROCESS_VM_READ, False, dwProcessId)
	
	'Get Current HP
	bRead = ReadProcessMemory(hProcess, NPC_BASE_ADD, lpBaseAdd, 4, 0&) '
	If bRead = True Then
		lpCurAdd = lpBaseAdd + NPC_CURLIFE_OFFSET + NPC_DATA_SIZE
		bRead = ReadProcessMemory(hProcess, lpCurAdd, dwCurHP, 4, 0&)
		If bRead = True Then
			MsgBox CStr(dwCurHP)
		Else
			''
		End If
	End If
	Call CloseHandle(hProcess)
	End
End Sub

3. Codes = C# (đang code :P )
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication2
{
	public partial class Form1 : Form
	{
		[DllImport("user32", EntryPoint = "FindWindowA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
		public static extern int FindWindow(string lpClassName, string lpWindowName);
		[DllImport("user32", EntryPoint = "FindWindowExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
		public static extern int FindWindowEx(int hWnd1, int hWnd2, string lpsz1, string lpsz2);		
		[DllImport("user32.dll")]
		public static extern uint GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);
		[DllImport("kernel32.dll")]
		public static extern int OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

		[DllImport("kernel32.dll")]
		static extern bool ReadProcessMemory(
			IntPtr hProcess,
			IntPtr lpBaseAddress,
			byte[] lpBuffer,
			int dwSize,
			int lpNumberOfBytesWritten
		); 
	

		[DllImport("kernel32.dll")]
		public static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, byte lpBuffer, int nSize, int lpNumberOfBytesWritten);

		private int PROCESS_VM_OPERATION = 0x8;
		private int PROCESS_VM_READ = 0x10;
		private int PROCESS_VM_WRITE = 0x20;
		private int PROCESS_ALL_ACCESS = 0x1F0FFF;

		private int NPC_BASE_ADD = 0x78AEAC;
		private int NPC_DATA_SIZE = 0xB00C;
		private int NPC_CURLIFE_OFFSET = 0x338;
		private int NPC_NAME_OFFSET = 0xAC6C;

		private int NPC_MAXLIFE_OFFSET = 0x334;

		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			int hKTWindow, dwProcessId, dwThreatID, hProcess;
			int lpBaseAdd, lpCurAdd;
			bool bRead;
			int dwCurHP, dwMaxHP;
			string szName;
			hKTWindow = FindWindow("_Class", null);
			if (hKTWindow == 0) Application.Exit();
			GetWindowThreadProcessId( hKTWindow,out dwProcessId);
			hProcess = OpenProcess(PROCESS_VM_READ, false, dwProcessId);
			
			byte[] buffer = new byte[4];
			bRead = ReadProcessMemory((IntPtr)hProcess, (IntPtr)NPC_BASE_ADD, buffer, buffer.Length, 0);
			lpBaseAdd = (int)BitConverter.ToUInt32(buffer, 0);
			lpCurAdd = lpBaseAdd + NPC_CURLIFE_OFFSET + NPC_DATA_SIZE;

			bRead = ReadProcessMemory((IntPtr)hProcess, (IntPtr)lpCurAdd, buffer, buffer.Length, 0);
			dwCurHP = (int)BitConverter.ToUInt32(buffer, 0);
			MessageBox.Show(dwCurHP.ToString());
		}
	}
}
Chúc các bạn thành công

Bài viết này được chỉnh sửa bởi Huỳnh Văn Thâm: 06 October 2009 - 07:45 PM


#26
heejin

heejin

    Thành viên mới

  • Newbies
  • 8 Bài Viết:
Const NPC_MAXLIFE_OFFSET As Long = &H334
sao biết max life là 334 vậy bác??

#27
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:

Const NPC_MAXLIFE_OFFSET As Long = &H334
sao biết max life là 334 vậy bác??

Lấy 338 - 4 = 334 :yes đùa cho vui thôi chứ cách làm phía dưới đó bác

Thì bạn tìm ra cái địa chỉ của nó là biết liền hà nó = [eax + 334], quay lại bài debug nha bạn :d, vì chưa test nên không biết 334 có đúng không nữa :d, hồi nãy bạn cho CurLife thay đổi, giờ cho MaxLife thây đổi :d . Tập debug đi bạn cho nó quen, mình thấy cũng tương đối khó, nhưng làm vài lần là quen liền :d


@ALL: Chúng ta nên thống nhất cách đặt tên biến đi các bạn, sau này thảo luận sẽ dẻ hơn :d

Bài viết này được chỉnh sửa bởi Huỳnh Văn Thâm: 06 October 2009 - 03:59 PM


#28
mocluu

mocluu

    Trung cấp CSTH

  • Advance Member
  • PipPipPip
  • 263 Bài Viết:
Lớp NPC ở kiếm thế hơi khác với võ lâm 1 chút. Em kiểm tra thấy:
Quái là 0 , hoặc không có gì game cũng gán giá trị 0
Người là 1
NPC (như Bao vạn đồng) là 3
Điểm chuyển tiếp giữa các map (cái cột sáng màu vàng đẹp đẹp gần cửa các map) là 4
NPC không ghi tên trên đầu (như npc lính ở cổng thành) là 5 (cái này em ko chắc lắm, đoán là vậy 8-> )
Xem tử vi để biết bản đồ của đời người. Biết mà chuẩn bị kỹ càng và vươn lên trên số phận con người.

#29
ƠNSD

ƠNSD

    Thành viên mới

  • Newbies
  • 10 Bài Viết:
#33 : cái này mình đã làm đc rồi rất là cảm ơn bạn.
cho mình hỏi tiếp là đoạn mã trên chỉ bắt đc cái tài khoản mở đầu tiên thôi .. nhưng mà mình có 3 tài khoản lận .. vậy nêu muốn hiển thị cả 3 chỉ số hp của 3 tài khoản đó vào
MsgBox CStr(dwCurHP)
thì chúng ta phải làm sao đây ?

#30
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:

#33 : cái này mình đã làm đc rồi rất là cảm ơn bạn.
cho mình hỏi tiếp là đoạn mã trên chỉ bắt đc cái tài khoản mở đầu tiên thôi .. nhưng mà mình có 3 tài khoản lận .. vậy nêu muốn hiển thị cả 3 chỉ số hp của 3 tài khoản đó vào

MsgBox CStr(dwCurHP)
thì chúng ta phải làm sao đây ?

Thì quét cả 3 chứ sao bạn, cái này dùng vòng lập mà quét
Dim hwnd As Long
	Dim s As String
	hwnd = FindWindowLong(ByVal 0&, ByVal 0&)
	Do While hwnd <> 0
		sWClass = GetClassHandle(hwnd)
		sWCaption = GetCaptionHandle(hwnd)
		If sWClass = "_Class" and  sWCaption = "Kiếm Thế" Then
		   'Đọc thông tin máu 
		End If
		
		hwnd = GetWindow(hwnd, GW_HWNDNEXT)
	Loop


#31
mocluu

mocluu

    Trung cấp CSTH

  • Advance Member
  • PipPipPip
  • 263 Bài Viết:

@ALL: Chúng ta nên thống nhất cách đặt tên biến đi các bạn, sau này thảo luận sẽ dẻ hơn :bong

Cái này hay đó, em ủng hộ bác 1 phiếu. Em đề nghị là cấu trúc của Kiếm Thế khá giống với võ lâm 1 nên ta lấy 1 bảng Address ở trong box võ lâm làm chuẩn. Ví dụ như bản Add/Offset của bác Oxconan chẳng hạn http://forum.cuasoti...showtopic=51523
Xem tử vi để biết bản đồ của đời người. Biết mà chuẩn bị kỹ càng và vươn lên trên số phận con người.

#32
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:

@ALL: Chúng ta nên thống nhất cách đặt tên biến đi các bạn, sau này thảo luận sẽ dẻ hơn :bong

Cái này hay đó, em ủng hộ bác 1 phiếu. Em đề nghị là cấu trúc của Kiếm Thế khá giống với võ lâm 1 nên ta lấy 1 bảng Address ở trong box võ lâm làm chuẩn. Ví dụ như bản Add/Offset của bác Oxconan chẳng hạn http://forum.cuasoti...showtopic=51523

Cái đó chuẩn đó. Em đi tiên phong đi mocluu :dede có gì share cái codes của em cho anh tham khảo với nha :))

#33
kebaothu

kebaothu

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 197 Bài Viết:
Cái này là Auto Kiem The Trung Quốc các bác tự nghiên cứu nhé

软件大小:516KB
软件语言:简体中文
软件类型:免费软件 / 免费下载
运行环境:win2000/winxp/win2003
更新日期:2009-03-12
软件评价:★★★★★
授权方式:免费辅助


软件简介:

9 随游戏更新到1.1.73 增加老包任务次数设置,高级装备任务取消,任务奖励支持[4
级玄晶][3级玄晶][经验][取消][绑定 银两] 这样的格式将不会选择2级玄晶

包裹中需要一个无限回城符(一定要是回城符,不是传送符

第一次需要设定练级点,练级点必须在设定回城的城市附近

包包打怪任务90级以上的怪都做了坐标,如果是90级以下需要
行设定,按HOME键可读取到当前地图坐标,设置文件为 killnpc.txt。
jx_main.lua是开源脚本,懂lua的可自行修改,也可以使用 Y_jxdofile 函数执行自己定义脚本。
目前处于测试中,很多都不完善,包括这个说明。有编程经
的可以参与到制作中来,欢迎在论坛进行讨论。

功能:
全自动包包任务(包括自动制作装备,自动买所需材料)
循环打怪系统(战斗系统使用剑侠原有系统,包包起到连接
用,回城买菜,修理,合玄)

Dịch by Google

Software size: 516KB
Software language: Simplified Chinese
Software Type: Free Software / Free Download
Runtime Environment: win2000/winxp/win2003
Update :2009-03-12
Rating: ★ ★ ★ ★ ★
License: Free-assisted


Software Description:

9 With the game updated to the 1.1.73 task number is set to increase the old package, advanced equipment, the task cancellation, task incentive support [4 mysterious crystal] [3 mysterious crystal] [Experience] [Cancel] [bound versus] such a format will be would not choose two Xuan Jing

Package needs to return to the city an infinite operator (it must be a return to the city symbol, not the transmission operator).
Lian Ji, the first need to set point, Lian Ji-point must be set back to the city around the city.
Bags Daguai task for more than 90 have done strange coordinates, if it is 90 the following needs of their own settings, press HOME key to read to the current map coordinates, set the file to killnpc.txt.
jx_main.lua is open source script, understand the lua that can modify, you can also use the Y_jxdofile implement their own definition of the function script.
Is currently in testing, many are not perfect, including this description. Programming experience can participate in the production, the welcome in the forum discussions.

Features:
Automatic bag tasks (including automatic production equipment, automatic buy the necessary materials)
Cycle Daguai systems (combat system uses the swordsman of the original system, bags play a connecting role, back to the city shopping, repairs, co-Hyun)


Link
http://www.hackbot.cn/wgrj/xin/jianxia/jxbb19.rar

Thời Gian Làm Ta Lớn , Internet làm ta khôn

#34
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:

code này mà viết bằng VB6 đố chạy được, hehe!

Codes giả mà anh code thật nè
Const PROCESS_VM_OPERATION As Long = &H8
Const PROCESS_VM_READ As Long = &H10
Const PROCESS_VM_WRITE As Long = &H20
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Const NPC_BASE_ADD = &H78AEAC
Const NPC_DATA_SIZE = &HB00C&
Const NPC_CURLIFE_OFFSET = &H338
Const NPC_MAXLIFE_OFFSET As Long = &H334

Const GW_HWNDNEXT = 2
Const MAX_PATH = 260

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 ReadProcessMemory 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 WriteProcessMemory Lib "kernel32" _
	(ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
	(ByVal hObject As Long) As Long
Private Declare Function FindWindowLong Lib "user32" Alias "FindWindowA" _
	(ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetWindow Lib "user32" _
	(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
	(ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
	(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Sub Form_Load()
	GetALLHP
End Sub
Public Function GetALLHP()
	Dim sWClass$, sWCaption$
	
	Dim hwnd As Long
	
	hwnd = FindWindowLong(ByVal 0&, ByVal 0&)
	Do While hwnd <> 0
		sWClass = GetClassHandle(hwnd)
		sWCaption = GetCaptionHandle(hwnd)
		If sWClass = "_Class" And Len(sWCaption) > 2 Then
			If Mid(sWCaption, 1, 2) = "Ki" Then
				MsgBox GetHP(hwnd)
			End If
		End If
		
		hwnd = GetWindow(hwnd, GW_HWNDNEXT)
	Loop
End Function

Public Function GetHP(hKTWindow As Long) As Long
	Dim dwProcessId&, dwThreatID&, hProcess&
	Dim lpBaseAdd&, lpCurAdd&, bRead As Boolean
	Dim dwCurHP&
	
	GetWindowThreadProcessId hKTWindow, dwProcessId
	hProcess = OpenProcess(PROCESS_VM_READ, False, dwProcessId)
	
	'Get Current HP
	bRead = ReadProcessMemory(hProcess, NPC_BASE_ADD, lpBaseAdd, 4, 0&) '
	If bRead = True Then
		lpCurAdd = lpBaseAdd + NPC_CURLIFE_OFFSET + NPC_DATA_SIZE
		bRead = ReadProcessMemory(hProcess, lpCurAdd, dwCurHP, 4, 0&)
	End If
	Call CloseHandle(hProcess)
	GetHP = dwCurHP
End Function

Public Function GetClassHandle(lhnd As Long) As String
	Dim strClass As String
	strClass = Space$(MAX_PATH)
	Call GetClassName(lhnd, strClass, 255)
	strClass = Left$(strClass, InStr(strClass, vbNullChar) - 1) '
	GetClassHandle = strClass
End Function

Public Function GetCaptionHandle(lhnd As Long) As String
	Dim strCaption As String
	lStrLen = MAX_PATH
	strCaption = Space$(MAX_PATH)
	Call GetWindowText(lHandle, strCaption, lStrLen)
	lStrLen = GetWindowText(lhnd, strCaption, lStrLen)
	strCaption = Left$(strCaption, lStrLen) '
	GetCaptionHandle = strCaption
End Function


#35
kirimaru

kirimaru

    Cử nhân CSTH

  • VIP
  • PipPipPipPipPip
  • 1085 Bài Viết:
Mới phát hiện ra một địa chỉ toàn hàm quen thuộc:
#define SENDCLIENTCMDSKILL 0x06DA1F0
Cứ dò trong khoảng địa chỉ này sẽ thấy :-??

#36
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:

Sao tui thấy cách tìm base address của ông thâm sao mà khó quá. với lại tìm theo cách nầy nghe nói khi game cập nhật thì phải tìm lại nó phải không?

Tui thì tui dùng art money tìm pointer và offset để read/write memory thì thấy sài rất ổn. game update thì vẫn dùng bình thường.

Vậy giữa hai cách nầy có gì khác nhau không các bạn?

Thì mình học lại cách của mấy anh bên VL mà bạn, vì muốn làm tài liệu sau này dùng luôn nên soạn lên cho các bạn tham khảo luôn, bạn có cách nào hay chỉ cho anh em gà gà như mình biết với, chứ đang làm cái Run thôi mà khó quá nè :chair, chưa biết debug thông tin hàm run như thế nào hết x(

Bài viết này được chỉnh sửa bởi Huỳnh Văn Thâm: 08 October 2009 - 09:24 AM


#37
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:
Anh mondothienvuong ơi cho em hỏi giá trị NPC_CMD_OFFSET hay NPC_SendCommand là bao nhiêu vậy?

#38
zeuspnt00

zeuspnt00

    Trung cấp CSTH

  • Advance Member
  • PipPipPip
  • 454 Bài Viết:
Ai chỉ em cách đọc tên nhân vật với, em làm
Dim bValue As Byte, i As Byte
	lpCurAdd = lpBaseAdd + NPC_NAME_OFFSET + NPC_DATA_SIZE
	For i = 1 To 32
		bRead = ReadProcessMemory(hProcess, lpCurAdd + i - 1, bValue, 1, 0&)
		If bValue > 0 Then szName = szName + Chr$(bValue)
	Next
	Text1.Text = szName

nó hông ra gì luôn @@
Ngã phải đứng dậy
Bại rồi mới thành công

#39
Huỳnh Văn Thâm

Huỳnh Văn Thâm

    Thạc sĩ CSTH

  • VIP
  • PipPipPipPipPipPip
  • 2364 Bài Viết:

#define NPC_COMMAND_OFF 0xACC8

Em cảm ơn anh nha, em đang làm hàm Run :busy

Ai chỉ em cách đọc tên nhân vật với, em làm

Dim bValue As Byte, i As Byte
	lpCurAdd = lpBaseAdd + NPC_NAME_OFFSET + NPC_DATA_SIZE
	For i = 1 To 32
		bRead = ReadProcessMemory(hProcess, lpCurAdd + i - 1, bValue, 1, 0&)
		If bValue > 0 Then szName = szName + Chr$(bValue)
	Next
	Text1.Text = szName

nó hông ra gì luôn @@


Code lấy name nè bạn
Const PROCESS_VM_OPERATION As Long = &H8
Const PROCESS_VM_READ As Long = &H10
Const PROCESS_VM_WRITE As Long = &H20
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Const NPC_BASE_ADD = &H78AEAC
Const NPC_DATA_SIZE = &HB00C&
Const NPC_CURLIFE_OFFSET = &H338
Const NPC_NAME_OFFSET As Long = &HAC6C&

Const NPC_MAXLIFE_OFFSET As Long = &H334


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 ReadProcessMemory 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 WriteProcessMemory Lib "kernel32" _
	(ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
	(ByVal hObject As Long) As Long

Private Sub Form_Load()
	Dim hKTWindow&, dwProcessId&, dwThreatID&, hProcess&
	Dim lpBaseAdd&, lpCurAdd&, bRead As Boolean
	Dim dwCurHP&, dwMaxHP&
	Dim szName$
	hKTWindow = FindWindow("_Class", vbNullString)
	If hKTWindow = 0 Then Exit Sub
	GetWindowThreadProcessId hKTWindow, dwProcessId
	hProcess = OpenProcess(PROCESS_VM_READ, False, dwProcessId)
	
	'Get Current HP
	bRead = ReadProcessMemory(hProcess, NPC_BASE_ADD, lpBaseAdd, 4, 0&) '
	If bRead = True Then
		lpCurAdd = lpBaseAdd + NPC_CURLIFE_OFFSET + NPC_DATA_SIZE
		bRead = ReadProcessMemory(hProcess, lpCurAdd, dwCurHP, 4, 0&)
		If bRead = True Then
			MsgBox CStr(dwCurHP)
		Else
			''
		End If
	End If
	lpCurAdd = lpBaseAdd + NPC_DATA_SIZE + NPC_NAME_OFFSET
	Dim bValue As Byte, i As Byte
	For i = 1 To 32
		bRead = ReadProcessMemory(hProcess, lpCurAdd + i - 1, bValue, 1, 0&)
		If bValue > 0 Then szName = szName + Chr$(bValue)
	Next
	
	MsgBox szName
	Call CloseHandle(hProcess)
	End
End Sub

Bài viết này được chỉnh sửa bởi Huỳnh Văn Thâm: 08 October 2009 - 03:49 PM


#40
zeuspnt00

zeuspnt00

    Trung cấp CSTH

  • Advance Member
  • PipPipPip
  • 454 Bài Viết:
em hiểu rồi, khai báo sai ở đây
Const NPC_NAME_OFFSET As Long = &HAC6C&

Ngã phải đứng dậy
Bại rồi mới thành công






Perfumista - Thong tin nuoc hoa

Stars Counter Game

Balloon vs. Thorns

MU Phuc Hung

Làm Việc Tài Nhà

Mu Da Nang

Tuyển Nhân Viên Bán Hàng

Tư vấn sức khỏe trực tuyến

Close [X]