如何通过HOOK方式来实现监控进程启动

如何通过HOOK方式来实现监控进程启动,第1张

程序X为一款不确定的内存修改软件

程序A为 被X修改的程序

程序B为 防止被X修改的程序

类似杀毒软件的监控,但我没思路具体该怎么写。

谁能给个思路。有具体代码最好。

我现在的方法是 监视程序的启动,一旦启动把自己的dll hook进去 并拦截WriteProcessMemory API

当任何程序对A进行内存修改的时候 在B程序中反映出来

C#写HOOK还是延续WINDOWS HOOK的思路的,使用标准的API :SetWindowHookEx思路很简单:写个类自己定义一个钩子事件然后再自己程序中调用,下面是我以前写的一个NET HOOK框架,网上相关资源也是很多的======================================写多了其他语言实现的HOOK,突然很想写个不一样的,想来想去Net HOOK是最合适的了使用的方法还是传统的 Gui‘Thread Hook : SetWindowsHookEx/CallNextHookExHOOK -- 拦截,一种改变程序执行流程的技术手段,这里我不想过多的去谈如果去改变

一个程序的执行流程只是简单的演示下,如何实现一个HOOK在Net里面实现挂钩和在其他语言实现虽然在本质上是相同的,但细节上却是有点不同的

NET 采用的是事件驱动(消息机制的封装版),所有要实现一个消息的拦截,你必须实现

一个事件,而该事件的作用就是接受和处理

=======================================

1。开始我们定义一个基础类,实现一些基本的方法和变量

namespace MrKrclBaseHookLibrary

