您的位置 首页 地下城私服

dnf辅助外挂C++源代码

由于我的C用的比较少,所以大部分都用的汇编,部分地方用汇编写不是很方便,所以我用的C,由于只是学习,所以内核地址我没有计算都是硬编码的。过DNF主要分为三步,也许我的思路不太正确,反正可以OD调试,下断。

程序没怎么修边幅,因为只是测试,所以一般都没有写更改内核后的恢复,不过不妨碍使用。

第一步,这也是最起码的,你必须要能够打开游戏进程和线程,能够开打进程和线程后不被检测到

第二步,能够读写进村内存

第三步,能够用OD附加游戏进程

dnf台服私服怎么破解数据库

第四步,能够下硬件断点而不被检测

跳过NtReadVirtualMemory,NtWriteVirtualMemory函数头的钩子

代码:

#include<>

typedef struct _SERVICE_DESCRIPTOR_TABLE

{

PVOID ServiceTableBase;

PULONG ServiceCounterTableBase;

ULONG NumberOfService;

ULONG ParamTableBase;

}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了

dnf台服私服怎么破解数据库

extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数

/

VOID Hook();

VOID Unhook();

VOID OnUnload(IN PDRIVER_OBJECT DriverObject);

//

dnf台服私服怎么破解数据库

ULONG JmpAddress;//跳转到NtOpenProcess里的地址

ULONG JmpAddress1;//跳转到NtOpenProcess里的地址

ULONG OldServiceAddress;//原来NtOpenProcess的服务地址

ULONG OldServiceAddress1;//原来NtOpenProcess的服务地址

//

__declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory(HANDLE ProcessHandle,

PVOID BaseAddress,

PVOID Buffer,

ULONG NumberOfBytesToRead,

PULONG NumberOfBytesReaded)

{

//跳过去

__asm

{

push 0x1c

push 804eb560h //共十个字节

jmp [JmpAddress]

}

}

dnf台服私服怎么破解数据库

__declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory(HANDLE ProcessHandle,

PVOID BaseAddress,

PVOID Buffer,

ULONG NumberOfBytesToWrite,

PULONG NumberOfBytesReaded)

{

dnf台服私服怎么破解数据库

//跳过去

__asm

{

dnf台服私服怎么破解数据库

push 0x1c

push 804eb560h //共十个字节

jmp [JmpAddress1]

}

}

///

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)

{

DriverObject->DriverUnload = OnUnload;

DbgPrint(“Unhooker load”);

Hook();

return STATUS_SUCCESS;

}

/

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)

{

dnf台服私服怎么破解数据库

DbgPrint(“Unhooker unload!”);

dnf台服私服怎么破解数据库

Unhook();

}

/

VOID Hook()

{

ULONG Address, Address1;

Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//0x7A为NtOpenProcess服务ID

Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;//0x7A为NtOpenProcess服务ID

DbgPrint(“Address:0x%08X”,Address);

OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址

OldServiceAddress1 = *(ULONG*)Address1;//保存原来NtOpenProcess的地址

DbgPrint(“OldServiceAddress:0x%08X”,OldServiceAddress);

dnf台服私服怎么破解数据库

DbgPrint(“OldServiceAddress1:0x%08X”,OldServiceAddress1);

DbgPrint(“MyNtOpenProcess:0x%08X”,MyNtReadVirtualMemory);

DbgPrint(“MyNtOpenProcess:0x%08X”,MyNtWriteVirtualMemory);

JmpAddress = (ULONG)0x805b528a + 7; //跳转到NtOpenProcess函数头+10的地方,这样在其前面写的JMP都失效了

JmpAddress1 = (ULONG)0x805b5394 + 7;

DbgPrint(“JmpAddress:0x%08X”,JmpAddress);

DbgPrint(“JmpAddress1:0x%08X”,JmpAddress1);

dnf台服私服怎么破解数据库

__asm

{ //去掉内存保护

dnf台服私服怎么破解数据库

cli

mov eax,cr0

and eax,not 10000h

mov cr0,eax

}

*((ULONG*)Address) = (ULONG)MyNtReadVirtualMemory;//HOOK SSDT

*((ULONG*)Address1) = (ULONG)MyNtWriteVirtualMemory;

__asm

{ //恢复内存保护

mov eax,cr0

or eax,10000h

mov cr0,eax

sti

}

}

