设为首页收藏本站 今天是: 2024-02-27    美好的一天,从现在开始

复仇者黑客组织

 找回密码
 立即注册

QQ登录

只需一步,快速开始

    查看: 1091|回复: 10

    0基础入门通杀型 js hook

    [复制链接]

    该用户从未签到

    4

    主题

    4

    帖子

    14

    积分

    新手上路

    Rank: 1

    积分
    14
    发表于 2023-12-7 21:33:52 | 显示全部楼层 |阅读模式
    <!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
    <!-- code_chunk_output -->
      js hook 入门
        js hook 基础js hook方法检测与过检测proxy与浏览器js一键快速hook框架

    <!-- /code_chunk_output -->
    js hook 入门

    js hook 基础

    js hook非常的简单,具体步骤就是记录之前的函数,然后再重写当前函数即可原理如下图,而因为客户端拥有js的最高解释权所以任何代码都无法阻止hook,只能通过混淆来影响逆向人员分析
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(1)
    测试demo如下
    1. var _eval=eval
    2. eval=function(arg){
    3. console.log(arg)
    4.     return _eval(arg)
    5. }
    复制代码
    结果如下图
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(2)
    hook 参数稍微不一样,需要用到defineProperty方法,例如下面这样的测试demo
    1. var cookie = document.cookie;
    2. document = Object.defineProperty(document, 'cookie', {
    3.   get: function () {
    4.     console.log('getter: ' + cookie);
    5.     return cookie;
    6.   },
    7.   set: function (value) {
    8.     console.log('setter: ' + value);
    9.     cookie = value
    10.   }
    11. });
    复制代码
    打开浏览器随便找一个网站测试一下
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(3)
    js hook方法检测与过检测

    这里检测就要用到hook的特性,或者说hook使用者根本注意不到的一些点(当然如果hooker使用代{过}{滤}理器就不好使了),第一个点就是hook之后toString会更改,如下图
    1. console.log(eval+"");
    2. var _eval=eval
    3. eval=function(arg){
    4. console.log(arg)
    5.     return _eval(arg)
    6. }
    7. console.log(eval+"");
    8. eval.toString()
    复制代码
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(4)
    可以看到从原来的native code变成了我们自己写的代码,这样防守方就能轻而易举的检测到我们使用了hook这种技巧。但是这种绕过也是很简单的,就是重写我们hook函数的toString方法就好了
    1. var a=eval+""
    2. var _eval=eval
    3. eval=function(arg){
    4. console.log(arg)
    5.     return _eval(arg)
    6. }
    7. eval.toString=function(){return "function eval() { [native code] }"}
    8. console.log(eval+"");
    9. console.log(a===(eval+""))
    复制代码
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(5)
    这种方式过于简单,而且能被代{过}{滤}理器检测到,所以还可以检测原型链上的toString方法
    1. var a=eval+""
    2. var _eval=eval
    3. eval=function(arg){
    4. console.log(arg)
    5.     return _eval(arg)
    6. }
    7. eval.toString=function(){return "function eval() { [native code] }"}
    8. console.log(eval+"");
    9. console.log(a===(eval+""))
    10. console.log(Function.prototype.toString.call(eval))
    复制代码
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(6)
    当然如果我们能够注意到这一点,那么这种检测方法也是很好绕过的,就是hook原型链上的方法
    1. var a=eval+""
    2. var _eval=eval
    3. eval=function(arg){
    4. console.log(arg)
    5.     return _eval(arg)
    6. }
    7. eval.toString=function(){return "function eval() { [native code] }"}
    8. var _old=Function.prototype.toString.call
    9. Function.prototype.toString.call=function(arg){
    10.     if(arg==eval)
    11.     return "function eval() { [native code] }"
    12.     return _old(arg);
    13. }
    14. console.log(Function.prototype.toString.call(eval))
    复制代码
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(7)
    proxy与浏览器

    proxy也可以用在浏览器中,测试demo如下
    1. const handler = {
    2.     get: function(obj, prop) {
    3.         console.log(obj,prop)
    4.         return prop in obj ? obj[prop] : 37;
    5.     }
    6. };
    7. const p = new Proxy({}, handler);
    复制代码
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(8)
    但是我们为什么不在浏览器里面写Proxy而是只在nodejs里面写呢,因为在浏览器中window对象是不能重写的,自然就不能重写window的代{过}{滤}理器,所以我们只能在nodejs中使用Proxy,因为不能重写window就索然无味,但是我们可以监听新赋值的变量,例如有一些变量我们不知道他是什么时候生成的在哪里生成的我们就可以使用下面的这种技巧。
    1. Object.defineProperty(window,"dta",
    2.     {
    3.         get:function (){
    4.             return "hook dta"
    5.         },
    6.         set:function (){
    7.             debugger;
    8.         }
    9.     }
    10.     )
    复制代码
    对window.dta进行赋值就会触发set方法,就会在debugger上停下来
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(9)
    js一键快速hook框架

    首先举一个例子,我比较懒想要快速hook一个base64编码函数,但是又不想写冗长的代码怎么办呢,这里主要参考了珍惜大佬的js课程并进行了一定程度的修改,那么就需要写一个hook函数来帮助我们一劳永逸。首先要解决第一个问题就是如何让所有的对象都能访问到我们的hook方法呢,这里我们可以将hook方法定义在原型链上
    1. Function.prototype.hook=function(){}
    复制代码
    接下来时第二个问题,如何保存原方法,可以用下面这种形式
    1. var _this=this ;
    2. var Functionname=_this.name;
    3. if(!Functionname)
    4. {
    5.     console.log("hook erro")
    6.     return false;
    7. }
    8. window.dta[Functionname]=this;
    复制代码
    最后直接重写方法即可
    1. Function.prototype.hook=function (onEnter,onLeave,context) {
    2.     var _this = this;
    3.     window.dta={};
    4.     var _context = context || window;
    5.     var Functionname = _this.name;
    6.     if (!Functionname) {
    7.         console.log("hook erro")
    8.         return false;
    9.     }
    10.     window.dta[Functionname] = this;
    11.     _context[Functionname] = function () {
    12. console.log(arguments)
    13.         var args = Array.prototype.slice.call(arguments, 0);
    14.         var _this = this;
    15.         var warpper = {args}
    16.         onEnter.call(_this, warpper);
    17.         var result = window.dta[Functionname].apply(this, warpper.args);
    18.        console.log(result)
    19.         var retuenval = onLeave.call(_this, result)
    20.         if (!retuenval) {
    21.             return retuenval
    22.         }
    23.         return result;
    24.     }
    25. }
    26. btoa.hook(function (warpper){
    27.     var args=warpper.args;
    28.     console.log(args)
    29.     },function (retval){
    30.     console.log(retval)
    31.     return true
    32.     }
    33. )
    复制代码
    TBC茶馆-复仇者黑客组织<!-- home.php?mod=space&uid=476974 "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->复仇者黑客组织(10)
    当然这只是最基础的hook方式我们还要过一些简单的检测,比如重写他的toString方法去掉他的一些修改特征,这种古老又有效的方法,最终成品如下
    1. (() => {
    2.     const $toString = Function.toString
    3.     const myFunction_toString_symbol = Symbol('('.concat('', ')_', (Math.random()) + '').toString(36))
    4.     const myToString = function (){
    5.         return typeof this === 'function' && this[myFunction_toString_symbol] || $toString.call(this)
    6.     }
    7.     function set_native(func, key, value){
    8.         Object.defineProperty(func, key, {
    9.             enumerable: false,
    10.             configurable: true,
    11.             writable: true,
    12.             value: value
    13.         })
    14.     }
    15.     delete Function.prototype.toString
    16.     set_native(Function.prototype, "toString", myToString)
    17.     set_native(Function.prototype.toString, myFunction_toString_symbol, "function toString() { [native code] }")
    18.     globalThis.func_set_native = (func) => {
    19.         set_native(func, myFunction_toString_symbol, `function ${func.name || ''}() { [native code] }`)
    20.     }
    21. }).call(this)
    22. window.dta = {}
    23. Function.prototype.hook = function(onEnter, onLeave, context, Funcname){
    24.     if (!onEnter){
    25.         onEnter = function (warpper){
    26.             var args = warpper.args;
    27.             console.log(args)
    28.         }
    29.     }
    30.     if (!onLeave){
    31.         onLeave = function (retval){
    32.             console.log(retval)
    33.         }
    34.     }
    35.     // btoa.hook()
    36.     var _context = context || window;
    37.     var FuncName = this.name || Funcname;
    38.     if (!FuncName){
    39.         console.error("hook function name is empty!")
    40.         return false
    41.     }
    42.     window.dta[FuncName] = this;
    43.     _context[FuncName] = function (){
    44.         var args = Array.prototype.slice.call(arguments,0)
    45.         var _this = this
    46.         var warpper = {
    47.             args
    48.         }
    49.         onEnter.call(_this, warpper)
    50.         // this -> window
    51.         var retval = window.dta[FuncName].apply(this, warpper.args)
    52.         var hook_retval = onLeave.call(_this, retval)
    53.         if (hook_retval){
    54.             return hook_retval
    55.         }
    56.         return retval
    57.     }
    58.     Object.defineProperty(_context[FuncName], "name", {
    59.         get: function (){
    60.             return FuncName
    61.         }
    62.     })
    63.     func_set_native(_context[FuncName])
    64. }
    65. console.log("quick hook start")
    复制代码




    上一篇:iShot 2.3.2 破解-超级右键家族软件
    下一篇:手把手教你让EXE调用自己写的DLL函数实增加功能

    该用户从未签到

    1

    主题

    2086

    帖子

    1915

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1915
    发表于 2023-12-7 21:34:27 | 显示全部楼层
    学习学习啦~~~
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    2086

    帖子

    1915

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1915
    发表于 2023-12-7 21:35:23 | 显示全部楼层
    可以联系肉丝老师加群   我们的宗旨就是专治不明白
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    1991

    帖子

    850

    积分

    高级会员

    Rank: 4

    积分
    850
    发表于 2023-12-7 21:36:07 | 显示全部楼层
    我的水平应该是-99,能不能再详细点,照顾一下啥都不懂的小白 怎么用
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    1987

    帖子

    1619

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1619
    发表于 2023-12-7 21:36:40 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

    该用户从未签到

    6

    主题

    2032

    帖子

    1700

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1700
    发表于 2023-12-7 21:36:48 | 显示全部楼层
    js一键快速hook框架
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    2099

    帖子

    1602

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1602
    发表于 2023-12-7 21:37:30 | 显示全部楼层
    我觉得此篇是有学习价值的,我要多看即便吸收不了
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    1995

    帖子

    1181

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1181
    发表于 2023-12-7 21:37:54 | 显示全部楼层
    这哪里是0基础啊,看不懂
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    1918

    帖子

    890

    积分

    高级会员

    Rank: 4

    积分
    890
    发表于 2023-12-7 21:38:41 | 显示全部楼层
    看得有些晕糊糊,功力还不够哇
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    1918

    帖子

    890

    积分

    高级会员

    Rank: 4

    积分
    890
    发表于 2023-12-7 21:39:16 | 显示全部楼层
    支持一下
    回复

    使用道具 举报

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

    本版积分规则

    关闭Powered by ©科大讯飞语音云
    嗨!您好:
    欢迎来到 复仇者黑客组织。
    我的名字叫小光
    很高兴能够为您服务!
    如果已经注册【立即登录】
    还没有账号请立即注册
    Loading...
    快速回复 返回顶部 返回列表