wupeiju 发表于 2010-6-2 19:08:35

DELPHI菜鸟,求教

我刚学DELPHI自学的,没人指点我,首先感谢潇潇老大,为我门提供了那么好的交流平台,无谓的精神。
问题1。我今天在学习过程中看到了别人发布的,DELPHI辅助模版,代码,我想研究下,但是把代码全都闹到DELPHI里 全是错误,代码应该没错 ,是不是DELPHI只有代码,是生成不了EXE文件的,。。要怎么做, 代码我发一下。。请老大指点 高手指点,别笑我是菜鸟 我很爱学习的,
问题2对象树形查看器关闭了不知道怎么打开,,老大说了按F11我按了,只能按出对象检查器 按不出对象树形查看器对象树形查看器就是在对象检查器上面的那个窗口 不知道怎么按出来,我是中文版的,所以要说详细点 希望人能看明白 帮帮我,

wupeiju 发表于 2010-6-2 19:12:03

忘了发 辅助模版代码了,,请高手 或者老大告诉我,怎么把这代码变成EXE文件
谢谢了unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, StrUtils;

type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
EditName: TEdit;
EditHP: TEdit;
EditMP: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;

procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);

procedure RetCity;
procedure JiNeng;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);


private
{ Private declarations }

public
{ Public declarations }

end;

type // ---- 定义参数指针
P1_STR = packed record
Param1: DWORD;
Param2: DWORD;
end;
PP1_STR = ^P1_STR;

var
Form1: TForm1;
Base0, Base1, BaseT1: Integer;
HP, MP: Integer;

MyHwnd:Hwnd;
hProcess_N: THandle;
ThreadAdd, ParamAdd: Pointer;
ThreadID: DWORD;

MemSize, JNID: DWORD;
ByteRead: Cardinal;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
MyHwnd:=findwindow(nil, 'Element Client');
GetWindowThreadProcessId(MyHwnd, @ThreadID);
hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);
if hProcess_N = 0 then
begin
Messagebox(handle, ' 请退出先登录运行《诛仙》游戏。 ','提示',MB_OK+MB_IconError);
exit;
end;

Base0:=$9045EC; // $12F82C
MemSize:=128;

ThreadAdd := VirtualAllocEx(hProcess_N, nil, MemSize, MEM_COMMIT, PAGE_READWRITE);
ParamAdd := VirtualAllocEx(hProcess_N, nil, 20, MEM_COMMIT, PAGE_READWRITE);
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
VirtualFreeEx(hProcess_N, ThreadAdd, MemSize, MEM_RELEASE);
VirtualFreeEx(hProcess_N, ParamAdd, 20, MEM_RELEASE);
CloseHandle(hProcess_N);
end;


procedure InjectFunc(Func: Pointer; Param: Pointer; ParamSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;

begin
if hProcess_N<>0 then
begin
// ---- 写入函数地址
WriteProcessMemory(hProcess_N, ThreadAdd, Func, MemSize, lpNumberOfBytes);
// ---- 写入参数地址
WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes);
// ---- 创建远程线程
hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes);
// ---- 等待线程结束
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
end;
end;

// ---- 死亡回城 CALL
procedure MyCall1; Stdcall;
var
Address:pointer;
begin
Address:=Pointer($5A1F70);
asm
pushad
call Address
popad
end;
end;


// ---- 技能 CALL
procedure MyCall8(P:PP1_STR); Stdcall;
var
Address: pointer;
P1: DWORD;
begin
Address:=Pointer($4656F0);
P1:=P^.Param1; // ---- 技能ID号
asm
pushad
push -1
push 0
push 0
push P1
mov ecx,DWORD PTR DS:[$900adc]
mov edx,DWORD PTR DS:
mov ecx,DWORD PTR DS:
call address
popad
end;
end;


// --- 退出
procedure TForm1.Button4Click(Sender: TObject);
var
FTxt: TextFile;
S: String;

begin
SetWindowText(MyHwnd, 'Element Client');
Close;
end;

