国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

3.1 IDA Pro編寫IDC腳本入門

這篇具有很好參考價值的文章主要介紹了3.1 IDA Pro編寫IDC腳本入門。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

IDA Pro內(nèi)置的IDC腳本語言是一種靈活的、C語言風格的腳本語言,旨在幫助逆向工程師更輕松地進行反匯編和靜態(tài)分析。IDC腳本語言支持變量、表達式、循環(huán)、分支、函數(shù)等C語言中的常見語法結(jié)構(gòu),并且還提供了許多特定于反匯編和靜態(tài)分析的函數(shù)和操作符。由于其靈活性和可擴展性,許多逆向工程師都喜歡使用IDC腳本語言來自動化反匯編和靜態(tài)分析過程,以提高效率和準確性。

在IDA中如果讀者按下Shift + F2則可調(diào)出腳本編輯器,如下圖所示,其中左側(cè)代表當前腳本的名稱列表,右側(cè)則代表腳本的具體實現(xiàn)細節(jié),底部存在三個菜單,第一個按鈕是運行腳本,第二個按鈕是覆蓋導入腳本,第三個則是追加導入,他們之間的功能個有不同,讀者可自行體會;

3.1 IDA Pro編寫IDC腳本入門

3.1.1 IF語句的構(gòu)建

IF語句的使用非常容易,如下代碼,通過ScreenEA()函數(shù)識別到當前光標所在位置處的指令內(nèi)存地址,并對比該內(nèi)存地址是否符合特定的條件,如果符合則輸出,不符合則最終輸出沒有找到;

#include <idc.idc>

static main()
{
    auto CurrAddress = ScreenEA(); 
    if(CurrAddress == 0x0046E31A)
    {
       Message("程序OEP => 0x%x \n",CurrAddress);
    }
    else if(CurrAddress == 0x0046E331)
    {
       Message("程序OEP => 0x%x \n",CurrAddress);
    }
    else
    {
      Message("沒有扎到OEP \n");
    }
}

3.1.2 FOR語句的構(gòu)建

與C語言格式幾乎一致,F(xiàn)or語句的構(gòu)建也很容易理解,首先程序通過GetFunctionAttr()函數(shù)并設(shè)置FUNCATTR_START屬性獲取到當前光標所指向程序段的開始地址,通過FUNCATTR_END設(shè)置光標的結(jié)束位置,最后調(diào)用For循環(huán),一次輸出當前內(nèi)存地址及下一個內(nèi)存地址,直到將本段內(nèi)容全部輸出為止;

#include <idc.idc>

static main()
{
    auto origEA,currEA,funcStart,funcEnd;
    origEA = ScreenEA();
    
    // origEA = OEP 如果origEA 不在函數(shù)內(nèi)則返回-1
    funcStart = GetFunctionAttr(origEA,FUNCATTR_START);
    funcEnd = GetFunctionAttr(origEA,FUNCATTR_END);
    Message("OEP: %x 起始地址: %x --> 結(jié)束地址: %x \n",origEA,funcStart,funcEnd);
    
    // NextHead 在currEA開始的位置尋找下一條指令的地址
    for(currEA = funcStart; currEA != -1; currEA=NextHead(currEA,funcEnd))
    {
        Message("指令地址:%8x \n",currEA);
    }
}

3.1.3 WHILE語句的構(gòu)建

該語句的構(gòu)建與FOR語句基本一致,與FOR語句唯一的不同在于該語句只能接受一個參數(shù),如下代碼中讀者需要注意GetFunctionName()可用于獲取當前光標所在位置處所屬函數(shù)的名稱。

#include <idc.idc>

static main()
{
    auto origEA,currEA,funcStart,funcEnd;
    origEA = ScreenEA();

    // origEA = OEP 如果origEA 不在函數(shù)內(nèi)則返回-1
    funcStart = GetFunctionAttr(origEA,FUNCATTR_START);
    funcEnd = GetFunctionAttr(origEA,FUNCATTR_END);
    Message("OEP: %x 起始地址: %x --> 結(jié)束地址: %x \n",origEA,funcStart,funcEnd);
    
    while(currEA != BADADDR)
    {
        Message("--> %x name: %s \n",currEA,GetFunctionName(currEA));
        currEA = NextHead(currEA,funcEnd);
    }
}

