一、Hook(抽象)函数

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

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

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

C++例子:

//Ex02-01.cpp
#include <iostream>
using namespace std;
class <strong>SalesPerson</strong>{
protected:
double total_amt;
public:
SalesPerson( double a ) : total_amt(a) {}
virtual double <strong><span style="color:#ff6666;">bonus()</span></strong> const =0;
};
class <strong>SalesEngineer</strong> : public <strong>SalesPerson</strong> {
public:
SalesEngineer(double a):SalesPerson(a) {}
virtual double <strong><span style="color:#ff6666;">bonus()</span></strong> const
{ return( total_amt * 0.008 + 500.0 ); }
};
class <strong>SalesManager</strong> : public <strong>SalesPerson</strong> {
public:
SalesManager(double a):SalesPerson(a) {}
virtual double <strong><span style="color:#ff6666;">bonus() </span></strong>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函数,

Template Method模式:

其中PromitiveOperation()就是Hook函数,

时间: 2024-08-25 12:58:24

一、Hook(抽象)函数的相关文章

SSDTHook实例--编写稳定的Hook过滤函数

解说怎样写Hook过滤函数,比方NewZwOpenProcess.打开进程. 非常多游戏保护都会对这个函数进行Hook. 因为我们没有游戏保护的代码,无法得知游戏公司是怎样编写这个过滤函数. 我看到非常多奇形怪状的Hook过滤函数的写法.看得蛋痛无比. 比方: http://bbs.pediy.com/showthread.php?t=126802 http://bbs.pediy.com/showthread.php? t=126077 第一个bug: 调用这个函数 status = PsLo

4.5 HOOK分发函数

4.5 HOOK分发函数 本节开始深入的探讨键盘的过滤与反过滤.有趣的是,无论是过滤还是反过 滤,其原理都是进行过滤.取胜的关键在于:谁将第一个得到信息. 黑客可能会通过修改一个已经存在的驱动对象(比如前面的KbdClass)的分 发函数指针来实现过滤所有请求的目的.黑客将这些函数指针替换成自己的黑客 驱动中的函数,这样请求将被黑客的程序首先截获.然后通过调用原来被替换过 的旧的函数指针来让Windows的击键过程正常的运作下去. 4.5.1 获得类驱动对象 当然,首先要获得键盘类驱动对象,才能

libjohn hook系统函数导致的NE问题分析

一段时间,发现某个机型上一些系统级APP高概率出现NE,现场如下: pid: 20335, tid: 20335, name: m.xxx.market >>> com.xxx.market <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000140 r0 75bf67f8 r1 bec44e10 r2 41526558 r3 00000000 r4 41524fa8 r5 00000000 r6

《Python基础教程》 读书笔记 第六章 抽象 函数 参数

6.1创建函数 函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> x=1 >>> y=math.sqrt >>> callable(x) False >>> callable(y) True 定义函数用def 语句: def fib(num): result=[0,1] for i in range(num-2): resul

06、抽象--函数

Python函数 #函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. #函数能提高应用的模块性,和代码的重复利用率. 1.定义一个函数定义函数简单的规则: 1.函数代码块以def关键词开头,后接函数标识符名称和圆括号(). 2.任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 3.函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明. 4.函数内容以冒号起始,并且缩进. 5.Return[expression]结束函数,选择性地返回一个值给调用方.不

[封装]简单易用的Api Hook函数 - MyApiHookFun

使用方法:0.首先使用者请保证跑我的函数时已经注入到目标程序中1.引用外部变量extern DWORD *g_pApiAddr;extern BYTE *g_pOldCode;2.建立一个hook后工作函数 以下是hook后的测试函数LPVOID _declspec(naked) WINAPI TestFun(LPVOID UnKnow1, LPVOID UnKnow2){    ::MessageBox(NULL, TEXT("这是一个hook提示"), TEXT("提示&

android hook 框架 ADBI 如何实现dalvik函数挂钩

前面几篇分析已经能做到注入一个so到目标进程并用so里的函数挂钩目标进程的函数,如果对这个实现不了解,请返回去阅读  android hook 框架 ADBI 简介.编译.运行  . android hook 框架 ADBI 如何实现so注入 .android hook 框架 ADBI 如何实现so函数挂钩, so函数的挂钩只能影响native世界,没有影响到java虚拟机内部,而android绝大部分逻辑都是跑在虚拟机内部的.所以这篇接着分析 adbi 剩下的部分代码,看它如何实现挂钩dalv

如何hook那些在IDA中显示为sub_xxx的函数

唉,说起来这就是一个坑,Cydia Substrate在其文档中也没找到详细说明,最后也只能来看看代码曾半仙最早给的那份substrate-master源码,然后一切就了然于胸了,这个坑很大,很大!!!现在我们先来看下MSHookFunction怎么Hook IDA中的sub_xxxx函数,然后再来谈谈为啥是这样的. 就以这段代码为例吧,下断点红色选中部分,中的sub_17C94就是我想要Hook的函数,首先确认了下参数个数为2个.以下给出代码片段截图: 看到这里我想很多人有点不理解,为啥需要 

HOOK - D3D9

原文地址:http://bbs.pediy.com/showthread.php?t=126933 大家好,我搞编程有一段时间了吧,终于做出了一些自己的东西.最近一直在弄D3D游戏的透视,被他弄得焦头烂额,很多时间都花在了解决代码错误的问题上.不过功夫不负有心人我取得了一些成果,在编写代码的过程当中参阅了大量的DirectX编程方面的资料.同时也在国外N多论坛做了一个名副其实的伸手党,了解和掌握了D3D程序实现透视的一些基础知识.在这里我把我自己在研究过程中的心得体会和一些经验大体整理了一下,只

SSDT Hook结构

目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与Ring0的通信 如何安装启动停止卸载服务 参考文献 源码附件 版权 SSDT Hook效果图 加载驱动并成功Hook  NtTerminateProcess函数: 当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”的窗口,说明,我们的目的已经达到: SSDT简介