// ---- 读角色信息
procedure TForm1.Button1Click(Sender: TObject);
var
FTxt: TextFile;
S: String;
Name: array of WideChar;

begin
ReadProcessMemory(hProcess_N, Pointer(Base0), @BaseT1, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(BaseT1+($28)), @Base1, 4, ByteRead);

ReadProcessMemory(hProcess_N, Pointer(Base1+($3A4)), @BaseT1, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(BaseT1+($0)), @Name, 16, ByteRead); // ---- 主角信息
ReadProcessMemory(hProcess_N, Pointer(Base1+($254)), @HP, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(Base1+($258)), @MP, 4, ByteRead);

EditName.Text:=Name;
EditHP.Text:=IntToStr(HP);
EditMP.Text:=IntToStr(MP);
end;


// --- 调用CALL 回城
procedure TForm1.RetCity;
var
MyParam : P1_STR;
ParamSum: DWORD;
begin
ParamSum:=0;
if MyHwnd<>0 then
begin
injectfunc(@MyCall1, @MyParam, ParamSum);
end;
end;


// ---- 调用CALL 技能
procedure TForm1.JiNeng;
var
MyParam : P1_STR;
ParamSum: DWORD;
begin
MyParam.Param1:=JNID;
ParamSum:=SizeOf(MyParam);
if MyHwnd<>0 then
begin
injectfunc(@MyCall8, @MyParam, ParamSum);
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
RetCity;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
JNID:=$DA;
JiNeng;
end;

end.

admin 发表于 2010-6-2 20:40:29

问题1。上面的代码算最简单的调用CALL代码,你把代码全复制然后回到代码编辑窗口,把原来的删除,保存。然后回form1窗口把相应控件画上就可以。要生成EXE文件,运行后在默认路径下就自动生成EXE文件。另外我把代码整理了下。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, StrUtils;
type
TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    EditHP: TEdit;
    EditMP: TEdit;
    EditName: TEdit;
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RetCity;
procedure JiNeng;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;
type // ---- 定义参数指针
P1_STR = packed record
Param1: DWORD;
Param2: DWORD;
end;
PP1_STR = ^P1_STR;
var
Form1: TForm1;
Base0, Base1, BaseT1: Integer;
HP, MP: Integer;
MyHwnd:Hwnd;
hProcess_N: THandle;
ThreadAdd, ParamAdd: Pointer;
ThreadID: DWORD;
MemSize, JNID: DWORD;
ByteRead: Cardinal;
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
MyHwnd:=findwindow(nil, 'Element Client');
GetWindowThreadProcessId(MyHwnd, @ThreadID);
hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);
if hProcess_N = 0 then
begin
Messagebox(handle, ' 请退出先登录运行《诛仙》游戏。 ','提示',MB_OK+MB_IconError);
exit;
end;
Base0:=$9045EC; // $12F82C
MemSize:=128;
ThreadAdd := VirtualAllocEx(hProcess_N, nil, MemSize, MEM_COMMIT, PAGE_READWRITE);
ParamAdd := VirtualAllocEx(hProcess_N, nil, 20, MEM_COMMIT, PAGE_READWRITE);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
VirtualFreeEx(hProcess_N, ThreadAdd, MemSize, MEM_RELEASE);
VirtualFreeEx(hProcess_N, ParamAdd, 20, MEM_RELEASE);
CloseHandle(hProcess_N);
end;

procedure InjectFunc(Func: Pointer; Param: Pointer; ParamSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;
begin
if hProcess_N<>0 then
begin
// ---- 写入函数地址
WriteProcessMemory(hProcess_N, ThreadAdd, Func, MemSize, lpNumberOfBytes);
// ---- 写入参数地址
WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes);
// ---- 创建远程线程
hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes);
// ---- 等待线程结束
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
end;
end;
// ---- 死亡回城 CALL
procedure MyCall1; Stdcall;
var
Address:pointer;
begin
Address:=Pointer($5A1F70);
asm
pushad
call Address
popad
end;
end;