{

/

hook library

by Mrkrcl 283018011

2010-5-12 BMD

: 这里给出的只是一个NET HOOK 模型 并未完全实现功能 /

// =================================================================

// 事件参数类

public class HookEventArgs: EventArgs

{

//根据需要你可以添加变量或函数实现功能的扩展

}

// ==================================================================

// 挂钩的消息类型,具体查阅MSDN

public enum HookType : int

{

WH_JOURNALRECORD = 0,

WH_JOURNALPLAYBACK = 1,

WH_KEYBOARD = 2,

WH_GETMESSAGE = 3,

WH_CALLWNDPROC = 4,

WH_CBT = 5,

WH_SYSMSGFILTER = 6,

WH_MOUSE = 7,

WH_HARDWARE = 8,

WH_DEBUG = 9,

WH_SHELL = 10,

WH_FOREGROUNDIDLE = 11,

WH_CALLWNDPROCRET = 12,

WH_KEYBOARD_LL = 13,

WH_MOUSE_LL = 14

}

// ====================================================================

// 导出API : 最烦人的工作了,不像C/C++其他语言直接调用头文件就OK

[DllImport("user32dll")]

protected static extern IntPtr SetWindowsHookEx(HookType code,

HookProc func,

IntPtr hInstance,

int threadID);

[DllImport("user32dll")]

protected static extern int UnhookWindowsHookEx(IntPtr hhook);

[DllImport("user32dll")]

protected static extern int CallNextHookEx(IntPtr hhook,

int code, IntPtr wParam, IntPtr lParam);

// ====================================================================

// HOOK基类

public abstract class BaseHookLib:IDisposable{

// 事件委托 + 回调函数委托

public delegate CallBackHookProc(int nCode , IntPtr wparam ,IntPtr lparam) ;

public delegate HookEventHandler(object sender , HookEventArgs e);

public event HookEventHandler InvokeHook ;

// 构造函数

public BaseHookLib(HookType hType)

{

_hookType = hType ;

}

public BaseHookLib(HookType hType , CallBaseHookProc proc)

{

_hookType = hType ;

callBackFun = proc ;

}

// 内部变量

protected IntPtr _hhook = IntPtrZero;

// 判断系统是否已经加载HOOK

protected bool _isHook = false ;

// 回调函数

protected CallBackHookProc callBackFun ;

// 挂钩消息的类型

protected HookType _hookType ;

public bool IsHook{

get {

return _isHook;

}

}

// 引发时间

protected void OnHook(HookEventArgs e)

{

if(InvokeHook != null) InvokeHook(this , e);

}

// 钩子回调函数

protected int CallBackFunction(int nCode ,IntPtr wParam , IntPtr lparam)

{

if( nCode < 0) return CallNextHookEx(_hhook , nCode , wParam ,lparam);

// 事件参数类实例化

HookEventArgs e = new HookEventArgs() ;

OnHook(e) ;

//

// 这里可以做你想做的,作为基类我们总是直接返回

//

return CallNextHookEx(_hhook,nCode ,wParam ,lparam);

}

// 安装钩子

protected void InstallHook()

{

_hhook = SetWindowsHookEx(_hookType ,callbackFun ,

MarshalGetHINSTANCE(AssemblyGetExecutingAssembly()GetModules()[0]),,

0/(int) AppDomainGetCurrentThreadId()/);

_hook = true ;

}

// 卸载钩子

protected void UnInstallHook()

{

UnhookWindowsHookEx(_hhook);

_hhook = IntPtrZero;

_hook = false ;

}

// =============================================================================

//

// 继承IDisposable接口的目的在于实现Dispose方法 ,该接口继承可在派生类中实现继承

//

// =============================================================================

}现在我们需要做的就是关键步骤的了实现一个鼠标的HOOK类,该类从BaseHookLib中派生

namespace MrKrclBaseHookLibrary

{

// 鼠标时间参数类

public class MouseHookEventArgs{

/

这里你可以通过添加任何可用的成员变量或方法来实现该类的扩展

当然你也可以同对MouseEventArgs类的继承来扩展,例如:

public class MouseHookEventArgs : MouseEventArgs{

}

/

}

// =================================================================================

// 定义鼠标时间委托

// 委托的形式是可变的,这里我们遵循原始的鼠标委托写法

// public delegate void MouseEventHandler(object sender ,MouseEventArgs e)

public delegate void MouseHookEventHandler(object sender,MouseHookEventArgs e);

// =================================================================================

// 主打类 MouseHookLib

// 因为我们要继承BaseHookLib所有我们这里就不需要在进程IDISxxx接口了

public class MouseHookLib

{

// 构造函数

// HOOK鼠标消息的类型由基类负责传递,利用C#构造函数层分布特点

public MouseHookLib():base(HookTypeWH_MOUSE_LL){

callBackFun = new CallBackHookProc(MouseHookCallBackFunction);

}

public MouseHookLib():base(HookTypeWH_MOUSE_LL,new CallBackHookProc(MouseHookCallBackFunction){

}

// 析构函数

// 作用通过调用重载的Dispose函数卸载钩钩

~MouseHookLib(){

Dispose(false);

}

// 实现Dispose方法

// 如果你在基类已经实现了改方法那么,这里你需要采用重载方式实现,或者直接基类该方法

// 这里假设积累没有实现该方法

protected void Dispose( bool disposing )

{

if ( IsInstalled )

Uninstall(); if ( disposing )

GCSuppressFinalize( this );

}

public void Dispose()

{

Dispose( true );

}

/ 积累实现该方法后本类的重载实现

public override void Dispose( bool disposing )

{

if ( IsInstalled )

Uninstall(); if ( disposing )

GCSuppressFinalize( this );

}

/

// 事件

// 定义了时间和事件的触发方法

// 单独的定义事件是毫无意义的

// 这里我们以定义两个事件MouseDown ,MouseMove为例,具体根据自己的需要,方法是相同

public event MouseHookEventHander MouseMove ;

public void OnMouseMove(MouseHookEventArgs e)

{

if(MouseMove != null){

MouseMove(this , e);

}

}

public event MouseHookEventHander MouseDown ;

public void OnMouseMove(MouseHookEventArgs e)

{

if(MouseDown != null){

MouseDown(this , e);

}

}

// 鼠标钩子回调函数

public IntPtr MouseHookCallBackFunction(int nCode , IntPtr wParam , IntPtr lparam)

{

if( nCode < 0 ) return CallNextHookEx(_hhook , nCode ,wParam ,lParam);

MouseHookEventArgs e = new MouseHookEventArgs() ;

/

这里可以根据你自己的需要对拦截的消息进行过滤或者获取你自己需要的信息

例如:

if ( code == Win32HC_ACTION ){

switch ( wParamToInt32() )

{

case Win32WM_MOUSEMOVE:

OnMouseMove( e );

break;

case Win32WM_LBUTTONDOWN:

case Win32WM_RBUTTONDOWN:

case Win32WM_MBUTTONDOWN:

case Win32WM_XBUTTONDOWN:

OnMouseDown( e );

break;

}

}

这里只是一个模型 ,具体需要具体实现,关键就是根据lparam和wparam参数来实现事件的激活

从而调用事件,对目标消息进行拦截

/

return CallNextHookEx(_hhook , nCode ,wParam ,lParam);

}

}

}

lsp模式和hook模式无法进行对比,两个是属于不同级别和领域的步骤。

1、据查询相关信息显示。

2、lsp的中文名是分层服务提供程序,是TCP/IP协议等的接口协议。TCP/IP等协议的接口,便于编程人员进行网络通信的监控、浏览器、聊天工具等等都要通过这个接口来获取相应的信息。LSP如果出现异常,调用的接口就没办法正常工作,就会出现不能打开网页或者一些网游加速无法正常使用的情况。WinsockLSP可用于非常广泛的实用用途,包括Internet家长控制和Web内容筛选等。

3、Hook是Windows中提供的一种用以替换DOS下中断的系统机制,中文译为挂钩或钩子。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。

所谓 HookAPI,就是改写程序的 IAT,再调用我自己写的用于替换原API函数的函数。在我们自己写的API函数中,我们可以进行我们想要的工作。之后呢,可以把原来的函数传回去,也可以不传回去,只要你设计好了就行。

而所谓调用自己的函数,就是把原函数参数都传给我的替换函数。我们就可以利用这些参数去干我们想做的事。而系统呢,我想由于微软设置的这个钩子的目的(我这么认为的),所以不会去检查替换函数是否就是原函数,只要参数、返回值符合条件就行,要不会出错。替换函数的返回值最好是原函数,否则有可能会出错

HookAPI时,exe程序起到的作用就是进行Hook,把dll注入到要Hook的程序,并且传回要挂接的进程的ID或者全局钩子,以便查询所要挂接的模块的IAT。如果不注入进去,系统不会让你去查询IAT的。DLL做的事情是确定要挂接哪个函数和这个函数在哪个DLL中等。

一、基本信息

话不多说,先来看一下《王者荣耀》的基本信息,玩过的人都知道:

这张图整理得很清晰,《王者荣耀》是基于社交基础的一款手游,这一点很重要。

二、用户画像

从数据统计可知《王者荣耀》的典型玩家是20-29岁、本科以上学历的年轻人,虽然一直有玩家说碰到小学生了,但其实《王者荣耀》对未成年人有设置时间限制的防沉迷系统,玩得最多的还是大学生和上班族。

比较有意思的是玩家女生比男生比例略高,这在竞技类游戏中很罕见,LOL、DOTA等都是男生较大幅度高于女生。这得益于《王者荣耀》精美的画面、众多美型的英雄角色(可以看到喜欢二次元的玩家很多,这类玩家都很重视美观)和简易的 *** 作。作为一款社交属性的手游,女性玩家也会带动更多男性玩家进入,形成良性的互为促进。

三、上瘾机制

(一) 触发

1 外部触发

《王者荣耀》的外部触发主要包含了以下几个方面:

(1)付费型触发:

a IP综艺化

除了单纯的投放广告,腾讯还有些高端的玩法,打通自身平台产品间引流,并率先尝试了“手游改编综艺”,在2017年12月推出由《王者荣耀》改编的腾讯视频《王者出击》实景真人对抗赛,彻底打破“次元壁”。节目集结4支战队20位明星,以“车轮战”热血循环赛制,实现实景真人5V5竞技。每期嘉宾可以抽选20位最具代表性的英雄,他们的技能、血量、职业、攻击方式等特征也一一延续,《王者荣耀》游戏中关键的发育、攻塔、推水晶的阶段,在节目中也有一一对应的环节,此外,还有小兵、野怪、红蓝buff等NPC形象运用化妆或特效技术得以还原呈现,使游戏玩家有沉浸式感受,而对于没有玩过《王者荣耀》的观众来说,充分利用了明星的号召力,同时节目也不失趣味性,使这部分观众也可能产生对这款游戏的兴趣。

b跨品牌合作

除了自身平台的纵向拓展,《王者荣耀》也深谙横向的跨品牌合作,游戏直播平台肯定是必不可少的,此外各类品牌都可以是《王者荣耀》的合作伙伴。比如最近上线的2018KPL(王者荣耀职业联赛)全明星突围夜投票,就整合了平台+品牌,除了人气选手之外,还邀请斗鱼、虎牙、企鹅电竞的明星主播共同竞技作为吸引直播收视和投票的"诱饵",投票的筹码则是品牌合作方M&M的m豆。

c自创活动及明星代言

淘宝有双十一,京东有618,而《王者荣耀》有55开黑节。这是从去年开始《王者荣耀》自创的节日,伴随着一系列以活跃用户为目的的福利大派送,去年还宣布由人气小鲜肉鹿晗代言,今年则是五月天,应该是考虑到人数很合适吧!五月天还专门写歌并在演唱会上公然打游戏,为开黑节做足了噱头。

(2)人际型触发

很多人第一次玩《王者荣耀》想必是通过好友的邀请,此外还有很多福利活动诱使玩家在社交平台分享给他人。《王者荣耀》深知打通社交渠道的重要性, 实现了熟人社交内部传播,也一直在挖掘人际型触发的可能。在2018春节期间,《王者荣耀》通过小程序推出了"摇心愿”的活动,玩家可以许愿选择想要一个英雄、一个皮肤和一个史诗皮肤,对于这个千载难逢的机会,几乎所有玩农药的玩家都在开放时段疯狂摇手机。这个活动最重要的还有玩家不仅可以自己摇,也可以分享给微信好友让他们助攻,玩家也可以为好友助攻帮助他们完成心愿,从玩家与游戏的互动,发展到玩家与玩家之间的互动。中国人本质还是很"迷信"的,喜欢看看自己手气如何,所以有些已经放弃游戏或者从来没有玩过农药的好友都可能被吸引,加入到一起摇的行列。很多玩家还会将最终达成的心愿分享到朋友圈,实现病毒式传播与增长。

(3)回馈型触发

作为一款大热的手游,有很多媒体及自媒体平台会发布关于《王者荣耀》的最新资讯及活动、技术分析、福利介绍等,《王者荣耀》自身也会与电竞平台合作,组织线上线下活动,联动媒体报道。

(4)自主型触发

《王者荣耀》有APPd窗提示、应用推送通知、微信服务号推送、短信推送等方式引导提醒用户有新英雄、新活动等,促活+挽回玩家。

2 内部触发

虚拟世界往往是对现实无奈的一种逃避,而对于一款手游来说,《王者荣耀》设计上手并不困难,但也没有那么轻松打赢,使得玩家很容易就进入一种“心流”状态,不会感到无聊,那玩家就很乐意沉浸于这一虚拟世界,任意驰骋。在繁忙工作学习之余,对玩家来说是一种很好的消遣。

《游戏改变世界》一书也指出,游戏中对于团队的重视、极强的目标感与使命感、激励带来的成就感都是现实中可以学习的,在《王者荣耀》的世界,玩家可以达成这些优点,如果运用得当,也可以反过来对现实产生积极的影响。

(二)行动

我们可以用福格行动模型来看一下《王者荣耀》玩家的行动是如何产生的。

B(行动)=MAT(M:动机,A:能力,T:触发)

接触到上一部分提到的触发诱饵之后,玩家只要有很强的动机、并且很容易上手,就会采取行动:

动机强:

玩《王者荣耀》可以暂时逃避工作、日常生活的压力和无聊,并在游戏中获得快乐和胜利时的被接受感。如果朋友邀请一起玩,则会为了追求认同、避免排斥而产生游戏的动机。

能力高(做起来容易):

时间:从以上关于时间的数据可以发现,玩一盘《王者荣耀》只要15-20分钟左右,完全可以利用任何碎片时间,比如午休、上下班、等待、睡前的时间。完全不费时,这也使玩家养成了只要没事做就想来把农药的习惯。

金钱:普通玩家只要有能力,或者抱抱大神的大腿,并不会跟人民币玩家拉开太大的距离。《王者荣耀》还有每天任务和登录奖励,使普通玩家只要坚持游戏也能得到成长。

脑力:游戏相比PC端的LOL、DOTA等游戏来说难度不高,即使是从来没有玩过PC端游戏的新手玩家,也可以通过新手教程快速了解到游戏规则和英雄技能等, *** 作相对简单,游戏门槛低。

(三)奖励

社群的奖励:微信QQ好友

《王者荣耀》很成功的一点就是做到了与微信、QQ两大社交APP做了绑定,玩家可以实时看到有哪些好友在线,可能有时,一年都不一定讲过一句话的微信好友一起打了几把农药,就成了天天相约开黑的队友,将游戏的社交功能发挥到了极致,通过一起玩游戏找到了志同道合之人,甚至形成社群。

狩猎的奖励:杀敌快感

清晰的目标、团队合作中的即时贡献反馈、对战模式对于自身技能发挥的挑战性——这些都容易让玩家进入到”心流“状态,沉浸在游戏之中。在一局游戏中获得胜利,玩家就会得到同伴的认同感和对游戏的掌控感。即使一局游戏输了,也会激发玩家逆袭的欲望,忍不住接下来一盘又一盘,以追求”狩猎“般的快感。

《王者荣耀》和LOL一样采用了即时语音反馈,First Blood, Double Kill, Trible Kill, Killing Spree, Rampage, Godlike, Unstoppable, Legendary, 首杀,双杀,三杀,连杀等都会有语音提示,加强对玩家的正向激励。同时,如果获得MVP、连杀等成就,还可以截图发到朋友圈炫耀。

自我的奖励:排名上升

《王者荣耀》是按荣耀战力排名的,只有排位赛才能获得荣耀战力,排名按倔强青铜-秩序白银-荣耀黄金-尊贵铂金-永恒钻石-至尊星耀-最强王者依次上升,这种身份的象征也激励着玩家奋勇杀敌,而且可以在微信好友中查看到各自的排名,得到高名次也会成为好友心目中的“王者”。

正如《上瘾》一书所说,驱使玩家采取行动的不是奖励本身,而是渴望奖励时产生的那份迫切需要。《王者荣耀》的胜利、排名的上升都具有不确定性,正是这种不确定性使得玩家不断产生继续玩下去的欲望。

(四)投资

1 金钱

《王者荣耀》的商城中可以买到英雄、皮肤和铭文等,还有各类大礼包。

后期的玩家除了几个手熟的英雄之外,也会希望在各个能力属性上都有配置英雄,甚至为了收集全英雄而进行购买。《王者荣耀》也会不断新属性的新英雄,深挖玩家的这种”收藏癖“。

此外,笔者采访了身边喜欢玩《王者荣耀》的朋友,发现竟有不少是因为游戏中的皮肤而坚持玩下去的。《王者荣耀》售卖的很多皮肤不仅酷炫,拥有属性加成,很多更是限量款,有钱也不一定能买到,等同于一种独特身份的象征。十一期间《王者荣耀》推出了限定皮肤返场票选,可见《王者荣耀》深刻把握住了玩家对个性化、限量款皮肤的追捧心态。

2 时间和精力

为了排名上升玩家往往会投入大量的时间和精力,也不会想半途而废在一个不上不下的排名。这也是为什么《王者荣耀》会利用算法,往往在离升排名还有一胜的情况下为玩家匹配难度较高的对手,使玩家输几把才能赢一把,激起玩家不升级不罢休的情绪。(虽然熬夜后可能还是在同一个排名上)

需要明确的是,HOOK模型的四个阶段是循环往复的,如果在某个环节发生断裂,就不能持续让用户上瘾,所以必须形成产品使用的闭环。《王者荣耀》也是如此:

通过诱饵(好友邀请,活动宣传等),吸引用户行动(玩游戏),获得多样化酬赏(段位上升),在用户投资(投入时间、精力或金钱)之后,又获得下一个诱饵,新的周年活动福利(新英雄,新皮肤等),形成闭环。

以上,为《王者荣耀》上瘾机制分析,了解自己为什么上瘾之后,舍得放下手机,好好学习了吗?

/鼠标钩子过程,目的是加载本dll到使用鼠标的程序

//鼠标钩子的作用:当鼠标在某程序窗口中时,其就会加载我们这个dll

LRESULT CALLBACK MouseProc(

int nCode, // hook code

WPARAM wParam, // message identifier

LPARAM lParam // mouse coordinates

)

{

if (nCode==HC_ACTION)

{

//将钩子所在窗口句柄发给主程序

::SendMessage(g_hWnd,UM_WNDTITLE,wParam,(LPARAM)(((PMOUSEHOOKSTRUCT)lParam)->hwnd));

}

return CallNextHookEx(hhk,nCode,wParam,lParam);

}

//安装钩子

BOOL WINAPI StartHook(HWND hWnd)

{

g_hWnd=hWnd;

hhk=::SetWindowsHookEx(WH_MOUSE,MouseProc,hInst,0);

if (hhk==NULL)

{

return FALSE;

}

else

{

return TRUE;

}

}

//卸载钩子

VOID WINAPI StopHook()

{

HookOff();//记得恢复原API入口哈

//主程序调用该函数时,恢复的只是主程序原API的入口,

//其它程序的API入口还没有被恢复,所以我们必须处理

//dll退出过程,即在函数ExitInstance()中,调用恢复

//API入口的函数HookOff(),只有这样,其它程序再次调用

//原API时,才不会发生错误喔。

//当我们HOOK所有程序的某个系统API时,千万要注意在

//ExitInstance()中调用HookOff(),血的教训哈。

if (hhk!=NULL)

{

UnhookWindowsHookEx(hhk);

FreeLibrary(hInst);

}

}

以上就是关于如何通过HOOK方式来实现监控进程启动全部的内容,包括:如何通过HOOK方式来实现监控进程启动、c#写钩子程序、lsp模式和hook模式哪个好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10110526.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存