国产精品久av福利在线观看_亚洲一区国产精品_亚洲黄色一区二区三区_欧美成人xxxx_国产精品www_xxxxx欧美_国产精品久久婷婷六月丁香_国产特级毛片

錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠(chéng)服務(wù),錦州廣廈維修電腦,公司IT外包服務(wù)
topFlag1 設(shè)為首頁(yè)
topFlag3 收藏本站
 
maojin003 首 頁(yè) 公司介紹 服務(wù)項(xiàng)目 服務(wù)報(bào)價(jià) 維修流程 IT外包服務(wù) 服務(wù)器維護(hù) 技術(shù)文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠(chéng)服務(wù)技術(shù)文章
新手學(xué)習(xí)Vmp之控制流程圖生成

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

新手學(xué)習(xí)Vmp之控制流程圖生成

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

這里我的環(huán)境準(zhǔn)備如下:

Visual Studio + IDA SDK + Capstone + Unicorn + Graphviz

IDA SDK插件環(huán)境,主要是有一些API可以調(diào)用,方便編寫代碼,X64Dbg插件環(huán)境可以替代之。

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

Unicorn,指令模擬執(zhí)行,用來(lái)跟蹤指令。

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

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

1、使用uc_mem_map和uc_mem_write函數(shù)填充內(nèi)存區(qū)域和堆棧

2、uc_hook_add設(shè)置監(jiān)視函數(shù),每次執(zhí)行指令前檢查退出條件,例如當(dāng)前指令位于text區(qū)段且上一條指令是ret的時(shí)候,基本上就是vmp結(jié)束的時(shí)候了。

3、uc_emu_start進(jìn)行trace,拿到所有的指令跟蹤數(shù)組。

之后是根據(jù)這些地址動(dòng)態(tài)生成控制流程圖,這里需要了解一下基本塊這個(gè)概念。

核心邏輯如下:

 

 

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;

 

                }

 

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

 

                if (!currentNode->bTraced) {

 

                        currentNode->addrList.push_back(curAddr);

 

                        updateInstructionToBlockMap(curAddr, currentNode);

 

                }

 

                //判斷是否為終止指令

 

                if (isEndIns(curIns)) {

 

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

 

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

 

                                break;

 

                        }

 

                        currentNode->bTraced = true;

 

                        //這里開始進(jìn)行核心判斷

 

                        ea_t nextNodeAddr = traceList[n + 1];

 

                        VmpTraceFlowNode* nextNode = instructionToBlockMap[nextNodeAddr];

 

                        linkEdge(curAddr, nextNodeAddr);

 

                        //下一個(gè)節(jié)點(diǎn)是新節(jié)點(diǎn)

 

                        if (!nextNode) {

 

                                currentNode = createNode(nextNodeAddr);

 

                        }

 

                        //已訪問過該節(jié)點(diǎn),且節(jié)點(diǎn)指向Block頭部

 

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

 

                                currentNode = nextNode;

 

                        }

 

                        else {

 

                                //節(jié)點(diǎn)指向已有區(qū)塊其它地址,需要對(duì)區(qū)塊進(jìn)行分割

 

                                currentNode = splitBlock(nextNode, nextNodeAddr);

 

                        }

 

                }

 

        }

 

        return true;

}

再進(jìn)行節(jié)點(diǎn)合并優(yōu)化,核心代碼是這樣的:

void VmpTraceFlowGraph::MergeNodes()

{

        //已確定無(wú)法合并的節(jié)點(diǎn)

        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,指向子節(jié)點(diǎn)的邊只有1條

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

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

                                VmpTraceFlowNode* fatherNode = instructionToBlockMap[fromAddr];

                                //條件2,父節(jié)點(diǎn)指向的邊也只有1條

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

                                        //條件3,子節(jié)點(diǎn)不能指向父節(jié)點(diǎn)

                                        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);

 

}

最后是將流程圖轉(zhuǎn)換成dot語(yǔ)言,核心代碼如下:

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) {

                        //測(cè)試代碼

                        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();

 

}

得到文件后,調(diào)用dot命令行打印出流程圖

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