// ---- 技能 CALL
procedure MyCall8(P:PP1_STR); Stdcall;
var
Address: pointer;
P1: DWORD;
begin
Address:=Pointer($4656F0);
P1:=P^.Param1; // ---- 技能ID号
asm
pushad
push -1
push 0
push 0
push P1
mov ecx,DWORD PTR DS:[$900adc]
mov edx,DWORD PTR DS:
mov ecx,DWORD PTR DS:
call address
popad
end;
end;

// --- 退出
procedure TForm1.Button4Click(Sender: TObject);
begin
SetWindowText(MyHwnd, 'Element Client');
Close;
end;
// ---- 读角色信息
procedure TForm1.Button1Click(Sender: TObject);
var
Name: array of WideChar;
begin
ReadProcessMemory(hProcess_N, Pointer(Base0), @BaseT1, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(BaseT1+($28)), @Base1, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(Base1+($3A4)), @BaseT1, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(BaseT1+($0)), @Name, 16, ByteRead); // ---- 主角信息
ReadProcessMemory(hProcess_N, Pointer(Base1+($254)), @HP, 4, ByteRead);
ReadProcessMemory(hProcess_N, Pointer(Base1+($258)), @MP, 4, ByteRead);
EditName.Text:=Name;
EditHP.Text:=IntToStr(HP);
EditMP.Text:=IntToStr(MP);
end;

// --- 调用CALL 回城
procedure TForm1.RetCity;
var
MyParam : P1_STR;
ParamSum: DWORD;
begin
ParamSum:=0;
if MyHwnd<>0 then
begin
injectfunc(@MyCall1, @MyParam, ParamSum);
end;
end;

// ---- 调用CALL 技能
procedure TForm1.JiNeng;
var
MyParam : P1_STR;
ParamSum: DWORD;
begin
MyParam.Param1:=JNID;
ParamSum:=SizeOf(MyParam);
if MyHwnd<>0 then
begin
injectfunc(@MyCall8, @MyParam, ParamSum);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
RetCity;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
JNID:=$DA;
JiNeng;
end;
end.
源码下载:

问题2:
对象树形查看器打开方法:
1、View(视图)-Object TreeView(对象树形查看器);2、快捷键:Shift+Alt+F11。
对象检查器:
1、View(视图)-Object Inspector(对象检查器);2、快捷键:F11。

wupeiju 发表于 2010-6-2 21:19:24

老大 爱死你了,你给我了 学下去的勇气,终于有老师教我了,不知道说什么好了,感激吧

wupeiju 发表于 2010-6-2 21:26:09

还帮按直接做好了,在次感谢老大

wupeiju 发表于 2010-6-2 22:08:41

我还是失败了,提示我有那些按纽,但是按F9运行 他又说我没那些按纽,真气人 ,好象这很矛盾啊,。老大能不能 录制个30秒的操作过程,我看一下 好吗 我实在是太笨了 急死了,

wupeiju 发表于 2010-6-2 22:12:39

我的操作步骤是这样的,先打开DELPHI 在窗体上双击 进到输入代码的地方把里面的代码全删了 换上了新代码,然后回到FORM1里 画按纽什么的,他提示我有按纽了,但是我又按F9运行程序 他又说我没按纽 气气气

admin 发表于 2010-6-2 22:25:02

要在添加按钮等控件前删除代码里的
PageControl1: TPageControl;
TabSeet1: TTabSheet;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
EditName: TEdit;
EditHP: TEdit;
EditMP: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;

wupeiju 发表于 2010-6-2 22:57:52

经过老大的,在次提醒 我成功了,做下笔记 也让和我一样的菜鸟分享一起学习
1要删除代码里那些窗体上还没有出现的按纽,Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    EditHP: TEdit;
    EditMP: TEdit;
    EditName: TEdit;
这样你可以直接按F9运行程序 他会提示你你缺少了EDITNAME我门只要在试图面版上画个EDIT控件就可以把属性里的名字改成EDITNAME他就不提示错误,在按F9他提示缺少EDITHP 按纽 办法和前面一样,,这样就搞定了,,, 谢谢老大 我好高兴哦 :lol
页: [1]
查看完整版本: DELPHI菜鸟,求教