3.1.4 函數(shù)的實現(xiàn)

IDA中使用函數(shù)通??稍谝粋€字符串之前定義為static,函數(shù)的參數(shù)列表一般而言是以逗號進行間隔開的,當函數(shù)存在返回值是則通過return語句返回。

#include <idc.idc>

// 定義一個函數(shù)
static OutPutAddress(MyString)
{
    auto currAddress;
    currAddress = ScreenEA();
    Message("%d \n",MyString);
    return currAddress;
}

// 傳遞多個參數(shù)
static OutPutAddressB(x,y)
{
    return x+y;
}

static main()
{
    auto ret = OutPutAddress(123);
    Message("返回當前地址 = 0x%x \n",ret);
    
    auto ref = OutPutAddressB(100,200);
    Message("計算數(shù)值 = %d \n",ref);
    
}

3.1.5 定義并使用數(shù)組

與高級語言類似,IDC腳本中同樣支持數(shù)組操作,不同于C語言中的數(shù)組,IDC中在使用時首先需要通過CreateArray("array")創(chuàng)建一個數(shù)組,當數(shù)組指針被創(chuàng)建成功后下一步則是通過GetArrayId("array")得到該數(shù)組的指針,通過指針讀者可以使用SetArrayString設(shè)置一個字符串變量,或使用SetArrayLong設(shè)置整數(shù)變量,當用戶需要使用變量時則需要通過GetArrayElement()函數(shù)對數(shù)組內(nèi)的數(shù)據(jù)進行提取,提取時AR_STR代表提取字符串,AR_LONG則代表提取整數(shù)類型,當讀者需要刪除數(shù)組內(nèi)的特定元素可使用DelArrayElement()函數(shù),最后使用結(jié)束調(diào)用DeleteArray()注銷整個數(shù)組;

#include <idc.idc>

static main()
{
    // 創(chuàng)建數(shù)組元素
    auto array_ptr = CreateArray("array");
    // 獲取數(shù)組指針
    auto ptr = GetArrayId("array");
    
    Message("獲取到的操作指針: %x \n",ptr);
    
    // 設(shè)置兩個字符串變量
    SetArrayString(ptr,0,"hello");
    SetArrayString(ptr,1,"lyshark");
    
    // 設(shè)置兩個整數(shù)變量
    SetArrayLong(ptr,2,100);
    SetArrayLong(ptr,3,200);
    
    // 如果提取字符串使用 AR_STR 標記 ,提取整數(shù)使用 AR_LONG
    auto st = GetArrayElement(AR_STR,ptr,0);
    auto st1 = GetArrayElement(AR_STR,ptr,1);
    Message("提取字符串變量: %s %s !\n",st,st1);
    
    auto lo = GetArrayElement(AR_LONG,ptr,2);
    Message("提取整數(shù)變量: %d \n",lo);
    
    // 刪除數(shù)組的0號元素
    DelArrayElement(AR_STR,ptr,0);
    // 注銷整個數(shù)組
    DeleteArray(ptr);
}

3.1.6 字符串處理

IDC中讀者可以使用form()函數(shù)實現(xiàn)對特定字符串的格式化輸出操作,IDC中同樣也內(nèi)置了各類轉(zhuǎn)換函數(shù),如下代碼所示,則是IDC中可以經(jīng)常被用到的函數(shù)調(diào)用,讀者可自行參考;

#include <idc.idc>

static main()
{
    // 格式化字符串,類似于sprintf
    auto name = form("hello %s","lyshark");
    Message("格式化后的內(nèi)容: %s \n",name);
    
    Message("十六進制轉(zhuǎn)為整數(shù): %d \n",xtol("0x41"));
    Message("十進制100轉(zhuǎn)為八進制: %d \n",ltoa(100,8));
    Message("十進制100轉(zhuǎn)換二進制: %d \n",ltoa(100,2));
    Message("字符A的ASCII: %d \n",ord("A"));
    Message("計算字符串長度: %d \n",strlen("hello lyshark"));
    
    // 在主字符串中尋找子串
    auto main = "hello lyshark";
    auto sub = "lyshark";
    Message("尋找子串: %d \n",strstr(main,sub));
}

