2024JS逆向零基础实战之JSHOOK是什么?

JSHook技术是一种常用于JavaScript逆向工程的技术,通过拦截和修改JavaScript函数的执行,来分析和操控代码的行为。以下是一些使用JSHook技术的常见方法和步骤:

在这里插入图片描述

基本概念

Hook:拦截函数的调用,在原函数执行前后插入自定义代码。

目标函数:需要拦截和分析的JavaScript函数。

常用的JSHook方法

  1. 原型链劫持:重写对象的原型方法,以拦截方法调用。
  2. 函数包装:用自定义函数替换原函数,实现拦截和修改。
  3. 属性劫持:通过Object.defineProperty劫持对象的属性访问。

实战案例

以下是一些实际应用中的JSHook方法:

方法一:原型链劫持

假设我们要拦截Array.prototype.push方法:

(function() {
    var originalPush = Array.prototype.push;
    Array.prototype.push = function() {
        console.log('Array push called with arguments:', arguments);
        return originalPush.apply(this, arguments);
    };
})();

通过这种方式,每次调用push方法时,都会先输出调用参数,然后再执行原始的push方法。

方法二:函数包装

假设我们要拦截一个全局函数fetch

(function() {
    var originalFetch = window.fetch;
    window.fetch = function() {
        console.log('Fetch called with arguments:', arguments);
        return originalFetch.apply(this, arguments).then(response => {
            console.log('Fetch response:', response);
            return response;
        });
    };
})();

这个例子中,我们在fetch函数调用前后分别插入了日志输出,便于观察请求和响应。

方法三:属性劫持

假设我们要拦截对象的某个属性访问:

(function() {
    var obj = { key: 'value' };
    Object.defineProperty(obj, 'key', {
        get: function() {
            console.log('Key property accessed');
            return 'intercepted value';
        },
        set: function(value) {
            console.log('Key property set to:', value);
        }
    });
})();

这样,每次访问或设置obj.key时,都会触发自定义的getset函数。

复杂场景中的JSHook

在实际应用中,可能会遇到更复杂的场景,例如需要劫持多个函数,或者处理动态加载的代码。以下是一些进阶技巧:

动态劫持

对于动态加载的代码,可以使用MutationObserver来监控DOM变化,自动对新加载的脚本进行劫持:

(function() {
    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.addedNodes) {
                mutation.addedNodes.forEach(function(node) {
                    if (node.tagName === 'SCRIPT') {
                        // 对新加载的脚本进行劫持
                        // 例如重新定义某些全局函数
                    }
                });
            }
        });
    });

    observer.observe(document.documentElement, {
        childList: true,
        subtree: true
    });
})();
批量劫持

对于多个函数的批量劫持,可以编写一个通用的劫持函数:

function hookFunction(object, functionName, callback) {
    var originalFunction = object[functionName];
    object[functionName] = function() {
        callback.apply(this, arguments);
        return originalFunction.apply(this, arguments);
    };
}

// 使用示例
hookFunction(console, 'log', function() {
    console.log('console.log called with arguments:', arguments);
});

hookFunction(window, 'alert', function() {
    console.log('alert called with arguments:', arguments);
});

安全和反制措施

需要注意的是,使用JSHook技术也可能被目标代码检测到。例如,某些代码会检查函数的源码或属性,来判断是否被劫持。为了应对这种情况,可以采取以下措施:

  1. 保持原函数的toString输出:确保劫持后的函数在调用toString方法时返回原始函数的源码。
  2. 隐藏自定义属性:使用不可枚举的属性来存储原函数或其他信息,避免被目标代码检测到。

总结

JSHook技术是JavaScript逆向工程中的重要工具,可以帮助分析和修改代码行为。通过原型链劫持、函数包装和属性劫持等方法,可以实现对目标函数的拦截和操控。在实际应用中,根据具体需求和场景,灵活选择和组合这些方法,可以有效应对各种逆向工程挑战。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值