开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 11647|回复: 25
收起左侧

[技术专题] 易语言windows开发从入门到死亡-番外篇.极限绕过HOOK杀死进程

[复制链接]
结帖率:100% (1/1)
发表于 2017-7-23 00:03:37 | 显示全部楼层 |阅读模式   广东省中山市
为了写这篇教程浪费了我不少时间去研究
包括一些FF 15 CALL的区别,不同指令对HOOK的影响
这篇教程技术含量是比较高的.作为HOOK番外篇的第一章发出来.也就是先丢一颗炸弹下去,好让你们关注我后面的教程
这篇教程可以让你在非常极限的环境下绕过一切HOOK.无限的接近内核!
换句话说.如果谁想注入一个DLL到我的进程空间.对我的一些函数进行拦截.或者以其他方式HOOK.利用这篇教程的方法.可以让对方无比头大.
也就是这篇教程的方法.R3层下面几乎是无法被HOOK影响的.最极端的调用了用户层到内核层的中断门.一般HOOK根本无法触碰到的地方!
为了写这个教程.几乎是花费是我3个星期去准备.
易语言环境下.几乎是步步难行.VC++可以轻易实现的功能.在易语言上却相当头大.无法方便的内联汇编以及IDE反汇编调试让我只能一边看着IDA一边开着OD进行反汇编调整代码.置入代码这种静态汇编十分鸡肋.可以说是完全没有用!
至于模块?我写代码还真的从来不用模块,1是不敢用.2是嫌弃他们写的菜.需要什么功能自己写就好.不行就拿着精易的模块抄
教程开始之前.需要对windows系统熟悉.堆栈平衡等知识必须掌握
其次是一定的汇编和反汇编能力.不然基本是一脸懵逼
上次写花式HOOK.注入shell.被某个菜B吐槽百度一大堆.这次就来点难的吧
OK.开始教程吧

点评

支持模块去死系列,不错   北京市北京市  发表于 2018-2-10 15:29

评分

参与人数 4好评 +4 精币 +8 收起 理由
鐵憨憨 + 1 + 2 感谢发布原创作品,一定好好学习,天天向上
疯子大大 + 1 + 2 来回血
待删用户 + 1 + 3 感谢分享,很给力!~
badlwolf + 1 + 1 希望坚持下去!!!

查看全部评分


结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 00:06:05 | 显示全部楼层   广东省中山市
首先得知道一点.用户层和内核层.也就是R3R0.
Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据;操作系统工作在R0层,可以访问所有层的数据;而其他驱动程序位于R1、R2层,每一层只能访问本层以及权限更低层的数据。
     这应该是很好的设计,这样操作系统工作在最核心层,没有其他代码可以修改它;其他驱动程序工作在R1、R2层,有要求则向R0层调用,这样可以有效保障操作系统的安全性。但现在的OS,包括Windows和Linux都没有采用4层权限,而只是使用2层——R0层和R3层,分别来存放操作系统数据和应用程序数据,从而导致一旦驱动加载了,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情,而所谓的rootkit也就随之而生了。
大概意思也就是说.你们平常写的程度全部都是跑在R3层下面.
而你们所听到的什么驱动防御.驱动防杀.那些驱动在win下面是跑R0.也就是内核层
打个简单的比方.D*f游戏本身和检测线程都属于R3.TP的驱动防御.R0层的防御
当然.无论是linux系统还是windows系统.x86(IA32)他们都只使用了2
接下来 R3R0交互部分知识
QQ图片20170723000324.png
以Kernel32里的 CreateProcess 为例, 内部会调用ntdll.dll里导出的NtCreateProcess, ntdll.dll通过一个中断请求int 2Eh(Sysenter)进入内核态, 在内核的Executive Service Routines 层, 内部保存着一张表 “SSDT”(SystemService Descriptor Table,系统服务描述符表), 通过该表找到该API在执行体 (Executive)(ntoskrnl.exe)中导出函数的位置,最终调用系统功能。
大多数人在易语言中使用API(win32API)的时候.经常会填一个库函数.也就是来自哪个DLL kernel32user32是被熟知的DLL.ntdll却不被熟知
实际上.kernel的内部会去调用ntdll的函数.并且这两个函数的参数不一定完全一样.在内部会进行一次包装.然后调用.但是ntdll依旧属于R3.ntdll几乎也不干任何事情(大部分函数是这样的)但是他有一个重要的任务.就是记录内核层的SSDT表函数索引.通过中断.ntdll传参之后.进入内核层.然后内核函数才真正的进行操作.当然,内核层还分ZW以及NT函数.之前我在研究的DLL注入.为了足够底层,就使用了NT级函数.不过这些都与这里要说的无关了
至于SSDT.可以百度一下是什么.32位系统的年代.内核层下SSDT几乎是兵家必争之地.什么各种杀毒以及某2D游戏的T开头的驱动保护.几乎都对SSDT下了毒手.