3.1.7 枚舉所有函數(shù)

如下腳本實現(xiàn)了枚舉當前指針所在位置處所有函數(shù)名稱及地址,首先通過ScreenEA()函數(shù)獲取當前指針所在位置,通過SegStart()用于獲取該指針所在位置處模塊的開始地址,與之對應的是SegEnd();則用于獲取結(jié)束地址,接著通過調(diào)用GetFunctionName();得到當前地址處的函數(shù)名,并依次通過NextFunction();得到下一個模塊地址,最終輸出所有函數(shù)名及其地址信息;

#include <idc.idc>

static main()
{
    auto currAddr,func,endSeg,funcName,counter;
    
    currAddr = ScreenEA();
    func = SegStart(currAddr);
    endSeg = SegEnd(currAddr);
    Message("%x --> %x \n",func,endSeg);
    
    counter = 0;
    while(func != BADADDR && func < endSeg)
    {
        funcName = GetFunctionName(func);
        if(funcName != " ")
        {
            Message("%x --> %s \n",func,funcName);
            counter++;
        }
        func = NextFunction(func);
    }
}

當然讀者可以通過增加IF語句來判斷funcName函數(shù)名是否是我們所需要枚舉的,如果是則輸出,如果不是則繼續(xù)下一個函數(shù),依次類推實現(xiàn)函數(shù)枚舉功能,讀者只需要在上述代碼基礎(chǔ)上稍加改進即可實現(xiàn);

#include <idc.idc>

static main()
{
    auto currAddr,func,endSeg,funcName,counter;
    
    currAddr = ScreenEA();
    func = SegStart(currAddr);
    endSeg = SegEnd(currAddr);
    Message("%x --> %x \n",func,endSeg);
    counter = 0;
    
    while(func != BADADDR && func < endSeg)
    {
        funcName = GetFunctionName(func);
        if(funcName != " ")
        {
            if(funcName == "__lock")
            {
                Message("%x --> %s \n",func,funcName);
            }
            counter++;
        }
        func = NextFunction(func);
    }
}

3.1.8 設(shè)置內(nèi)存區(qū)域標簽高亮

標簽高亮功能的實現(xiàn)依賴于SetColor函數(shù),該函數(shù)傳入三個參數(shù),其中參數(shù)1用于指定需要檢索的范圍,該范圍可以通過NextHead()函數(shù)獲取到,只要該節(jié)點不會返回BADADDR則可以繼續(xù)遍歷下一個節(jié)點,第二個參數(shù)則代表標注類型,第三個參數(shù)代表要在那個位置進行標注;

#include <idc.idc>

static main(void)
{
    auto head, op;
    head = NextHead(0x00000000, 0xFFFFFFFF);
    while ( head != BADADDR )
    {
        op = GetMnem(head);
        Message("%x %s \n",head,op);

        
        if ( op == "jmp" || op == "call" )
            SetColor(head, CIC_ITEM, 0x010187);
            
        if (op == "xor")
            SetColor(head, CIC_ITEM, 0x010198);
        head = NextHead(head, 0xFFFFFFFF);
    }
}

3.1.9 地址反匯編輸出

在IDA中有時我們需要對特定位置進行反匯編,并以腳本的方式輸出,此時讀者可使用GetDisasm(inst)函數(shù)來實現(xiàn),該函數(shù)傳入一個RfirstB生成的迭代類型,并依次循環(huán)輸出,直到對100行輸出為止;

#include <idc.idc>

