以下代码是以hook OpenThread为例,如有不对的地方还请大神不吝赐教
hook SysCall应该是r3下比较底层的hook了,这种hook方式不是太多的杀软或者保护系统会去检测,暂时来说还是有一定的隐蔽性的
取得syscall的地址我是通过fs:[0xC0]获得的。
_按钮1_被单击的代码是测试用的,正常情况下,按下按钮整个窗口就会卡死,因为主线程被挂起了,hook之后按下了没反应
代码需要编译出来测试.基于我的系统编写的,不敢保证所有机器能用
mySysCall下的7个字节的nop是为了占位,因为我hook损坏的哪行代码是7个字节的。push 0x400000 retn是用来跳回原代码执行的。
setHook ()变量名 | 类 型 | 静态 | 数组 | 备 注 | sysCallAddr | 整数型 | | | oldCode | 字节集 | | | oldFlag | 整数型 | | | lenth | 整数型 | | | newCode | 字节集 | | | myFunJmpAddr | 整数型 | | |
sysCallAddr = _getSysCallAddr ()myOutPutDebugString (“sysCallAddr = 0x” + 取十六进制文本 (sysCallAddr )) VirtualProtect (sysCallAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag )oldCode = _读字节集 (sysCallAddr, 7 ) lenth = _取真实地址 (&mySysCall ) + 3 - sysCallAddr - 5 myFunJmpAddr = _取真实地址 (&mySysCall ) + 3 + 7 VirtualProtect (myFunJmpAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag )写到内存 (oldCode, myFunJmpAddr, ) myFunJmpAddr = _取真实地址 (&mySysCall ) + 3 + 15 VirtualProtect (myFunJmpAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag )写到内存 (到整数 (sysCallAddr + 7 ), myFunJmpAddr, ) newCode = { 233 } + 到字节集 (lenth )写到内存 (newCode, sysCallAddr, ) 变量循环首 (到整数 (子程序指针 ), 到整数 (子程序指针 ) + 255, 1, i )如果真 (指针到字节集 (i, 1 ) = { 232 }) 返回值 = i + 取字节集数据 (指针到字节集 (i + 1, 4 ), #整数型, ) + 5 跳出循环 ()变量循环尾 ()返回 (返回值 )变量 = 取空白字节集 (读取长度 )置入代码 ({ 96, 139, 117, 8, 129, 254, 0, 0, 1, 0, 126, 27, 139, 93, 12, 139, 85, 252, 131, 194, 8, 191, 0, 0, 0, 0, 57, 251, 126, 9, 138, 4, 62, 136, 4, 58, 71, 235, 243, 97 }) 返回 (变量 )置入代码 ({ 139, 77, 8, 139, 1, 139, 229, 93, 194, 4, 0 })返回 (0 )a = 0 置入代码 ({ 100, 161, 192, 0, 0, 0 }) 返回 (a )|
myOutPutDebugString | | | |
str | 文本型 | | | | OutputDebugString (“[msg] ” + str )hThread = OpenThread ( #THREAD_ALL_ACCESS, #NULL, GetCurrentThreadId ()) SuspendThread (hThread )CloseHandle (hThread )
补充内容 (2018-4-16 13:13):
52的也是我发的而已,不存在转载的问题 |