我们要下手的点.就是ntdll

回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 00:08:33 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2017-7-23 02:07 编辑

也许某些自己菜还不愿意承认的人要说.无非就是调用一下ntdll的函数而已.跟平常调用API差不多.只是参数不一样不好写而已
没错.的确是这样.一般HOOK(无论是模块还是自己写.无论Inline还是IAT)都只是在kernel这一层进行一个拦截.也就是HOOK函数前5个字节.至于这一点.后续的HOOK教程会完美的讲清楚什么是HOOK
但是我们可以通过直接调用ntdll的函数.从而绕过HOOK.调用函数
不过也就仅此而已了.我完全可以放弃kernelHOOK.直接对ntdll的函数进行拦截.这样一来.无论你是否走ntdll.老子可以统统拦下来.于是乎.到这里才是这篇教程存在的意义
简单的说.即使你在ntdll中进行HOOK.你也无法对我调用函数进行拦截.要的就是这么骚的效果.要的就是无限接近内核的存在
怎么实现?
首先来看看ntdll的反汇编代码.
忘记说了.这篇教程以TerminateProcess为例子.也就是结束某个进程
QQ图片20170723000523.png
这张图是IDA的反汇编代码.
可以看到ntdll这个智障什么也没干.我们来一点点分析
第一步,SSDT表上的索引放入EAX.众所周知,win平台下.函数返回值都是通过EAX算了这点还是不扯了.越扯越J8
第二步.把某个地址放入EDX.
第三部.call某个位置.也就是[EDX]
然后retn 同时进行堆栈平衡
那么call到底干啥了?
接下来的代码IDA可能带不过去了.IDA进行动态调试不太合适,OD

release编译代码(防止VSJ8生成代码)然后丢到OD进行调试
QQ图片20170723000324.png
打开OD
QQ图片20170723000324.png
直接搜索内联汇编的十六进制定位过来
然后F7跟随进call
QQ图片20170723000324.png
进来以后.在这个位置
把之前的7FFE0300h 也就是目前EDX的值.放入ESP中(睁着眼睛瞎J8说话...)
然后Int 2E.通过中断门直接进入内核.之后C3返回.也就是说,一旦int 2e之后.代码就跑在了内核层.
就是这里,这就是我们需要的点了.这也就是无限接近内核的地方的.我们要做的.就是对这里动手.

回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 00:10:25 | 显示全部楼层   广东省中山市
也就是说.手动填写代码.手动push参数.最后手动平栈
ZwTerminateProces为例子.流程如下
该函数需要2个参数. ProcessHandleExitStatus.函数原型如下
QQ图片20170723000745.png
翻译为易语言版本后
QQ图片20170723000745.png
push的时候要注意.写在后面的参数要先push.也就是倒叙推进去
这个函数的参数和kernel是没有区别的.写起来比较方便
那么.第一步,push参数进去.exitcode随便填就可以.我推0
Push 0;
Push ebp-4;
由于易语言无法动态内联汇编
不如说易语言根本不能内联汇编.所以这里必须使用ebp-的方式来推栈
翻译为易语言版本后.就是
置入代码 ({ 106, 0 })
置入代码 ({ 255, 117,252 })
接下来的一步我试了很久.一直没能成功.我以为是分段分页地址的问题.后来问了一下公司大佬.发现是堆栈的问题.
正常调用的时候.TerminateProces->ZwTerminateProces->int中断的流程
也就是call 然后再次call 然后再次call
但是call=push IP 然后jump
所以之前我栈中一直少一个参数.也就是函数的返回值.所以我们需要再次Push一下
当然.这个返回值瞎J8填就行.反正我也不用你来返回
也就是再次push
这里为了方便.我们不手动去sysenter.因为要去推返回值.好麻烦的
接下来的内容.就是抄一份ntdll中的函数代码即可
.text:77F05D10 B8 72 01 00 00                 mov     eax, 172h       ; NtTerminateProcess
.text:77F05D15 BA 00 03 FE 7F                 mov     edx, 7FFE0300h
.text:77F05D1A FF 12                          call    dword ptr [edx]
.text:77F05D1C C2 08 00                       retn    8
不过有一点需要注意.我们之前推了一个多余的0.目的是为了堆栈不出毛病.但是在返回的时候.这里只retn8.我们要修改为0xC
或者不用他的C2.自己add esp
这里我选择自己add进行平衡堆栈
也就是说.最后的代码为
push 0;
push[esp-4];(这里不绝对.看你自己到底是哪个变量)
push 0;
mov eax, 0x172;
mov edx, 0x7FFE0300;
call dword ptr[edx];

