欧美三级电影一区二区三区_欧美成人a视频_欧美另类一区_国产福利视频在线

錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
新手學習Vmp之控制流程圖生成

作者: 佚名  日期:2023-07-12 08:41:06   來源: 本站整理

新手學習Vmp之控制流程圖生成

控制流程圖的生成對于反混淆分析來說是非常重要的一步,這里記錄一下我研究的過程,以Vmp2為例子。

這里我的環境準備如下:

Visual Studio + IDA SDK + Capstone + Unicorn + Graphviz

IDA SDK插件環境,主要是有一些API可以調用,方便編寫代碼,X64Dbg插件環境可以替代之。

Capstone,一個很不錯的反匯編引擎,IDA自帶的反匯編引擎不太好用,用這個替代之。

Unicorn,指令模擬執行,用來跟蹤指令。

Graphviz,一個繪圖工具,可以將控制流程圖可視化。

要生成流程圖,首先使用unicron引擎對指令進行跟蹤,大致步驟如下:

1、使用uc_mem_map和uc_mem_write函數填充內存區域和堆棧

2、uc_hook_add設置監視函數,每次執行指令前檢查退出條件,例如當前指令位于text區段且上一條指令是ret的時候,基本上就是vmp結束的時候了。

3、uc_emu_start進行trace,拿到所有的指令跟蹤數組。

之后是根據這些地址動態生成控制流程圖,這里需要了解一下基本塊這個概念。

核心邏輯如下:

 

 

bool VmpTraceFlowGraph::GenerateBasicFlowData(std::vector<ea_t>& traceList)

 

{

 

        if (!traceList.size()) {

 

                return false;

 

        }

 

        cs_insn* curIns;

 

        VmpTraceFlowNode* currentNode = createNode(traceList[0]);;

 

        for (unsigned int n = 0; n < traceList.size(); ++n) {

 

                const ea_t& curAddr = traceList[n];

 

                if (!DisasmManager::DecodeInstruction(curAddr, curIns)) {

 

                        return false;

 

                }

 

                //不管是什么指令,都立即追加到當前基本塊

 

                if (!currentNode->bTraced) {

 

                        currentNode->addrList.push_back(curAddr);

 

                        updateInstructionToBlockMap(curAddr, currentNode);

 

                }

 

                //判斷是否為終止指令

 

                if (isEndIns(curIns)) {

 

                        //檢查是否為最后一條指令

 

                        if (n + 1 >= traceList.size()) {

 

                                break;

 

                        }

 

                        currentNode->bTraced = true;

 

                        //這里開始進行核心判斷

 

                        ea_t nextNodeAddr = traceList[n + 1];

 

                        VmpTraceFlowNode* nextNode = instructionToBlockMap[nextNodeAddr];

 

                        linkEdge(curAddr, nextNodeAddr);

 

                        //下一個節點是新節點

 

                        if (!nextNode) {

 

                                currentNode = createNode(nextNodeAddr);

 

                        }

 

                        //已訪問過該節點,且節點指向Block頭部

 

                        else if (nextNode->nodeEntry == nextNodeAddr) {

 

                                currentNode = nextNode;

 

                        }

 

                        else {

 

                                //節點指向已有區塊其它地址,需要對區塊進行分割

 

                                currentNode = splitBlock(nextNode, nextNodeAddr);

 

                        }

 

                }

 

        }

 

        return true;

}

再進行節點合并優化,核心代碼是這樣的:

void VmpTraceFlowGraph::MergeNodes()

{

        //已確定無法合并的節點

        std::set<ea_t> badNodeList;

        bool bUpdateNode;

        do

        {

                bUpdateNode = false;

                std::map<ea_t, VmpTraceFlowNode>::iterator it = nodeMap.begin();

                while (it != nodeMap.end()) {

                        ea_t nodeAddr = it->first;

                        if (badNodeList.count(nodeAddr)) {

                                it++;

                                continue;

                        }

                        //判斷合并條件

                        //條件1,指向子節點的邊只有1條

                        if (toEdges[nodeAddr].size() == 1) {

                                ea_t fromAddr = *toEdges[nodeAddr].begin();

                                VmpTraceFlowNode* fatherNode = instructionToBlockMap[fromAddr];

                                //條件2,父節點指向的邊也只有1條

                                if (fromEdges[fromAddr].size() == 1) {

                                        //條件3,子節點不能指向父節點

                                        if (!fromEdges[nodeAddr].count(fatherNode->addrList[fatherNode->addrList.size() - 1])) {

                                                executeMerge(fatherNode, &it->second);

                                                bUpdateNode = true;

                                                it = nodeMap.erase(it);

                                                continue;

                                        }

                                }

                        }

                        badNodeList.insert(nodeAddr);

                        it++;

                }

        } while (bUpdateNode);

 

}

最后是將流程圖轉換成dot語言,核心代碼如下:

std::string VmpTraceFlowGraph::DumpGraph()

{

        std::stringstream ss;

        ss << "strict digraph \"hello world\"{\n";

        cs_insn* tmpIns = 0x0;

 

        char addrBuffer[0x10];

        for (std::map<ea_t, VmpTraceFlowNode>::iterator it = nodeMap.begin(); it != nodeMap.end(); ++it) {

                VmpTraceFlowNode& node = it->second;

                sprintf_s(addrBuffer, sizeof(addrBuffer), "%08X", it->first);

                ss << "\"" << addrBuffer << "\"[label=\"";

                for (unsigned int n = 0; n < node.addrList.size(); ++n) {

                        //測試代碼

                        if (n > 20 && (n != node.addrList.size() - 1)) {

                                continue;

                        }

                        DisasmManager::DecodeInstruction(node.addrList[n], tmpIns);

                        sprintf_s(addrBuffer, sizeof(addrBuffer), "%08X", node.addrList[n]);

                        ss << addrBuffer << "\t" << tmpIns->mnemonic << " " << tmpIns->op_str << "\\n";

                }

                ss << "\"];\n";

        }

 

        for(std::map<ea_t, std::unordered_set<ea_t>>::iterator it = fromEdges.begin(); it != fromEdges.end(); ++it){

                std::unordered_set<ea_t>& edgeList = it->second;

                for (std::unordered_set<ea_t>::iterator edegIt = edgeList.begin(); edegIt != edgeList.end(); ++edegIt) {

                        VmpTraceFlowNode* fromBlock = instructionToBlockMap[it->first];

                        sprintf_s(addrBuffer, sizeof(addrBuffer), "%08X", fromBlock->nodeEntry);

                        ss << "\"" << addrBuffer << "\" -> ";

                        sprintf_s(addrBuffer, sizeof(addrBuffer), "%08X", *edegIt);

                        ss << "\"" << addrBuffer << "\";\n";

                }

        }

        ss << "\n}";

        return ss.str();

 

}

得到文件后,調用dot命令行打印出流程圖

dot graph.txt -T png -o vmp2.png

最后得到的結果是這樣的

 

 



