android 跨进程hook,偶然间想到一种无需DLL跨进程HOOK的方法

本文介绍了一种不依赖DLL的Android跨进程Hook方法,通过在API头部设置断点,中断时读取参数并调整寄存器,实现对特定API的控制。详细阐述了API调用方式、参数读取、单步执行的模拟,以及代码实现过程。
摘要由CSDN通过智能技术生成

这个方法的原理就是:

①首先在API头部写一个CC断点

②中断的时候程序收到消息,并且读出参数

需要注意的地方只有修正EIP寄存器,和读取参数的问题。

因为API采用STDCALL的方式调用,所以参数是从右向左压进堆栈的。

还有就是API的开头是

mov edi,edi

push ebp

mov ebp,esp

我们要注意,因为我们是在头部断下的,还没有执行push ebp,而执行了push ebp之后esp会减4,也就是说,我们在头部中断的时候要把esp-4才能拿ESP来读取参数!

还要注意的就是,如何不执行API直接跳转到返回地址,一般ESP储存的地址指向的就是返回地址,所以我们只要把EIP修改就好,如果你要设置返回值,那么就修改EAX为返回值。(记得修正ESP)

如何单步?这也是一个问题,我们可以在第一条指令中断之后,在第二条指令下CC断点,同时还原第一条指令,等到第二条指令触发中断事件时,我们再在第一条指令上下CC断点,再还原第二条指令,这就模拟了一次单步。

我把代码贴出来,使用VC2010编译

#include

#include

#define SE_DEBUG_PRIVILEGE 20

typedef  DWORD(WINAPI *PRtlAdjustPrivilege)   ///未文档化函数声明

(

ULONG    Privilege,

BOOLEAN Enable,

BOOLEAN CurrentThread,

PBOOLEAN Enabled

);

void WINAPI AdjustPrivilege()         ///ntdll中的提权函数

{

BOOLEAN Enabled;

PRtlAdjustPrivilege RtlAdjustPrivilege = (PRtlAdjustPrivilege)GetProcAddress(LoadLibrary((LPCSTR)"ntdll.dll"), "RtlAdjustPrivilege");

RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &Enabled);

}

int main(void)

{

DWORD pid;

DWORD lpapi;

BYTE code[2];

BYTE _code;

BYTE cc = 0xCC;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值