最后得到的結(jié)果是這樣的

 

 



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

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

    技術(shù)支持:微軟等
    国产一区高清视频| 蜜臀精品久久久久久蜜臀 | 免费精品视频一区| 国产a级片视频| www.爱爱.com| 4kfree性满足欧美hd18| 国产成人精品一区二区三区免费| 狂野欧美一区| 午夜日韩在线观看| 久久久噜噜噜久久久| 亚洲 高清 成人 动漫| 亚洲 欧美 中文字幕| 免费黄色av电影| 免费萌白酱国产一区二区三区| av在线一区二区| 日韩三级视频中文字幕| 国产一区二区在线观看免费播放| 日本少妇一级片| 一区二区三区激情视频| а√天堂资源地址在线下载| 国产日韩精品视频一区二区三区| 无码av中文一区二区三区桃花岛| 日韩免费观看视频| 精品人妻一区二区三| 色屁屁草草影院ccyycom| 日本福利片高清在线观看| 欧美色图激情小说| 激情成人在线视频| 亚洲一区二区三区视频| 午夜理伦三级做爰电影| 影音四色91| 秋霞一区二区| 中文字幕 久热精品 视频在线| 精品中文字幕乱| 中文字幕在线综合| 伊人亚洲视频| 国产99在线观看| 粉嫩aⅴ一区二区三区四区五区| 国产一区二区美女视频| 婷婷激情四射五月天| 亚洲国产一区二区久久久777| 日韩在线电影| 欧美国产禁国产网站cc| 成人欧美一区二区三区黑人孕妇| 成人信息集中地| 一级片在线播放| 日韩经典中文字幕一区| 久久久精品999| 美女被爆操网站| xfplay资源站色先锋在线观看| 精品午夜久久| 欧美成人vr18sexvr| 激情综合网婷婷| 欧美黑人乱大交| 色综合综合网| 日韩欧美国产精品一区| 日韩视频在线免费看| 国产寡妇树林野战在线播放| 国产探花一区在线观看| 日韩小视频在线观看专区| 色欲av无码一区二区人妻| 国产日韩欧美第一页| 激情五月色综合国产精品| 欧美成人猛片aaaaaaa| 国产视频一区二区视频| 美女又爽又黄| 亚洲伦理精品| 欧美麻豆久久久久久中文 | 国产精品亚洲视频在线观看| 亚洲欧美日韩精品一区二区| 精品国产va久久久久久久| 日韩一区二区在线观看视频| 成人bbav| 国产熟妇搡bbbb搡bbbb| 日韩一卡二卡三卡四卡| 成人午夜大片| 国产又爽又黄免费视频| 日韩av在线播放不卡| 亚洲图片欧美午夜| 蜜臀精品久久久久久蜜臀 | 青青青青在线视频| 色菇凉天天综合网| 最新97超碰在线| 99久久精品国产一区色| av一区二区三区免费| 久久亚洲欧美国产精品乐播| 国产一级片在线| 国产在线拍揄自揄拍无码视频| 成人a级免费视频| 国产精品传媒入口麻豆| 韩漫成人漫画| 青青草视频社区| 成人黄色一区二区| 日韩在线观看免费全集电视剧网站| 国产精品一区二区99| 亚洲人妻一区二区| 麻豆av免费在线| 欧美一a一片一级一片| 欧洲乱码伦视频免费| 毛片毛片毛片| 人妻熟人中文字幕一区二区| 国产日韩欧美在线| 一区二区三区不卡视频在线观看 | 免费a级片在线观看| 日本免费一级视频| 亚洲黄色av女优在线观看| 亚洲综合国产| 日韩三级免费| 九九热中文字幕| 娇妻高潮浓精白浆xxⅹ| 国产美女精品免费电影| 色婷婷久久久亚洲一区二区三区| 久久影视一区| 波多野结衣在线中文| 日日碰狠狠添天天爽| 91免费精品视频| 色婷婷久久综合| 日韩精品91亚洲二区在线观看| 黄视频网站在线观看| 白天操夜夜操| 性一交一乱一色一视频麻豆| 亚洲免费在线精品一区| 色哟哟在线观看一区二区三区| 小说区图片区色综合区| 国产www在线观看| 黄色av一区二区| 国产精品成人免费一区久久羞羞| 国产一区二区无遮挡| 26uuu亚洲伊人春色| 91.成人天堂一区| 国产视频一区在线观看 | xxx在线免费观看| 色一情一乱一伦一视频免费看| 蜜臀精品一区二区三区| 亚洲一级中文字幕| 性欧美1819| 久国产精品韩国三级视频| 天天躁日日躁狠狠躁喷水| 亚洲国产日韩美| 欧美日韩的一区二区| 精品国产91乱码一区二区三区四区| 伊人午夜电影| 国产女人18毛片水真多18| 日本91av在线播放| 亚洲成av人片www| 天天av综合| 成人影院在线观看| 一卡二卡三卡在线| 日韩在线第一区| 亚洲精品自在久久| 久久日一线二线三线suv| 欧美天堂影院| 精品麻豆一区二区三区| 777777国产7777777| 久久久999国产| 99久久婷婷国产综合精品电影| 四虎国产精品永久在线国在线| 给个网站可以在线观看你懂的| 四虎成人精品永久免费av| 另类小说色综合| 国产一区二区中文字幕免费看| 欧美一区二区三区公司| av在线一区二区| 亚洲区国产区| 精品中文在线| 亚洲精品视频区| h小视频在线观看网| 男人操女人的视频网站| 久草视频国产在线| 国产自产精品| 国产九九精品视频| 久久综合久久美利坚合众国| 日韩免费一区二区| 亚洲国产精品影院| 久久久久久久久99精品| 亚洲一区二区三区四区五区午夜| 欧美电影免费网站| av综合网页| 美女国产精品久久久| 多野结衣av一区| 成年人网站在线| 最近中文字幕2019第二页视频| 日日悠悠久久| 97av免费视频| 日韩美女视频网站| 国产高清视频免费在线观看| 无限资源日本好片| 欧美日韩dvd| 在线电影看在线一区二区三区| 国产99视频精品免费视频36| 国产91对白在线播放| 欧美丰满老妇厨房牲生活| 亚洲国产精品va在线观看黑人| 国产精品理伦片| 午夜亚洲视频| 国产欧美不卡| 久久国产免费| 日本va欧美va瓶| 理论片日本一区| 91精品国产麻豆国产在线观看|