static main(void)
{
    auto decode = 0x401000;
    auto xref;
    
    for(xref = RfirstB(decode); xref != BADADDR; xref = RnextB(decode,xref))
    {
        Message("xref: %x\n",xref);
        auto i = 0;
        auto inst = xref;
        auto op;
        
       while((i < 100) )
       {
            // 向后枚舉下一個
            inst = FindCode(inst,0x00);
        
            // 輸出反匯編
            op = GetDisasm(inst);
            Message("%x --> %s \n",inst,op);
            i++;
       }
    } 
}

當具備了反匯編功能后,那么讀者則可通過各種方式實現(xiàn)對指令集的判斷,并以此來實現(xiàn)過濾特定指令地址并輸出的目的,如下所示,通過strstr()函數(shù)對符合特定條件的字符串進行過濾,當找到后返回該函數(shù)的所在位置;

#include <idc.idc>

static main()
{
    auto currAddr,startSeg,endSeg;
    
    currAddr = ScreenEA();
    startSeg = SegStart(currAddr);
    endSeg = SegEnd(currAddr);
    
    Message("OEP = %x 起始地址: %x 結(jié)束地址: %x \n",currAddr,startSeg,endSeg);
    
    while(startSeg < endSeg)
    {
        auto op = GetDisasm(startSeg);
        
        // 查找第一條指令
        if(strstr(op,"push    esi")==0)
        {
            startSeg++;
            op = GetDisasm(startSeg);
            if(strstr(op,"push    edi"))
            {
                Message("特征: %x \n",startSeg-1);
            }
        }
        startSeg++;
    }
}

當然反匯編函數(shù)并非只有GetDisasm讀者同樣可以使用GetMnem返回位于特定地址處的指令,GetOpnd用于返回特定位置處的機器碼,同樣可以使用FindBinary實現(xiàn)對特定地址的特征碼搜索功能;

#include <idc.idc>

static main()
{
    // 搜索特征碼
    auto code = FindBinary(0x401020,1,"55 8B EC");
    Message("%x \n",code);

    // 返回反匯編代碼
    code = GetDisasm(0x401000);
    Message("%s \n",code);
    
    // 返回位于地址處的指令
    code = GetMnem(0x401000);
    Message("%s \n",code);
    
    // 返回opcode機器碼
    code = GetOpnd(0x401070,0);
    Message("%s \n",code);
}

3.1.10 枚舉函數(shù)棧幀

生成每個函數(shù)的棧幀,通過NextFunction()函數(shù)可實現(xiàn)枚舉當前模塊內(nèi)所有函數(shù)地址,通過循環(huán)并調(diào)用GetFram()來得到當前函數(shù)棧幀大小,并使用GetMemberOffset()保存棧中返回地址偏移量,依次循環(huán)輸出當前函數(shù)內(nèi)的完整棧幀數(shù)據(jù);

#include <idc.idc>

static main()
{
    auto addr,args,end,locals,frame,firstArg,name,ret;
    
    for(addr = NextFunction(addr); addr != BADADDR; addr = NextFunction(addr))
    {
        name = Name(addr);
        end = GetFunctionAttr(addr,FUNCATTR_END);
        locals = GetFunctionAttr(addr,FUNCATTR_FRSIZE);
        
        // 得到棧幀大小
        frame = GetFrame(addr);
        
        // 棧中保存返回地址偏移量
        ret = GetMemberOffset(frame," r");
        if(ret == -1)
        {
            continue;
        }
        
        firstArg = ret +4;
        args = GetStrucSize(frame) - firstArg;
        
        Message("函數(shù): %s 開始: 0x%x 結(jié)束: 0x%x 大小: %d bytes 棧幀: %d bytes (%d args) \n",name,addr,end,locals,args,args/4);
    }
}

3.1.11 檢索交叉引用

枚舉當前模塊中的交叉引用,通過XrefType()函數(shù)可枚舉出當前被分析程序中的交叉引用情況,如下案例中實現(xiàn)了對當前程序內(nèi)所有交叉引用的枚舉工作,并輸出三個參數(shù),參數(shù)1代表主函數(shù),參數(shù)2代表被引用函數(shù),參數(shù)3代表當前函數(shù)的內(nèi)存地址;

