首页 > 程序开发 > 综合编程 > 安全编程 >

一、Hook(抽象)函数

2016-04-16

一、Hook(抽象)函数,所谓的Hook,就是用来接合两个东西的接口。如果两个东西于不同时间出现,则一方会预留空间,给予另一方于未来时刻能以实体来填补该空间,两者虚实相依,就密合起来了。

看完高焕堂老师的视频,自己总结下知识。

所谓的Hook,就是用来接合两个东西的接口。如果两个东西于不同时间出现,则一方会预留空间,给予另一方于未来时刻能以实体来填补该空间,两者虚实相依,就密合起来了。

Hook函数是Android框架与应用类别的接合处。Android以来类的继承的可Overridable函数来作为主要的Hook函数。

C++例子:

//Ex02-01.cpp

#include

using namespace std;

class SalesPerson{

protected:

double total_amt;

public:

SalesPerson( double a ) : total_amt(a) {}

virtual double bonus() const =0;

};

class SalesEngineer : public SalesPerson {

public:

SalesEngineer(double a):SalesPerson(a) {}

virtual double bonus() const

{ return( total_amt * 0.008 + 500.0 ); }

};

class SalesManager : public SalesPerson {

public:

SalesManager(double a):SalesPerson(a) {}

virtual double bonus() const

{ return( total_amt * 0.008 + 2000.0 ); }

};

void compute_bonus( const SalesPerson *ps )

{ cout << "bonus:" << ps->bonus() << endl; }

int main() {

SalesManager peter( 20000.0);

SalesEngineer alvin( 80000.0), lily( 50000.0 );

compute_bonus( &peter ); compute_bonus( &alvin );

compute_bonus( &lily );

system("PAUSE");

return EXIT_SUCCESS;

}

其中,SalesPerson 类的bonus() 虚拟函数就扮演了Hook的角色,作为父、子类别之间的接口。

Java例子:

public abstract classSalesPerson {

protected doubletotal_amt;

publicSalesPerson(doublea)

{ total_amt = a; }

public abstract doublebonus();

}

public classSalesManagerextendsSalesPerson {

publicSalesManager(doublea)

{ super(a); }

public doublebonus() {

returntotal_amt * 0.008 + 2000.0;

}

}

public classJMain {

static voidcompute_bonus( SalesPerson ps )

{ System.out.println("bonus:" + ps.bonus()); }

public static voidmain(String[] args) {

SalesManager peter = new SalesManager(20000);

SalesEngineer alvin =newSalesEngineer(80000);

SalesEngineer lily = new SalesEngineer(50000);

compute_bonus( peter );

compute_bonus( alvin );

compute_bonus( lily );

}

}

这和上面的C++一样,SalesPersons的bonus()就是Hook函数。

再来看看Android中Hook函数的运用:

想再屏幕上呈现ListView窗口,会用到以下三个类:

\

在这些类中,有许多Hook函数,Activity的onCreate()、BaseAdapter的getView()等。

因为框架的抽象设计在先,之后才配上应用类别,所以在撰写Activity、ListView和BaseAdapter的时候,设计框架的设计者不知道应用的ListView是什么样子,所以预留了虚空给应用去填补,如图

\

当应用执行时候,框架掌握整个控制权,调用myActivity子类别的onCreate函数。如图:

\

Hook函数实现了Ioc。

\

当Activity要求显示ListView的内容时,ListView就从BaseAdapter而反向

调用MyStringAdapter的getView等函数,而取得显示的内容。

Hook函数实现Ioc,促进虚实相依,因此,它在框架设计里占有极为核心的地位。

Hook函数与模式的关系

Hook函数是父子类之间的接口处,在应用框架里有许多抽象(不变)的父子类别,需要Hook函数来衔接,

Factory Method模式:

\

其中FactoryMethod()就是Hook函数,

TemplateMethod模式:

\

其中PromitiveOperation()就是Hook函数,

相关文章
最新文章
热点推荐