//

VOID Unhook()

dnf台服私服怎么破解数据库

{

ULONG Address, Address1;

Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//查找SSDT

dnf台服私服怎么破解数据库

Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;

__asm{

cli

mov eax,cr0

dnf台服私服怎么破解数据库

and eax,not 10000h

mov cr0,eax

}

*((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT

*((ULONG*)Address1) = (ULONG)OldServiceAddress1;//还原SSDT

__asm{

mov eax,cr0

or eax,10000h

mov cr0,eax

sti

}

DbgPrint(“Unhook”);

}

由于它不断对DebugPort清零,所以要修改调试相关函数,使得所有的访问DebugPort的地方全部访问EPROCESS中的ExitTime字节,这样它怎么清零都无效了,也检测不到

代码:

.386

.model flat, stdcall

option casemap:none

include

.const

Dspdo_1 equ 80643db6h

Dmpp_1 equ 80642d5eh

Dmpp_2 equ 80642d64h

Dct_1 equ 806445d3h

Dqm_1 equ 80643089h

Kde_1 equ 804ff5fdh

Dfe_1 equ 80644340h

Pcp_1 equ 805d1a0dh

Mcp_1 equ 805b0c06h

Mcp_2 equ 805b0d7fh

Dmvos_1 equ 8064497fh

Dumvos_1 equ 80644a45h

Pet_1 equ 805d32f8h

Det_1 equ 8064486ch

Dep_1 equ 806448e6h

.code

;还原自己的Hook

DriverUnload proc pDriverObject:PDRIVER_OBJECT

ret

DriverUnload endp

ModifyFuncAboutDbg proc addrOdFunc, cmd_1, cmd_2

pushad

mov ebx, addrOdFunc

mov eax, cmd_1

mov DWORD ptr [ebx], eax

mov eax, cmd_2

dnf台服私服怎么破解数据库

mov DWORD ptr [ebx + 4], eax

popad

ret

ModifyFuncAboutDbg endp

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

cli

mov eax, cr0

and eax, not 10000h

mov cr0, eax

invoke ModifyFuncAboutDbg, Dspdo_1, 90784789h, 0fde89090h

invoke ModifyFuncAboutDbg, Dmpp_1, 90787e39h, 950f9090h

invoke ModifyFuncAboutDbg, Dct_1, 90785e39h, 840f9090h

invoke ModifyFuncAboutDbg, Dqm_1, 9078408bh, 45899090h

invoke ModifyFuncAboutDbg, Kde_1, 90787839h, 13749090h

invoke ModifyFuncAboutDbg, Dfe_1, 9078418bh, 0d2329090h

invoke ModifyFuncAboutDbg, Pcp_1, 90784389h, 45f69090h

invoke ModifyFuncAboutDbg, Mcp_1, 90785e39h, 950f9090h

invoke ModifyFuncAboutDbg, Mcp_2, 90784a89h, 5e399090h

invoke ModifyFuncAboutDbg, Dmvos_1, 9078498bh, 0cb3b9090h

invoke ModifyFuncAboutDbg, Dumvos_1, 00787983h, 74909090h

invoke ModifyFuncAboutDbg, Pet_1, 00787f83h, 74909090h

invoke ModifyFuncAboutDbg, Det_1, 9078498bh, 0c9859090h

invoke ModifyFuncAboutDbg, Dep_1, 9078498bh, 0c9859090h

;invoke ModifyFuncAboutDbg, Dmpp_2, 8bc0950fh, 8b90c032h

mov eax, pDriverObject

assume eax : ptr DRIVER_OBJECT

mov [eax].DriverUnload, offset DriverUnload

assume eax : nothing

mov eax, cr0

or eax, 10000h

mov cr0, eax

sti

mov eax, STATUS_SUCCESS

ret

DriverEntry endp

end DriverEntry

绕过NtOpenProcess,NtOpenThread,KiAttachProcess

以及最重要的,不能让它检测到有硬件断点,所以要对CONTEXT做一些伪装,把真实的DR0~DR7的数据存放到别的地方,OD访问的时候返回正确的数据,如果是DNF要获取上下文,就稍微做下手脚

代码:

.386

.model flat, stdcall

option casemap:none

include

.const

NtOpenProcessHookAddr equ 805cc626h

NtOpenProcessRetAddr equ 805cc631h

NtOpenProcessNoChange equ 805cc62ch

NtOpenThreadHookAddr equ 805cc8a8h

NtOpenThreadRetAddr equ 805cc8b3h

dnf台服私服怎么破解数据库

NtOpenThreadNoChange equ 805cc8aeh

KiAttachProcessAddr equ 804f9a08h

KiAttachProcessRetAddr equ 804f9a0fh

ObOpenObjectByPointerAddr equ 805bcc78h

NtGetContextThreadAddr equ 805d2551h;805c76a3h

NtGetContextThreadRetAddr equ 805c76a7h;805d2555h

.data

dnf台服私服怎么破解数据库

nameOffset dd ?

threadCxtLink dd 0

tmpLink dd ?

.code

GetProcessName proc

invoke PsGetCurrentProcess

mov ebx, eax

add ebx, nameOffset

dnf台服私服怎么破解数据库

invoke DbgPrint, $CTA0(“

“)

push ebx

invoke DbgPrint, ebx

pop ebx

invoke strncmp, $CTA0(“”), ebx, 6

push eax

invoke DbgPrint, $CTA0(“

“)

pop eax

ret

GetProcessName endp

HookCode proc

;执行被覆盖的代码

push dword ptr [ebp-38h]

push dword ptr [ebp-24h]

dnf台服私服怎么破解数据库

;判断是否dnf的进程

invoke GetProcessName

.if !eax ;如果是DNF自己的进程,那么跳转回去执行它的Hook代码

pushad

invoke DbgPrint, $CTA0(“

NotUnHook

“)

popad

mov eax, NtOpenProcessNoChange;805c13e6h

jmp eax

.else ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面

pushad

invoke DbgPrint, $CTA0(“

UnHook

“)

popad

mov eax, ObOpenObjectByPointerAddr;805b13f0h

call eax

dnf台服私服怎么破解数据库

mov ebx, NtOpenProcessRetAddr;805c13ebh

jmp ebx

.endif

HookCode endp

;获取系统名称偏移

GetNameOffset proc epe

local tmpOffset

pushad

mov ebx, epe

invoke strlen, $CTA0(“System”)

xor ecx, ecx

@@:

push eax

push ecx

invoke strncmp, $CTA0(“System”), ebx, eax

pop ecx

.if !eax

pop eax

mov tmpOffset, ecx

popad

mov eax, tmpOffset

dnf台服私服怎么破解数据库

ret

.elseif

pop eax

inc ebx

dnf台服私服怎么破解数据库

inc ecx

cmp ecx, 4096

je @F

jmp @B

.endif

@@:

popad

dnf台服私服怎么破解数据库

mov eax, -1

ret

GetNameOffset endp

Hook proc

pushad

;头5字节跳转

dnf台服私服怎么破解数据库

mov eax, offset HookCode

sub eax, NtOpenProcessHookAddr;805c13e0h;805c13edh

sub eax, 5

mov ebx, NtOpenProcessHookAddr;805c13e0h;805c13edh

mov cl, 0E9h

mov BYTE PTR [ebx], cl

mov DWORD PTR [ebx + 1], eax

popad

ret

Hook endp

HookThreadCode proc

;执行被覆盖的代码

push dword ptr [ebp-34h]

push dword ptr [ebp-20h]

;判断是否dnf的进程

invoke GetProcessName

.if !eax ;如果是DNF自己的进程,那么跳转回去执行它的Hook代码

pushad

dnf台服私服怎么破解数据库

invoke DbgPrint, $CTA0(“

NotUnHook

dnf台服私服怎么破解数据库

“)

popad

dnf台服私服怎么破解数据库

mov eax, NtOpenThreadNoChange;805c13e6h

jmp eax

.else ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面

pushad

invoke DbgPrint, $CTA0(“

UnHook

“)

popad

mov eax, ObOpenObjectByPointerAddr;805b13f0h

call eax

mov ebx, NtOpenThreadRetAddr;805c13ebh

jmp ebx

.endif

HookThreadCode endp

HookThread proc

pushad

dnf台服私服怎么破解数据库

;头5字节跳转

mov eax, offset HookThreadCode

sub eax, NtOpenThreadHookAddr;805c13e0h;805c13edh

sub eax, 5

mov ebx, NtOpenThreadHookAddr;805c13e0h;805c13edh

mov cl, 0E9h

mov BYTE PTR [ebx], cl

mov DWORD PTR [ebx + 1], eax

dnf台服私服怎么破解数据库

popad

dnf台服私服怎么破解数据库

ret

HookThread endp

HookDbg proc

mov edi, edi

dnf台服私服怎么破解数据库

push ebp

mov ebp, esp

push ebx

push esi

mov esi, KiAttachProcessRetAddr

jmp esi

HookDbg endp

Dbg proc

pushad

;头5字节跳转

mov eax, offset HookDbg

sub eax, KiAttachProcessAddr;805c13e0h;805c13edh

sub eax, 5

mov ebx, KiAttachProcessAddr;805c13e0h;805c13edh

mov cl, 0E9h

mov BYTE PTR [ebx], cl

dnf台服私服怎么破解数据库

mov DWORD PTR [ebx + 1], eax

popad

ret

Dbg endp

;还原自己的Hook

dnf台服私服怎么破解数据库

DriverUnload proc pDriverObject:PDRIVER_OBJECT

cli

dnf台服私服怎么破解数据库

mov eax, cr0

and eax, not 10000h

mov cr0, eax

;还原进程处理

mov eax, 0ffc875ffh

mov ebx, 805cc656h

mov DWORD ptr [ebx], eax

mov eax, 43e8dc75h

mov DWORD ptr [ebx + 4], eax

dnf台服私服怎么破解数据库

;还原线程处理

mov eax, 0ffcc75ffh

mov ebx, 805cc8d8h

mov DWORD ptr [ebx], eax

mov eax, 0c1e8e075h

mov DWORD ptr [ebx + 4], eax

;还原调试处理

dnf台服私服怎么破解数据库

mov eax, 08b55ff8bh

mov ebx, 804f9a08h

mov DWORD ptr [ebx], eax

mov eax, 08b5653ech

mov DWORD ptr [ebx + 4], eax

mov eax, cr0

or eax, 10000h

mov cr0, eax

sti

ret

dnf台服私服怎么破解数据库

DriverUnload endp

;显示LinkTable的信息

ShowLinkTableInfo proc ptrLT

pushad

invoke DbgPrint, $CTA0(“

The LinkTable Info:

“)

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).ThreadHandle

invoke DbgPrint, $CTA0(“ThreadHandle:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr0Seg

invoke DbgPrint, $CTA0(“Dr0Seg:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr1Seg

invoke DbgPrint, $CTA0(“Dr1Seg:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr2Seg

invoke DbgPrint, $CTA0(“Dr2Seg:%0X

“), eax

dnf台服私服怎么破解数据库

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr3Seg

invoke DbgPrint, $CTA0(“Dr3Seg:%0X

dnf台服私服怎么破解数据库

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr6Seg

invoke DbgPrint, $CTA0(“Dr6Seg:%0X

“), eax

mov ebx, ptrLT

mov eax, (LinkTable ptr [ebx]).Dr7Seg

invoke DbgPrint, $CTA0(“Dr7Seg:%0X

推荐文章:利用云服务器挂机_怎么利用云服务器挂机

当微服务遇上Docker系列之构建、实践与颠覆

比方说,如果服务的负载产生了突发性的增长,可以为服务加入更多无状态的web服务器,而如果某个无状态的服务器挂机了,也可以方便地用另外一台服务器取代它。 因此,无状态的服务更容易实现敏捷性和适应性。 有状态的服务尽管无状态的应用程序设计是大势所趋,但在许多系统中,状态是不可避免的。 比方说,任何需要…

推荐文章:DNF阿拉德游戏论坛

dnf台服 单机pvf分享: 36 个回复 – 2832 次查看 之前看贴吧有位贴主以我之前发布的pvf为底增加了很多新的内容,做的挺好,也修复了不少BUG,大家可以去 dnf台服 吧下载来玩,体验很好。 其实我之前有别的事没有把剩下的守护者祭坛做出来心里一直有些遗憾,这些天正好 … 2020-10-22 16:14 – 朱容君-兔子牙 – DNF单机版

dnf台服 原版纯净服务端带数据库(大小80MB) 31 个回复 – 3439 次查看 解包命令放在前面, 这个是直接解压到当前目录 链接: 提取码: **** 本内容被作者隐藏 **** 度盘链接, 自己补前缀 我的测试环境虚拟机1C1G 系统 x64 数 … 2020-10-22 17:14 – 宿命者卡恩 – DNF单机版

dnf台服 深渊怪物和翻牌爆率修改教程(附爆率计算工具) 11 个回复 – 1629 次查看 一、深渊爆率 首先我们来讲一下深渊爆率如何改 深渊爆率的文件是etc/ 我们主要改里面的东西,其它的就不要动了,看一下下面的一串数据 除去第一个,每6个为一组,第一组是非常困难 … 2020-10-21 16:07 – 一禅小和尚 – DNF单机版

DNF台服PVF视频教程:修改装备外观、数据库经验爆率新贴 108 个回复 – 10604 次查看 学习了解PVF再由浅入深尝试修改属于你自己的DNF版本。 教程文件包含: ; ; ; 以上均 … 2018-11-30 15:25 – dnf台服吧 – DNF单机版

DNF台服SF超级GM工具最新版(2017) 229 个回复 – 17010 次查看 2018-7-27 12:13 – dnf台服吧 – DNF单机版

DNF台服PVF加密解密之路(附:) 153 个回复 – 15727 次查看 加密的pvf为什么很多人要解密它? 这是一个问题,就好比一把锁要怎么才能在没有钥匙的情况下打开?很多的 dnf台服 爱好者一直在追求解密、破解、解包等等,为的是通过窃取的方式获取到自己想要的东西,从而也就导致了 … 2020-2-21 17:33 – dnf台服吧 – DNF单机版

DNF台服DOF解密PVF文件以及加密客户端PVF工具 238 个回复 – 24394 次查看 这是一款DNF台服DOF的PVF文件加密程序及解密程序,包含了解密加密功能。 极易启动PVF解密工具下载: ,不知道能不能用,建议破解压缩包试试 相 … 2019-3-18 15:13 – dnf台服吧 – DNF单机版

DNF台服DOFSFGM权限破解获取爆破数据库工具[首发] 519 个回复 – 44910 次查看 仅支持单ip爆破:一次只能爆破一个游戏数据库; 数据库端口默认:3306;(不支持修改端口) :这是存放爆破所用的用户名;(文件名称可以支持任意修改) :这是存放数据库密码字典的地方;(压 … 2019-3-18 16:58 – dnf台服吧 – DNF单机版

DNF台服装备强化锻造属性无效打怪不加伤害问题怎么修复? 12 个回复 – 1368 次查看 问题描述: dnf单机台服版本游戏中,将武器强化或者锻造到某个等级,然后去地下城测试装备强化加成伤害是否有效,发现普通装备(未强化或锻造)与强化锻造之后的武器打出的伤害一样,说明武器强化属性没有附加到实际 … 2019-12-3 04:24 – dnf台服吧 – DNF单机版

DNF台服深渊爆率修改便捷工具(by:若言) 56 个回复 – 7425 次查看 DNF深渊爆率修改计算工具 填好百分比以后,点击生成(会自动复制好结果) 下面说一下我分享的一个傻瓜式的PVF深渊爆率教程 :易语言制作,修改PVF爆率使用,不联网,无后门,可设 … 2020-2-25 11:50 – dnf台服吧 – DNF单机版

DNF台服山水豆腐百科书全集 154 个回复 – 13605 次查看 (最新版)下载 声明: 其中教程真实度自己测试,若不明白不理解请自行度娘不要问我, 关于架设、开服、外网等问题别问我;本人只作资料整合;谢谢~合作!!! Email:[email protected] 如果你 … 2018-7-12 15:02 – dnf台服吧 – DNF单机版

DNF台服怎么给PVF打补丁以及怎么导入别人的补丁 46 个回复 – 6802 次查看 教程开始: 这个压缩包有三个补丁。三选一,我选择第一个 ,我这里选择 pvfUtility 软件 鼠标右击 —— … 2018-7-27 11:38 – dnf台服吧 – DNF单机版

DNF台服2款GM工具及物品代码修改工具 301 个回复 – 20583 次查看 链接: 提取码:**** 本内容被作者隐藏 **** 复制这段内容后打开百度网盘手机App,操作更方便哦 文件夹内容:GM工具物品代码修改软件密码123、 … 2019-3-18 04:22 – dnf台服吧 – DNF单机版

DNF台服DOF辅助大合集(自动刷图深渊自动强化装备等等…) 180 个回复 – 38832 次查看 大合集辅助主界面预览(阿拉德大陆首发,一次下载终身永久免费使用的科技): 使用方法:进入游戏,频道选择喜欢的SF辅助注入即可; “139内辅”试试,看看界面功能,分解装备,飞机等等; 2. … 2019-3-14 01:24 – dnf台服吧 – DNF单机版

dnf台服 界面实现滑动UI操作便利的地下城副本时间表 4 个回复 – 627 次查看 一、滑动式副本时刻表(可互动) 二、频道版本资讯窗口 大家可以根据分析图,DIY有着更大的开发空间。 ui/channel/ 可以在频道界面添加修改更多的内容 链接: … 2020-10-22 17:27 – 百姬丶酱 – DNF单机版

dnf台服 在创建人物时“限使用繁体/英文/数字”提示修复教程 0 个回复 – 506 次查看 创建人物界面,切换繁体输入确认后,会提示“限使用繁体/英文/数字”,介绍下思路以及怎么修复。第一反应问题应该出在etc目录下,这种一般都是写死的,具体哪个文件,看下名字就知道了。 文件路径:etc/restrictnam … 2020-10-22 02:01 – 小书生 – DNF单机版

dnf台服 pvf副本提取工具()下载 1 个回复 – 1836 次查看 :[hr] [*]去除不必要的依赖包,缩减了工具体积( MB) [*]修复了提取 [special passive object item] 时,如果不包含特殊OBJ的话,会导致闪退的问题,例如 35 … 2020-3-22 13:56 – wow! – DNF单机版

dnf台服 Nut入门第一章:添加技能及伤害应用【咸鱼Z】 1 个回复 – 628 次查看 研究的一年多以来,说实话很多人跟我说过,为什么不出教程之类,也被很多人喷过**,吊人胃口的话。 没错,这些我都不否认。我只会做我感兴趣的事情,别人种种与我何干?包括这次教程,也是我感兴趣才写的,没有什 … 2020-10-22 00:59 – ZateL – DNF单机版

热门文章

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注