#include <idc.idc>

static main()
{
    auto func,end,target,inst,name,flags,xref;
    flags = SEARCH_DOWN | SEARCH_NEXT;
    func = GetFunctionAttr(ScreenEA(),FUNCATTR_START);
    
    if(func != -1)
    {
        name =Name(func);
        end = GetFunctionAttr(func,FUNCATTR_END);
        for(inst = func;inst < end; inst = FindCode(inst,flags))
        {
            for(target = Rfirst(inst);target != BADADDR; target = Rnext(inst,target))
            {
                xref = XrefType();
                if(xref == fl_CN || xref == fl_CF)
                {
                    Message("%s | %s | %x \n",name,Name(target),inst);
                }
            }
        }
    }
}

如果讀者想要實現(xiàn)枚舉特定一個函數(shù)的交叉引用信息,則可通過使用LocByName(bad_func)增加過濾條件,并依次實現(xiàn)過濾特定函數(shù)的目的,代碼的修改只需要小改即可;文章來源地址http://www.zghlxwxcb.cn/news/detail-746232.html

#include <idc.idc>

static FindFunction(bad_func)
{
    auto func,addr,xref,source;
    
    func = LocByName(bad_func);
    if(func == BADADDR)
    {
        Message("error \n");
    }
    else
    {
        for(addr = RfirstB(func);addr != BADADDR; addr = RnextB(func,addr))
        {
            xref = XrefType();
            if(xref == fl_CN || xref == fl_CF)
            {
                source = GetFunctionName(addr);
                Message("%s call => %0x in %s \n",bad_func,addr,source);
            }
        }
    }  
}

static main()
{
    FindFunction("LoadString");
}

