大家都知道window就是一个封闭的黑盒子,在我们没有window源码的情况下我们只能通过hook达到改变api流程的目的,在windows下的hook有很多种:比如 lnlinehook,系统消息hook等,SSDT hook(win10下我们不用考虑这个)当然在用户层我们最常用也是最好用的还是lnlinehook,通过索引API地址重新构建自己的hook函数达到一些目的,这里说的就如何不让hook成功以达到攻防的目的。
首先我们先编写一个鼠标按下的代码,当然你也可以重写其他API,我们的重点是重写API,而不是过鼠标检测
Sleep(1500);
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
然后编译,当然我们要重写必须要知道它内部干了什么
我们可以用OD打开编译好的程序
这样肯定不行,进入之后我们第一步肯定要找到自己写的代码
怎么找呢?这里又要把逆向知识补充了~~
注意刚才我们写了一个sleep函数,这里直接按暂停肯定是断在sleep上的
然后查看调用堆栈,我们要找到最外层调用的地方肯定就是地址最小的堆栈00f93f79了,点击调用来自
直接双击点进去的就来到我们的代码了 直接到mouse_event然后跟进去
这里可以看到mouse_event实际上就是调用的UsersendInput
继续跟踪进到NtUsersendInput(),这里我们就可以看到api索引号,
我们继续跟进可以看到Wow64Transition 32位转64位模式的地方
继续跟进直接就远跳了 这种长度很明显就是用户层切换到内核层的地址了,再调用int2rh或sysenter中断指令 进入系统exe和内核ZW函数通信完成参数检查 ,在调用内核NT函数完成微软API的调用,这里我们就说R3的处理,R0是R0处理的事情
总结一下 ,如果要HOOK一个API 那么我们只能索引到API地址和NT地址
那么换句话说,是不是我们直接绕过NT,自己构建一个函数地址,也就达到绕过R3层所有检测和HOOK的目的了呢
我们回到这里,因为这里是API索引号call到驱动中转的位置,这个call每个系统都不一样,并且每个API需要经过这个call 我们不可能hook到这里,如果你强行hook这里程序都会崩溃
那么大致的思路就出来了
自己写一个函数-->填入API参数-->模拟出API索引号(其实是内核SSDT的下标) call
本来想用_stdcall约定写更加方便 但是由于我对UsersendInput这个函数并不是很熟 所以直接用__declspec模拟一个UsersendInput的堆栈出来,建立一个控制台工程即可实现
__declspec(naked) void BuildMouse()//这里就是模拟器的API索引号call
{
_asm _emit 0xB8
_asm _emit 0x82
_asm _emit 0x10
_asm _emit 0x00
_asm _emit 0x00
_asm _emit 0xBA
_asm _emit 0xF0
_asm _emit 0x73
_asm _emit 0xBD
_asm _emit 0x76
_asm _emit 0xFF
_asm _emit 0xD2
_asm _emit 0xC2
_asm _emit 0x0C
_asm _emit 0x00
}
__declspec(naked) void BuildParameter()//这里模拟的就是NtUsersendInput{
_asm
{
mov edi, edi
push ebp
mov ebp, esp
sub esp, 1Ch
mov eax, dword ptr[ebp + 8]
and dword ptr[ebp - 1Ch], 0
and dword ptr[ebp - 8], 0
mov dword ptr[ebp - 0Ch], eax
mov eax, dword ptr[ebp + 10h]
mov dword ptr[ebp - 14h], eax
mov eax, dword ptr[ebp + 14h]
mov dword ptr[ebp - 10h], eax
mov eax, dword ptr[ebp + 18h]
mov dword ptr[ebp - 4], eax
lea eax, [ebp - 1Ch]
push 1Ch
push eax
push 1
call BuildMouse
mov esp, ebp
pop ebp
ret 14h
}
int _tmain(int argc, _TCHAR* argv[])
{
_asm push 1500
_asm call Sleep
_asm push 0x00
_asm push 0x00
_asm push 0x00
_asm push 0x00
_asm push 0x02
_asm call BuildParameter
_asm push 500
_asm call Sleep
_asm push 0x00
_asm push 0x00
_asm push 0x00
_asm push 0x00
_asm push 0x04
_asm call BuildParameter
_asm push 15000
_asm call Sleep
}
下面把完整代码传到附件 可以自行下载
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2019-2-2 10:16
被admin编辑
,原因: 图片本地化