熱門文章
  • 修了一個長城ATX-350P4臺式機電源,...
  • 液晶屏黑屏的維修方法
  • 自己給電腦加HDMI接口以及加裝內存...
  • 新手學習Vmp之控制流程圖生成
  • BGA芯片手工焊接心得
  • 戴爾G5 5500筆記本 版號19795-1 5v...
  • 新型 macOS 惡意軟件 ShadowVault ...
  • 企業內網,跨網段共享打印機方式。...
  • SD-WAN組網搭建教程
  • 貝加萊觸摸屏維修顯示屏維修5AP920...
  • honle電源控制器維修UV電源故障EVG...
  • 電腦沒有聲音的解決方法
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    欧美三级电影一区二区三区_欧美成人a视频_欧美另类一区_国产福利视频在线
    日韩欧美高清一区| 欧美日韩精品免费观看视频| 国产美女精品在线| 欧美tickling挠脚心丨vk| 蜜桃精品视频在线| 久久亚洲二区三区| 国产成人精品免费看| 中文av一区特黄| 色综合久久综合| 亚洲电影一级片| 日韩精品在线一区| av在线这里只有精品| 亚洲激情av在线| 精品日韩成人av| 成人国产一区二区三区精品| 亚洲国产一区在线观看| 日韩美女在线视频| 99综合电影在线视频| 午夜精品福利一区二区三区蜜桃| 精品国精品国产尤物美女| aaa欧美日韩| 捆绑紧缚一区二区三区视频| 国产精品久久久久aaaa| 日韩欧美中文一区| 一道本成人在线| 久久国产视频网| 一区二区三区鲁丝不卡| 国产亚洲自拍一区| 这里只有精品免费| 91久久精品日日躁夜夜躁欧美| 美女久久久精品| 亚洲宅男天堂在线观看无病毒| 精品国产乱码久久久久久图片 | 成人理论电影网| 亚洲国产精品一区二区www| 欧美激情一区二区三区四区 | 久久综合精品国产一区二区三区| 97久久精品人人做人人爽50路| 日本免费新一区视频| 国产精品久久久久婷婷| 精品日韩成人av| 在线播放中文字幕一区| gogo大胆日本视频一区| 久久国内精品视频| 五月婷婷激情综合| 亚洲国产成人高清精品| 一区二区三区在线不卡| 国产精品福利在线播放| 久久精子c满五个校花| 欧美大片一区二区三区| 91精品婷婷国产综合久久| 欧美艳星brazzers| 色狠狠av一区二区三区| 91啪九色porn原创视频在线观看| 国产不卡视频在线播放| 国产一区二区三区在线观看免费视频 | 95精品视频在线| 成人av在线观| 成人av电影在线| av在线播放一区二区三区| 粉嫩嫩av羞羞动漫久久久| 大白屁股一区二区视频| 国产成人精品综合在线观看 | 亚洲曰韩产成在线| 伊人性伊人情综合网| 日韩久久一区二区| 亚洲国产另类av| 男女男精品网站| 九九精品一区二区| 东方欧美亚洲色图在线| 一本色道久久综合亚洲91| 欧美伊人精品成人久久综合97 | 久久激情五月婷婷| 久久66热re国产| 国产大陆亚洲精品国产| jlzzjlzz亚洲日本少妇| 欧美午夜电影网| 欧美一区二区高清| 久久久蜜桃精品| 日韩毛片一二三区| 日韩精品福利网| 岛国一区二区三区| 欧美日韩国产区一| 欧美国产一区二区| 午夜视频在线观看一区二区三区| 老司机一区二区| 成人av电影在线网| 91精品国产综合久久婷婷香蕉| 久久免费美女视频| 亚洲第一在线综合网站| 国产一区二区精品久久99| 99久久免费精品高清特色大片| 欧美久久久一区| 久久精品亚洲精品国产欧美 | 成人小视频免费在线观看| 91成人网在线| 久久久久久久综合狠狠综合| 亚洲精品成人在线| 国产乱码精品一区二区三区忘忧草 | 国产传媒一区在线| 在线不卡一区二区| 国产精品久线观看视频| 久久se精品一区精品二区| 日本韩国欧美国产| 国产精品毛片大码女人| 免费高清成人在线| 欧美三级欧美一级| 亚洲色图另类专区| 国产福利视频一区二区三区| 欧美久久久久免费| 亚洲美女一区二区三区| 成人自拍视频在线| xfplay精品久久| 日本视频在线一区| 欧美色图一区二区三区| 综合久久久久久| 成人动漫一区二区| 欧美www视频| 奇米在线7777在线精品| 欧美日韩一区二区三区在线看| 国产精品你懂的| 国产成人午夜片在线观看高清观看| 欧美日韩一区小说| 亚洲一区二区三区四区五区黄| 色哟哟精品一区| 亚洲久草在线视频| 欧美中文字幕一二三区视频| 亚洲欧美成aⅴ人在线观看| 91在线无精精品入口| 自拍偷拍亚洲激情| 91色乱码一区二区三区| 亚洲男人的天堂在线观看| 99久久精品国产一区| 久久久美女艺术照精彩视频福利播放| 亚洲视频在线一区观看| 99精品偷自拍| 玉足女爽爽91| 欧美日韩国产美| 奇米色一区二区| 精品少妇一区二区三区日产乱码| 免费人成网站在线观看欧美高清| 欧美人妇做爰xxxⅹ性高电影 | 色婷婷av一区二区| 亚洲va韩国va欧美va| 欧美浪妇xxxx高跟鞋交| 日本vs亚洲vs韩国一区三区二区| 7777精品伊人久久久大香线蕉经典版下载| 亚洲国产成人91porn| 制服.丝袜.亚洲.中文.综合| 久久aⅴ国产欧美74aaa| 国产精品久久久久天堂| 在线观看日韩国产| 青青草精品视频| 国产亚洲欧美色| 99精品视频在线免费观看| 尤物视频一区二区| 日韩欧美不卡在线观看视频| 国产91在线|亚洲| 亚洲成人黄色影院| 久久一区二区视频| 欧日韩精品视频| 韩国v欧美v日本v亚洲v| 亚洲视频一二三| 日韩限制级电影在线观看| 国产乱理伦片在线观看夜一区| 亚洲欧洲一区二区在线播放| 欧美精品日日鲁夜夜添| 国产伦精品一区二区三区在线观看| 亚洲欧洲精品一区二区三区 | 国产欧美日韩另类视频免费观看| 色综合久久精品| 国产一区二区在线观看免费 | 偷拍一区二区三区| 国产精品国产a级| 欧美xfplay| 欧美丝袜自拍制服另类| 国产精品一区二区三区四区| 亚洲国产中文字幕| 国产欧美一区二区精品性| 欧美日韩国产在线观看| 成人18视频在线播放| 麻豆精品在线视频| 樱桃国产成人精品视频| 日本一区二区三区高清不卡| 欧美一区二区三区在线观看| 色狠狠色噜噜噜综合网| 成人免费毛片高清视频| 国内偷窥港台综合视频在线播放| 亚洲成人自拍偷拍| 亚洲精品视频一区| 中文一区二区完整视频在线观看| 91精品国产入口| 欧美亚洲自拍偷拍| 91麻豆精东视频| 成人黄动漫网站免费app| 精品在线观看免费| 久久99九九99精品| 麻豆91在线播放免费| 日日夜夜精品视频天天综合网| 一区二区三区在线视频播放|