add esp, 0xC;(图片是做int 2e测试的时候.多了一个Push)
QQ图片20170723000745.png
OK.汇编代码部分我们搞定了.
但是还差一点准备工作.也就是进程句柄
因为这个函数的第一个参数为一个进程句柄.所以我们需要弄个句柄过来
最后的代码如下
' 置入代码 ({ 106, 0 })
' 置入代码 ({ 255, 117, 252 })
' 置入代码 ({ 106, 0 })
' 置入代码 ({ 184, 114, 1, 0, 0, 186, 0, 3, 254, 127, 255, 18, 131, 196, 12})  ' 195 代码第二位索引号
在这之前.我们还需要做一些测试工作.


回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 00:14:24 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2017-7-23 00:32 编辑

先对这个函数进行一下HOOK.看看到底有没有效果.咱们开2个计算器
QQ图片20170723000745.png
要杀死的进程.和防止要被杀死的进程
QQ图片20170723000745.png
先杀掉3724.代表我们代码没写错.进程被正确的杀死了.

然后进行HOOK.同时弹框.说明改函数的确被HOOK.
QQ图片20170723000745.png
最后.再用我们的骚操作.强杀进程
QQ图片20170723000745.png
OK.跑起来看看

总之先用特征码定位过来.找到我们的入口.不得不说.易语言总喜欢编译垃圾代码进去.调试起来感觉像是在破J什么东西.找半天也不知道自己在哪
QQ图片20170723000745.png
由于代码被封装的太J8复杂.我也懒得找他到底是什么时候被杀的.所以直接弹框吧

过程如下
QQ图片20170723000745.png
QQ图片20170723001206.png
QQ图片20170723000745.png
QQ图片20170723001227.png
最终.代码在断点断下.同时剩下的计算器也没有被杀掉
QQ图片20170723001235.png


QQ图片20170723001223.png
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 00:16:33 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2017-7-23 00:23 编辑