到了這里,關(guān)于3.1 IDA Pro編寫IDC腳本入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • IDA腳本

    IDA腳本

    IDA集成了一個腳本引擎,用戶可以通過編程對IDA實現(xiàn)全面控制 1. File-Script File IDA會顯示一個選擇文件的對話框,讓你選擇想要運行的腳本 運行一個新的腳本,這個程序會被添加到最近運行的腳本列表 View-Recent Scripts可以查看. 2. File-IDC Command File-Python Command (IDA7.2版本為File-Scr

    2024年02月05日
    瀏覽(16)
  • IDA 特征碼生成和搜索腳本

    最近比較忙,就少寫兩句,直接附上源代碼,其中的細節(jié)點就不再贅述,如有疑問,請留言。 一共就是實現(xiàn)了兩個函數(shù),一個用于搜索特征碼 ( SearchPattern ),一個用于生成特征碼 ( GenerateFunctionSignature) 。 函數(shù)的參數(shù)和返回值: 1. SearchPattern ? 接收 一個必要參數(shù)?hexStr(即要搜

    2023年04月12日
    瀏覽(77)
  • 二進制代碼反匯編逆向工具:IDA Pro(Win&Mac)v7.7 漢化版

    二進制代碼反匯編逆向工具:IDA Pro(Win&Mac)v7.7 漢化版

    IDA Pro是一款交互式的、可編程的、可擴展的、多處理器的、交叉Windows或Linux WinCE MacOS平臺主機來分析程序。它被公認為最好的花錢可以買到的逆向工程利器,已經(jīng)成為事實上的分析敵意代碼的標準并讓其自身迅速成為攻擊研究領(lǐng)域的重要工具。 功能豐富:IDA Pro提供了諸多功

    2024年02月20日
    瀏覽(29)
  • 《算法還原 - CTF》逆向exe程序 + ida Pro 反匯編分析偽C代碼 + python算法復現(xiàn)

    《算法還原 - CTF》逆向exe程序 + ida Pro 反匯編分析偽C代碼 + python算法復現(xiàn)

    二進制安全,能干什么 逆向分析: 負責成品軟件的技術(shù)原理. 比如分析競品軟件,吸取技術(shù)上的優(yōu)點,進行技術(shù)難點公關(guān) 病毒分析: 負責分析病毒樣本.研究惡意代碼的技術(shù)手段等工作.主要是在安全公司,尤其是在殺毒軟件公司需求較多.如360 、騰訊電腦管家等. 漏洞挖掘分析: 負責

    2024年01月22日
    瀏覽(56)
  • Unity入門(三)——VS Code配置與C#腳本編寫

    Unity入門(三)——VS Code配置與C#腳本編寫

    這回我們將使用VS Code編寫我們的第一個程序并在Unity運行。 書接前文,在項目中點開“Exit-Preferences-External Tools”,確保外部腳本編輯器選擇的是VS Code 然后回到項目,在下方的“Project”中右鍵空白處,創(chuàng)建一個C#腳本文件 此時可以在右側(cè)看到該腳本的內(nèi)容,此時需要檢查類

    2024年02月07日
    瀏覽(25)
  • C語言,Linux,靜態(tài)庫編寫方法,makefile與shell腳本的關(guān)系。

    C語言,Linux,靜態(tài)庫編寫方法,makefile與shell腳本的關(guān)系。

    靜態(tài)庫編寫: 編寫.o文件 gcc -c( 小寫) seqlist.c(需要和頭文件、main.c文件在同一文件目錄下) libs.a- 去掉lib與.a剩下的為庫的名稱‘s’。 -ls 是指庫名為s。 -L 庫的路徑。 makefile文件編寫: 這個是編譯后的文件,app文件為編譯后的二進制文件。? ? ? makefile與shell腳本關(guān)系 shell?腳

    2024年02月12日
    瀏覽(22)
  • C 語言入門:如何編寫 Hello World

    C 語言是由 Dennis Ritchie 于 1972 年在貝爾實驗室創(chuàng)建的一種通用編程語言。盡管年代久遠,它仍然是一款非常流行的語言。它之所以受歡迎的主要原因是它是計算機科學領(lǐng)域的基礎(chǔ)語言之一。C 語言與 UNIX 緊密相連,因為它被用于編寫 UNIX 操作系統(tǒng)。 為什么要學習 C 語言? 它是

    2024年02月05日
    瀏覽(25)
  • C語言經(jīng)典算法之介紹IDA*算法

    目錄 前言 A.建議 B.簡介 一 代碼實現(xiàn) 二 時空復雜度 A.時間復雜度: B.空間復雜度: C.總結(jié): 三 優(yōu)缺點 A.IDA*算法的優(yōu)點: B.IDA*算法的缺點: 四 現(xiàn)實中的應用 A.建議 1.學習算法最重要的是理解算法的每一步,而不是記住算法。 2.建議讀者學習算法的時候,自己手動一步一步

    2024年04月12日
    瀏覽(17)
  • Docker學習入門(二):常用軟件安裝、掌握Docker遷移與備份、運用Dockerfile編寫創(chuàng)建容器的腳本、搭建與使用docker私有倉庫;

    Docker的學習目標: 4.掌握Tomcat Nginx等軟件的常用的安裝 5.掌握Docker遷移與備份相關(guān)命令 6.能夠運用Dockerfile編寫創(chuàng)建容器的腳本 7.能夠搭建與使用docker私有倉庫 8.學習總結(jié) 1.MYSQL的部署 ?? ?(1)拉取mysql鏡像 ?? ??? ? docker pull centos/mysql-57-centos7 ?? ??? ?? ?? ?(2)創(chuàng)建容

    2024年02月21日
    瀏覽(23)
  • 【軟件逆向】如何逆向Unity3D+il2cpp開發(fā)的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

    【軟件逆向】如何逆向Unity3D+il2cpp開發(fā)的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

    課程作業(yè)要求使用反編譯技術(shù),在游戲中實現(xiàn)無碰撞。正常情況下碰撞后角色死亡,修改為直接穿過物體不死亡。 il2CppDumper。 DnSpy。 IDA Pro。 AndroidKiller。 一、使用il2CppDumper導出程序集 將{my_game}.apk后綴修改為{my_game}.zip,使用解壓工具解壓至文件夾{my_game}。(my_game為apk的文件

    2024年02月05日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包