|  | 
 
 发表于 2025-10-10 21:23:46
|
显示全部楼层 
| // Frida脚本 - 游戏限购商品发布功能(生产环境版)// 目标函数: Inter_ItemLimitEdition_Sell_Start::dispatch_sig// 编译环境: Frida 15+ function sendItemLimitEdition(userPtr, itemIndex, endTimestamp) {    const dispatchSigAddr = ptr('0x084DB878'); // 需替换实际地址
 //▼▼▼ 参数验证 ▼▼▼    const MIN_ITEM_ID = 1;    const MAX_ITEM_ID = 10000;    if (itemIndex < MIN_ITEM_ID || itemIndex > MAX_ITEM_ID) {        console.error(`[Error] Invalid itemIndex: ${itemIndex}, allowed range [${MIN_ITEM_ID}-${MAX_ITEM_ID}]`);        return;    }
 //▼▼▼ 计算结构尺寸 ▼▼▼    const HEADER_SIZE = 15;    // 头结构尺寸    const ITEM_SIZE = 72;      // 单个商品块尺寸       const totalSize = HEADER_SIZE + ITEM_SIZE;
 //▼▼▼ 安全构建参数结构 ▼▼▼    const buildParams = () => {        const buf = Memory.alloc(totalSize);                // 头结构 (0x00-0x0E)        buf.writeByteArray(new Array(10).fill(0));        buf.add(0x0A).writeU8(1);        buf.add(0x0B).writeU32(1);
 // 商品块 (0x0F开始)        const itemBlock = buf.add(0x0F);          //不填代码0x0F时,商城限购会错乱        itemBlock.add(0x00).writeU32(1);      //此代码添加后物品数量正常了,没有这条时,物品会显示9999999个        itemBlock.add(0x01).writeU32(1);          //礼包限购,并且0x04失效了;0x09存在时,此行不生效        itemBlock.add(0x02).writeU32(1);          //        itemBlock.add(0x03).writeU32(1);          //
 itemBlock.add(0x04).writeU32(21);         //---限购物品ID---   4               itemBlock.add(0x05).writeU32(0);          //---礼包限购相关---        itemBlock.add(0x06).writeU32(0);          //---礼包限购相关---        itemBlock.add(0x07).writeU32(0);          //---礼包限购相关---
 itemBlock.add(0x08).writeU32(22);         //---限购物品数量---  8        itemBlock.add(0x09).writeU32(0);          //---道具数量翻倍---      数值1=256;2=512;如果是填1,那么加上08的55,那就显示311个        itemBlock.add(0x0A).writeU32(0);          //---道具数量翻倍---        itemBlock.add(0x0B).writeU32(0);          //---道具数量翻倍---
 itemBlock.add(0x0C).writeU32(1);          //12  ,不能超过999        itemBlock.add(0x0D).writeU32(0);          //        itemBlock.add(0x0E).writeU32(0);          //        itemBlock.add(0x0F).writeU32(0);
 itemBlock.add(0x10).writeU32(0);          //---点券基本价格--- 16        itemBlock.add(0x11).writeU32(0);          //---点券价格翻倍---    1;价格不变  填2;256        itemBlock.add(0x12).writeU32(0);          //---点券价格翻倍---        itemBlock.add(0x13).writeU32(0);          //---点券价格翻倍---
 itemBlock.add(0x14).writeU32(0);          //---金币基本价格--- 20        itemBlock.add(0x15).writeU32(0);          //---金币价格翻倍---        itemBlock.add(0x16).writeU32(0);          //---金币价格翻倍---        itemBlock.add(0x17).writeU32(0);          //---金币价格翻倍---
 itemBlock.add(0x18).writeU32(2);          //24        itemBlock.add(0x19).writeU32(1);          //        itemBlock.add(0x1A).writeU32(1);          //        itemBlock.add(0x1B).writeU32(1);          //
 // itemBlock.add(0x1C).writeU32(1);          //28        // itemBlock.add(0x1D).writeU32(1);          //        // itemBlock.add(0x1E).writeU32(1);          //        // itemBlock.add(0x1F).writeU32(1);          //
 // itemBlock.add(0x20).writeU32(1743423690);          //32        // itemBlock.add(0x21).writeU32(1743423690);          //        // itemBlock.add(0x22).writeU32(1743423690);        // itemBlock.add(0x23).writeU32(1743423690);
 // itemBlock.add(0x24).writeU32(1743423690);          //36        // itemBlock.add(0x25).writeU32(1743423690);        // itemBlock.add(0x26).writeU32(1743423690);        // itemBlock.add(0x27).writeU32(1743423690);
 itemBlock.add(0x28).writeU32(1743423690);        //40        itemBlock.add(0x29).writeU32(0);        itemBlock.add(0x2A).writeU32(0);        itemBlock.add(0x2B).writeU32(0);
 // itemBlock.add(0x2C).writeU32(1743423690);        //44        // itemBlock.add(0x2D).writeU32(1743423690);        // itemBlock.add(0x2E).writeU32(1743423690);        // itemBlock.add(0x2F).writeU32(1743423690);
 // itemBlock.add(0x30).writeU32(1743423690);        //48        // itemBlock.add(0x31).writeU32(1743423690);        // itemBlock.add(0x32).writeU32(1743423690);        // itemBlock.add(0x33).writeU32(1743423690);
 // itemBlock.add(0x34).writeU32(1743423690);        //52        // itemBlock.add(0x35).writeU32(1743423690);        // itemBlock.add(0x36).writeU32(1743423690);        // itemBlock.add(0x37).writeU32(1743423690);
 // itemBlock.add(0x38).writeU32(1743423690);        //56        // itemBlock.add(0x39).writeU32(1743423690);        // itemBlock.add(0x3A).writeU32(1743423690);        // itemBlock.add(0x3B).writeU32(1743423690);
 // itemBlock.add(0x3C).writeU32(1743423690);        //60        // itemBlock.add(0x3D).writeU32(1743423690);        // itemBlock.add(0x3E).writeU32(1743423690);        // itemBlock.add(0x3F).writeU32(1743423690);
 // itemBlock.add(0x38).writeU32(11);        //itemBlock.add(0x40).writeU32(0);        //itemBlock.add(0x68).writeU32(0);                return buf;    };
 //▼▼▼ 调用原生函数 ▼▼▼    try {        const thisPtr = ptr("0xD7A24B8"); // 需替换实际地址        if (thisPtr.isNull() || userPtr.isNull()) {            console.error("[Error] Invalid pointers!");            return;        }
 const params = buildParams();        const dispatchSig = new NativeFunction(            dispatchSigAddr,            'int',            ['pointer', 'pointer', 'pointer'],            { abi: 'sysv' }        );
 const result = dispatchSig(thisPtr, userPtr, params);        console.log(`[Success] Dispatch result: ${result}`);    } catch (e) {        console.error(`[Error] Native call failed: ${e.message}`);    }}
 //▼▼▼ 使用示例 ▼▼▼(function main() {    const userPtr = ptr(0x86C4D40); // 替换实际地址    const targetItemId = 900;    const endTime = Math.floor(Date.now() / 1000) + 3600;        sendItemLimitEdition(userPtr, targetItemId, endTime);})();
 | 
 |