然后我们单步F8.走到call [edx]
此时的堆栈为
QQ图片20170723000745.png
此时计算器依旧坚挺
QQ图片20170723000745.png
F8之后.计算器挂了
QQ图片20170723000745.png
OK.任务完美完成.这个时候.我们抓一个HOOK
QQ图片20170723000745.png
可以看到.hunter抓出来该函数依旧被HOOK
实际上我们直接绕过了这个HOOK.杀死了进程
R3下的ZWNT级函数地址相同.可以把HOOK点换成ZW或者NtTerminateProcess.kernel换成ntdll但是效果是一样的.均无法对这种方式进行拦截
这种方法几乎是无限的接近了内核.全局钩子什么的根本挂不住.人都看不见.
想通过HOOK的方式只能在sysenter的地方下钩子.然后手动跳转.并且跳过去还要判断EAX的值是不是该SSDT表上我需要拦截的函数.写起来非常复杂.而且如果对方真的这样做的.那么我只需要把返回地址推进去.然后手动去Int 2e中断.直接到达内核.
当然.真的想拦截这种方式也不是没有办法.但是会比较麻烦,只要这段代码存在于程序中.对方不在驱动层进行拦截还是比较麻烦的
OK.教程到此结束.这篇教程的难度可能对于易语言学习者来说比较高.因为需要对win系统的理解以及一定的汇编能力
接下来我会把win开发的HOOK番外篇慢慢放()出来.0开始学习HOOK.以及各种各样的骚走位.花操作
Q:为什么不用loadlibrary就能调用这些代码?这些代码不是属于ntdll
A:因为我还真没见过R3下面不用load ntdll就能跑的程序
Q:如果对方hook openprocess这个函数怎么办?
A:老办法.从底层调用,不如说我根本就没有想过要用这种办法强杀进程.只是因为这个函数要的参数少.又比较好拿到而已.如果真的想强杀进程.我还有更骚的操作.可以期待下后续教程
Q:为什么我照着你把你的代码复制下来.却跑步起来.出现问题关闭了?
A:因为我也跑不起来呀(手动滑稽)其实从IDA里面就能看出来了.我反汇编的是32位的ntdll.从指针长度就能看出来问题了.付给edx的明显是个4字节指针.同时.64位在进行传参数的时候.4个参数分别使用某R寄存器.不使用push.也就是说.如果你想在64下面跑起来.那么就去把64ntdll代码抄下来.替换那段代码.OK.值得注意的是.3264位下.内核层的SSDT表函数索引也是不一样的
Q:太复杂看不懂.没有简单的办法么?
A:.dll命令表字节写ZW或者NT级函数.同时设置好函数参数.一半来说.对方想要HOOK ntdll的函数是比较困难的.易语言在调用dll方面.参数列表是个相当麻烦的事.特别是带有指针和结构体的时候.我经常写代码也无法正确调用.所以一般直接正常调用ntdll函数即可绕过大部分HOOK.但是有一个致命的缺点
易语言在某些方面是比较智障的.为了给新手提供充分简单的环境.封装的太过于强烈了.在调用ntdll的时候.他会去手动load ntdll.至少我的5.2版本是这样的,这样一来.只要hookloadlibrary这个函数.几乎是无敌的.只有这篇教程的方法可以绕过.关于这点.我以后会专门写一篇,说明易语言是如何封装dll命令列表的
Q:这个方法太麻烦了!汇编代码根本看不懂
A:实际上在32位下.这些代码是抄过去就能用的.你需要做的只是修改函数的索引.然后把参数推进去即可
Q:HOOK系列教程什么时候写完?
A:看天气
Q:有没有内核教程?
A:建议看书.我也讲不清那玩意到现在我还在反汇编某个流氓杀毒的驱动.每天上班一脸懵逼
Q:这篇教程的意义在哪?
A:在极端环境下绕过HOOK.有些环境下.R3所有进程的一些函数都进行了HOOK.或者有些环境会下一个全局HOOK.你的所有调用该函数.都要经过人家的同意才行.或者某些环境下.会注入DLL到所有进程中.进行一些函数的拦截.特别点名某些杀毒驱动. HOOK函数之多让人惊讶.当我知道我反汇编的驱动是国内某个杀毒的时候.我的内心是崩溃的
Q:有没有视频教程
A:之前精易的视频大赛我是有准备参加的.不过又比较烦无脑喷子.最后发现分辨率要求1440.而且要用精易的壁纸.开玩笑.老婆是能随便换的么?而且我这2个显示屏.换了分辨率基本不会用电脑了.最后是因为做视频好麻烦.一点失误就要重头开始.如果精易邀请我去当直播讲师的话.倒是可以考虑下
大概能想到的东西就这么多.之后会出一些简单的教程带你们入门HOOK.看看HOOK这个在大神们中经常讨论的东西到底是啥.然后就是一些骚操作.各种花式HOOK.学会HOOK是有必要的.特殊的时候,能达到保护自己的效果
OK.为了加速我写教程的速度.把我头像旁边的收听或者关注点一下.因为这样在论坛里面灌水的时候会看起来很牛逼的样子
最后.在我附上的代码中.有相当多无用代码.那些都是我做测试的时候用的.如果能看懂的话.是有一定帮助的
骗回复而已~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 00:21:35 | 显示全部楼层   广东省中山市
本来代码是想出售的.100精币一个...上次改名花了1000.现在就剩200了不过找了半天也没找到售价在哪.干脆直接丢上来好了
1.e (10.4 KB, 下载次数: 234)
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2017-7-23 01:05:50 | 显示全部楼层   广东省中山市
最后防止某些上次不服的小菜J 特意补充内容
以下为拦截ntdll Zw或者Nt级函数的效果
QQ截图20170723010127.png
QQ截图20170723010209.png
QQ截图20170723010237.png
QQ截图20170723010245.png
QQ截图20170723010303.png
QQ截图20170723010326.png
回复 支持 反对

使用道具 举报

发表于 2017-7-23 21:56:00 | 显示全部楼层   湖南省长沙市
大神 ,但是看不懂   还要继续努力了我
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:89% (40/45)
发表于 2017-7-24 21:02:02 | 显示全部楼层   江苏省苏州市
顶楼主啦..希望楼主多发精品好帖啦.....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表