日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Frida對Windows平臺的程序進(jìn)行逆向分析

 Frida由于使用JavaScript語言安裝鉤子的便利性而在最近變得越來越流行。我看到許多研究都將Frida用于移動平臺,但最近Windows似乎在使用方面有了更多的吸引力。在DarunGrim,我們正在研究安全研究人員可以用于日常工作的新方法。Frida是我們認(rèn)為可用于Windows逆向工程的工具之一。但是,在我們的測試過程中,我們發(fā)現(xiàn)符號查找功能是該工具廣泛使用的限制因素。我們進(jìn)行了改進(jìn),現(xiàn)在Frida 12.9.8中可以使用它。我們非常感謝OleAndréVadlaRavn?s在合并變更方面的幫助。

創(chuàng)新互聯(lián)公司服務(wù)項目包括曲靖網(wǎng)站建設(shè)、曲靖網(wǎng)站制作、曲靖網(wǎng)頁制作以及曲靖網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,曲靖網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到曲靖省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

我們將簡要介紹一下所做的更改,并說明如何在現(xiàn)實世界中解決問題時使用改進(jìn)的符號查找功能。

0x01 對Frida 12.9.8 的改進(jìn)

Frida使用dbghelp.dll API在Windows平臺中查找符號。但是它缺少符號服務(wù)器支持。我們增加了對符號服務(wù)器的支持,并改進(jìn)了Windows中傳遞符號字符串的方式。在較舊的Frida實現(xiàn)中,查找每個符號花費了一些時間,因為它使用通配符模塊名稱查找任何符號?,F(xiàn)在,你可以指定模塊名稱以加快符號查找的速度。

新的Frida將隨symsrv.dll和dbghelp.dll一起提供,以支持包括Microsoft符號服務(wù)器在內(nèi)的符號服務(wù)器。

這些是我們在Ole的幫助下所做的更改。

 
 
 
 
  1. · Add load_symbols() and improve the DbgHelp backend
  2. · Migrate agent to new DbgHelp layout on Windows
  3. · Frida 12.9.8

0x02 分析office的惡意宏

使用改進(jìn)的Frida對一個Office Macro惡意軟件進(jìn)行分析,我們希望將其應(yīng)用到Frida中進(jìn)行深度分析。

代碼注入

下圖顯示了Frida通常如何安裝hook并從已安裝的hook中獲取消息。

此過程中涉及frida,session,腳本對象,以管理hook安裝。hook回調(diào)是用JavaScript編寫的。

以下代碼顯示了如何使用這些對象來安裝分配給self.script_text變量的JavaScript hook代碼以使用process_id變量進(jìn)行處理的示例。

 
 
 
 
  1. https://github.com/ohjeongwook/Frida.examples.vbe/blob/master/code.py
  2. import os
  3. import sys
  4. import frida
  5. import process
  6. class Instrumenter:
  7.     def __init__(self, script_text):
  8.         self.sessions = []
  9.         self.script_text = script_text
  10.         self._device = frida.get_local_device()
  11.         self._device.on("child-added", self._on_child_added)
  12.         self._device.on("child-removed", self._on_child_removed)
  13.         self._device.on("output", self._on_output)
  14.         
  15.     def __del__(self):
  16.         for session in self.sessions:
  17.             session.detach()
  18.     def run(self, process_name):
  19.         proc = process.Runner(process_name, suspended = True)
  20.         if not proc.create():
  21.             return
  22.         process_id = proc.get_id()
  23.         self.instrument(process_id)
  24.         if proc:
  25.             proc.resume()
  26.     def instrument(self, process_id):
  27.         session = frida.attach(process_id)
  28.         self.sessions.append(session)
  29.         session.enable_child_gating()
  30.         script = session.create_script(self.script_text)
  31.         script.on('message', self.on_message)
  32.         script.load()
  33.     def on_message(self, message, data):
  34.         print("[%s] => %s" % (message, data))
  35.     def _on_child_added(self, child):
  36.         print(" new child: {}".format(child))
  37.         self.instrument(child.pid)
  38.     def _on_child_removed(self, child):
  39.         print(" child terminated: {}".format(child))
  40.     def _on_output(self, pid, fd, data):
  41.         print(" output: pid={}, fd={}, data={}".format(pid, fd, repr(data)))
  42. 符號查找:resolveName
  43. Frida JavaScript API在API文檔中有很好的描述。
  44. 使用Frida進(jìn)行hook的第一步是找到目標(biāo)函數(shù)。
  45. 如果函數(shù)已導(dǎo)出,則只需使用導(dǎo)出的函數(shù)名和DLL名稱調(diào)用Module.findExportByName方法。
  46. Module.findExportByName(dllName, name)
  47. 但是,如果該函數(shù)未導(dǎo)出并且僅記錄在例如PDB符號文件中,則可以調(diào)用DebugSymbol.getFunctionByName方法。使用Frida 12.9.8,你可以傳遞“ DLLName!FunctionName”符號,以在指定特定功能時提高準(zhǔn)確性,并在定位它們時獲得更好的性能。
  48. 有時,為模塊加載符號可能很慢,因為它可能來自遠(yuǎn)程符號服務(wù)器。因此,你需要調(diào)用DebugSymbol.load方法來啟動符號的加載,以便我們加載最少數(shù)量的符號。
  49. 下面是一個示例代碼,該示例代碼使用Module.findExportByName和DebugSymbol方法查找任何帶符號或?qū)С龅暮瘮?shù)。它使用字典來緩存其發(fā)現(xiàn),以刪除所有重復(fù)的信息。如果你要hook大量函數(shù),則可以節(jié)省整個符號查找時間。
  50. vbe.js
  51. https://github.com/ohjeongwook/Frida.examples.vbe/blob/master/vbe.js
  52. var loadedModules = {}
  53. var resolvedAddresses = {}
  54. function resolveName(dllName, name) {
  55.   var moduleName = dllName.split('.')[0]
  56.   var functionName = moduleName + "!" + name
  57.   if (functionName in resolvedAddresses) {
  58.     return resolvedAddresses[functionName]
  59.   }
  60.   log("resolveName " + functionName);
  61.   log("Module.findExportByName " + dllName + " " + name);
  62.   var addr = Module.findExportByName(dllName, name)
  63.   if (!addr || addr.isNull()) {
  64.     if (!(dllName in loadedModules)) {
  65.       log(" DebugSymbol.loadModule " + dllName);
  66.       try {
  67.         DebugSymbol.load(dllName)
  68.       } catch (err) {
  69.         return 0;
  70.       }
  71.       log(" DebugSymbol.load finished");
  72.       loadedModules[dllName] = 1
  73.     }
  74.     try {
  75.       log(" DebugSymbol.getFunctionByName: " + functionName);
  76.       addr = DebugSymbol.getFunctionByName(moduleName + '!' + name)
  77.       log(" DebugSymbol.getFunctionByName: addr = " + addr);
  78.     } catch (err) {
  79.       log(" DebugSymbol.getFunctionByName: Exception")
  80.     }
  81.   }
  82.   resolvedAddresses[functionName] = addr
  83.   return addr
  84. }
  85. function loadModuleForAddress(address) {
  86.   var modules = Process.enumerateModules()
  87.   var i
  88.   for (i = 0; i < modules.length; i++) {
  89.     if (address >= modules[i].base && address <= modules[i].base.add(modules[i].size)) {
  90.       log(" " + modules[i].name + ": " + modules[i].base + " " + modules[i].size + " " + modules[i].path)
  91.       var modName = modules[i].path
  92.       if (!(modName in loadedModules)) {
  93.         log("  DebugSymbol.loadModule " + modName);
  94.         try {
  95.           DebugSymbol.load(modName)
  96.         } catch (err) {
  97.           return 0;
  98.         }
  99.         loadedModules[modName] = 1
  100.       }
  101.       break
  102.     }
  103.   }
  104. }
  105. var hookedFunctions = {}
  106. var addressToFunctions = {}
  107. var blackListedFunctions = {
  108.   'I_RpcClearMutex': 1
  109. }
  110. function hookFunction(dllName, funcName, callback) {
  111.   if (funcName in blackListedFunctions) {
  112.     return
  113.   }
  114.   var symbolName = dllName + "!" + funcName
  115.   if (symbolName in hookedFunctions) {
  116.     return
  117.   }
  118.   hookedFunctions[symbolName] = 1
  119.   var addr = resolveName(dllName, funcName)
  120.   if (!addr || addr.isNull()) {
  121.     return
  122.   }
  123.   if (addr in hookedFunctions) {
  124.     return
  125.   }
  126.   hookedFunctions[addr] = 1
  127.   addressToFunctions[addr] = symbolName
  128.   log('Interceptor.attach: ' + symbolName + '@' + addr);
  129.   Interceptor.attach(addr, callback)
  130. }
  131. function hookPointers(address, count) {
  132.   if (address.isNull())
  133.     return
  134.   var currentAddress = address
  135.   for (var i = 0; i < count; i++) {
  136.     var readAddress = ptr(currentAddress).readPointer();
  137.     readAddress = ptr(readAddress)
  138.     var symbolInformation = DebugSymbol.fromAddress(readAddress)
  139.     var name = readAddress
  140.     if (symbolInformation && symbolInformation.name) {
  141.       name = symbolInformation.name
  142.     }
  143.     log('Hooking ' + readAddress + ": " + name)
  144.     try {
  145.       Interceptor.attach(readAddress, {
  146.         onEnter: function (args) {
  147.           log('[+] ' + name)
  148.         }
  149.       })
  150.     } catch (err) {}
  151.     currentAddress = currentAddress.add(4)
  152.   }
  153. }
  154. function hookFunctionNames(moduleName, funcNames) {
  155.   for (var i = 0; i < funcNames.length; i++) {
  156.     var funcName = funcNames[i]
  157.     try {
  158.       hookFunction(moduleName, funcName, {
  159.         onEnter: function (args) {
  160.           var name = ''
  161.           if (this.context.pc in addressToFunctions) {
  162.             name = addressToFunctions[this.context.pc]
  163.           }
  164.           log("[+] " + name + " (" + this.context.pc + ")")
  165.         }
  166.       })
  167.     } catch (err) {
  168.       log("Failed to hook " + funcName)
  169.     }
  170.   }
  171. }
  172. function BytesToCLSID(address) {
  173.   if (address.isNull())
  174.     return
  175.   var data = new Uint8Array(ptr(address).readByteArray(0x10))
  176.   var clsid = "{" + getHexString(data[3]) + getHexString(data[2]) + getHexString(data[1]) + getHexString(data[0])
  177.   clsid += '-' + getHexString(data[5]) + getHexString(data[4])
  178.   clsid += '-' + getHexString(data[7]) + getHexString(data[6])
  179.   clsid += '-' + getHexString(data[8]) + getHexString(data[9])
  180.   clsid += '-' + getHexString(data[10]) + getHexString(data[11]) + getHexString(data[12]) + getHexString(data[13]) + getHexString(data[14]) + getHexString(data[15])
  181.   clsid += '}'
  182.   return clsid
  183. }
  184. function log(message) {
  185.   console.log(message)
  186. }
  187. function dumpAddress(address) {
  188.   log('[+] address: ' + address);
  189.   if (address.isNull())
  190.     return
  191.   var data = ptr(address).readByteArray(50);
  192.   log(hexdump(data, {
  193.     offset: 0,
  194.     length: 50,
  195.     header: true,
  196.     ansi: false
  197.   }));
  198. }
  199. function dumpBytes(address, length) {
  200.   if (address.isNull())
  201.     return
  202.   var data = ptr(address).readByteArray(length);
  203.   log(hexdump(data, {
  204.     offset: 0,
  205.     length: length,
  206.     header: true,
  207.     ansi: false
  208.   }));
  209. }
  210. function dumpSymbols(address, count) {
  211.   if (address.isNull())
  212.     return
  213.   var currentAddress = address
  214.   for (var i = 0; i < count; i++) {
  215.     var readAddress = ptr(currentAddress).readPointer();
  216.     readAddress = ptr(readAddress)
  217.     var symbolInformation = DebugSymbol.fromAddress(readAddress)
  218.     if (symbolInformation && symbolInformation.name) {
  219.       log(currentAddress + ":\t" + readAddress + " " + symbolInformation.name)
  220.     } else {
  221.       log(currentAddress + ":\t" + readAddress)
  222.     }
  223.     currentAddress = currentAddress.add(4)
  224.   }
  225. }
  226. function dumpBSTR(address) {
  227.   log('[+] address: ' + address);
  228.   if (address.isNull())
  229.     return
  230.   var length = ptr(address - 4).readULong(4);
  231.   log("length: " + length)
  232.   var data = ptr(address).readByteArray(length);
  233.   log(hexdump(data, {
  234.     offset: 0,
  235.     length: length,
  236.     header: true,
  237.     ansi: false
  238.   }));
  239. }
  240. function getString(address) {
  241.   if (address.isNull())
  242.     return
  243.   var dataString = ''
  244.   var offset = 0
  245.   var stringEnded = false
  246.   while (!stringEnded) {
  247.     var data = new Uint8Array(ptr(address.add(offset)).readByteArray(10));
  248.     if (data.length <= 0) {
  249.       break
  250.     }
  251.     var i;
  252.     for (i = 0; i < data.length; i++) {
  253.       if (data[i] == 0x0) {
  254.         stringEnded = true
  255.         break
  256.       }
  257.       dataString += String.fromCharCode(data[i])
  258.     }
  259.     offset += data.length
  260.   }
  261.   log("dataString: " + dataString)
  262.   return dataString;
  263. }
  264. function dumpWSTR(address) {
  265.   if (address.isNull())
  266.     return
  267.   var dataString = ''
  268.   var offset = 0
  269.   var stringEnded = false
  270.   while (!stringEnded) {
  271.     var data = new Uint8Array(ptr(address.add(offset)).readByteArray(20));
  272.     if (data.length <= 0) {
  273.       break
  274.     }
  275.     var i;
  276.     for (i = 0; i < data.length; i += 2) {
  277.       if (data[i] == 0x0 && data[i + 1] == 0x0) {
  278.         stringEnded = true
  279.         break
  280.       }
  281.       dataString += String.fromCharCode(data[i])
  282.     }
  283.     offset += data.length
  284.   }
  285.   log("dataString: " + dataString)
  286.   return dataString;
  287. }
  288. function hookRtcShell(moduleName) {
  289.   hookFunction(moduleName, "rtcShell", {
  290.     onEnter: function (args) {
  291.       log("[+] rtcShell")
  292.       var variantArg = ptr(args[0])
  293.       dumpAddress(variantArg);
  294.       var bstrPtr = ptr(variantArg.add(8).readULong())
  295.       dumpBSTR(bstrPtr);
  296.     }
  297.   })
  298. }
  299. function hookVBAStrCat(moduleName) {
  300.   hookFunction(moduleName, "__vbaStrCat", {
  301.     onEnter: function (args) {
  302.       log("[+] __vbaStrCat")
  303.       // log('[+] ' + name);
  304.       // dumpBSTR(args[0]);
  305.       // dumpBSTR(args[1]);
  306.     },
  307.     onLeave: function (retval) {
  308.       dumpBSTR(retval);
  309.     }
  310.   })
  311. }
  312. function hookVBAStrComp(moduleName) {
  313.   hookFunction(moduleName, "__vbaStrComp", {
  314.     onEnter: function (args) {
  315.       log('[+] __vbaStrComp');
  316.       log(ptr(args[1]).readUtf16String())
  317.       log(ptr(args[2]).readUtf16String())
  318.     }
  319.   })
  320. }
  321. function hookRtcCreateObject(moduleName) {
  322.   hookFunction(moduleName, "rtcCreateObject", {
  323.     onEnter: function (args) {
  324.       log('[+] rtcCreateObject');
  325.       dumpAddress(args[0]);
  326.       dumpBSTR(args[0]);
  327.       log(ptr(args[0]).readUtf16String())
  328.     },
  329.     onLeave: function (retval) {
  330.       dumpAddress(retval);
  331.     }
  332.   })
  333. }
  334. function hookRtcCreateObject2(moduleName) {
  335.   hookFunction(moduleName, "rtcCreateObject2", {
  336.     onEnter: function (args) {
  337.       log('[+] rtcCreateObject2');
  338.       dumpAddress(args[0]);
  339.       dumpBSTR(args[1]);
  340.       log(ptr(args[2]).readUtf16String())
  341.     },
  342.     onLeave: function (retval) {
  343.       dumpAddress(retval);
  344.     }
  345.   })
  346. }
  347. //  int __stdcall CVbeProcs::CallMacro(CVbeProcs *this, const wchar_t *)
  348. function hookCVbeProcsCallMacro(moduleName) {
  349.   hookFunction(moduleName, "CVbeProcs::CallMacro", {
  350.     onEnter: function (args) {
  351.       log('[+] CVbeProcs::CallMacro');
  352.       dumpAddress(args[0]);
  353.       dumpWSTR(args[1]);
  354.     },
  355.     onLeave: function (retval) {
  356.       dumpAddress(retval);
  357.     }
  358.   })
  359. }
  360. function hookDispCall(moduleName) {
  361.   hookFunction(moduleName, "DispCallFunc", {
  362.     onEnter: function (args) {
  363.       log("[+] DispCallFunc")
  364.       var pvInstance = args[0]
  365.       var oVft = args[1]
  366.       var instance = ptr(ptr(pvInstance).readULong());
  367.       log(' instance:' + instance);
  368.       log(' oVft:' + oVft);
  369.       var vftbPtr = instance.add(oVft)
  370.       log(' vftbPtr:' + vftbPtr);
  371.       var functionAddress = ptr(ptr(vftbPtr).readULong())
  372.       loadModuleForAddress(functionAddress)
  373.       var functionName = DebugSymbol.fromAddress(functionAddress)
  374.       if (functionName) {
  375.         log(' functionName:' + functionName);
  376.       }
  377.       dumpAddress(functionAddress);
  378.       var currentAddress = functionAddress
  379.       for (var i = 0; i < 10; i++) {
  380.         try {
  381.           var instruction = Instruction.parse(currentAddress)
  382.           log(instruction.address + ': ' + instruction.mnemonic + ' ' + instruction.opStr)
  383.           currentAddress = instruction.next
  384.         } catch (err) {
  385.           break
  386.         }
  387.       }
  388.     }
  389.   })
  390. }
  391. hookRtcShell('vbe7')
  392. hookVBAStrCat('vbe7')
  393. hookVBAStrComp('vbe7')
  394. hookRtcCreateObject('vbe7')
  395. hookRtcCreateObject2('vbe7')
  396. hookCVbeProcsCallMacro('vbe7')
  397. hookDispCall('oleaut32')

設(shè)置符號路徑

在Windows環(huán)境下設(shè)置符號服務(wù)器有多種方法,建議你從命令行設(shè)置_NT_SYMBOL_PATH變量。Windows調(diào)試器的符號路徑對變量的用法有很好的描述。

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/symbol-path
以下將使用“ c:\ symbols”作為其本地符號存儲來緩存正式的Microsoft符號服務(wù)器。

setx _NT_SYMBOL_PATH SRV*c:\symbols*https://msdl.microsoft.com/download/symbols
以下命令將使系統(tǒng)使用默認(rèn)的符號存儲目錄。

setx _NT_SYMBOL_PATH SRV*https://msdl.microsoft.com/download/symbols
運行惡意軟件并觀察行為

我們使用以下示例測試Frida的符號查找功能。惡意樣本做了一些混淆,可以使用Frida hook輕松分析。

我們在此處提供的代碼可從以下GitHub存儲庫中找到。

 
 
 
 
  1. https://github.com/ohjeongwook/Frida.examples.vbe
  2. var loadedModules = {}
  3. var resolvedAddresses = {}
  4. function resolveName(dllName, name) {
  5.   var moduleName = dllName.split('.')[0]
  6.   var functionName = moduleName + "!" + name
  7.   if (functionName in resolvedAddresses) {
  8.     return resolvedAddresses[functionName]
  9.   }
  10.   log("resolveName " + functionName);
  11.   log("Module.findExportByName " + dllName + " " + name);
  12.   var addr = Module.findExportByName(dllName, name)
  13.   if (!addr || addr.isNull()) {
  14.     if (!(dllName in loadedModules)) {
  15.       log(" DebugSymbol.loadModule " + dllName);
  16.       try {
  17.         DebugSymbol.load(dllName)
  18.       } catch (err) {
  19.         return 0;
  20.       }
  21.       log(" DebugSymbol.load finished");
  22.       loadedModules[dllName] = 1
  23.     }
  24.     try {
  25.       log(" DebugSymbol.getFunctionByName: " + functionName);
  26.       addr = DebugSymbol.getFunctionByName(moduleName + '!' + name)
  27.       log(" DebugSymbol.getFunctionByName: addr = " + addr);
  28.     } catch (err) {
  29.       log(" DebugSymbol.getFunctionByName: Exception")
  30.     }
  31.   }
  32.   resolvedAddresses[functionName] = addr
  33.   return addr
  34. }

因此,當(dāng)你啟動Word進(jìn)程且進(jìn)程ID為3064時,可以使用以下命令從存儲庫中包含的vbe.js安裝hook。安裝hook之后,你可以打開惡意文檔以觀察其行為

 
 
 
 
  1. > python inject.py -p 3064 vbe.js
  2. resolveName vbe7!rtcShell
  3. Module.findExportByName vbe7 rtcShell
  4. Interceptor.attach: vbe7!rtcShell@0x652a2b76
  5. resolveName vbe7!__vbaStrCat
  6. Module.findExportByName vbe7 __vbaStrCat
  7.  DebugSymbol.loadModule vbe7
  8.  DebugSymbol.load finished
  9.  DebugSymbol.getFunctionByName: vbe7!__vbaStrCat
  10.  DebugSymbol.getFunctionByName: addr = 0x651e53e6
  11. Interceptor.attach: vbe7!__vbaStrCat@0x651e53e6
  12. resolveName vbe7!__vbaStrComp
  13. Module.findExportByName vbe7 __vbaStrComp
  14.  DebugSymbol.getFunctionByName: vbe7!__vbaStrComp
  15.  DebugSymbol.getFunctionByName: addr = 0x651e56a2
  16. Interceptor.attach: vbe7!__vbaStrComp@0x651e56a2
  17. resolveName vbe7!rtcCreateObject
  18. Module.findExportByName vbe7 rtcCreateObject
  19. Interceptor.attach: vbe7!rtcCreateObject@0x653e6e4c
  20. resolveName vbe7!rtcCreateObject2
  21. Module.findExportByName vbe7 rtcCreateObject2
  22. Interceptor.attach: vbe7!rtcCreateObject2@0x653e6ece
  23. resolveName vbe7!CVbeProcs::CallMacro
  24. Module.findExportByName vbe7 CVbeProcs::CallMacro
  25.  DebugSymbol.getFunctionByName: vbe7!CVbeProcs::CallMacro
  26.  DebugSymbol.getFunctionByName: addr = 0x6529019b
  27. Interceptor.attach: vbe7!CVbeProcs::CallMacro@0x6529019b
  28. resolveName oleaut32!DispCallFunc
  29. Module.findExportByName oleaut32 DispCallFunc
  30. Interceptor.attach: oleaut32!DispCallFunc@0x747995b0
  31. [!] Ctrl+D on UNIX, Ctrl+Z on Windows/cmd.exe to detach from instrumented program.

hook監(jiān)控office的宏行為

vbe.js很少有hook來監(jiān)視惡意Office文檔的行為。

__vbaStrCat

vbe7.dll是已找到Visual Basic運行時引擎的DLL,里面有很多有趣的函數(shù)。但是首先,我們想觀察字符串去混淆操作

vbe7!__ vbaStrCat是在Visual Basic中串聯(lián)字符串時調(diào)用的函數(shù)。

.text:651E53E6 ; __stdcall __vbaStrCat(x, x)
.text:651E53E6 ___vbaStrCat@8 proc near ; CODE XREF: _lblEX_ConcatStr↑p
許多基于宏的惡意軟件文檔都使用基于字符串的混淆。通過觀察字符串的動作,你可以觀察最終的去混淆字符串的構(gòu)造。

以下hook代碼將為每個調(diào)用打印出連接的字符串。

 
 
 
 
  1. https://github.com/ohjeongwook/Frida.examples.vbe/blob/master/vbe.js
  2. var loadedModules = {}
  3. var resolvedAddresses = {}
  4. function resolveName(dllName, name) {
  5.   var moduleName = dllName.split('.')[0]
  6.   var functionName = moduleName + "!" + name
  7.   if (functionName in resolvedAddresses) {
  8.     return resolvedAddresses[functionName]
  9.   }
  10.   log("resolveName " + functionName);
  11.   log("Module.findExportByName " + dllName + " " + name);
  12.   var addr = Module.findExportByName(dllName, name)
  13.   if (!addr || addr.isNull()) {
  14.     if (!(dllName in loadedModules)) {
  15.       log(" DebugSymbol.loadModule " + dllName);
  16.       try {
  17.         DebugSymbol.load(dllName)
  18.       } catch (err) {
  19.         return 0;
  20.       }
  21.       log(" DebugSymbol.load finished");
  22.       loadedModules[dllName] = 1
  23.     }
  24.     try {
  25.       log(" DebugSymbol.getFunctionByName: " + functionName);
  26.       addr = DebugSymbol.getFunctionByName(moduleName + '!' + name)
  27.       log(" DebugSymbol.getFunctionByName: addr = " + addr);
  28.     } catch (err) {
  29.       log(" DebugSymbol.getFunctionByName: Exception")
  30.     }
  31.   }
  32.   resolvedAddresses[functionName] = addr
  33.   return addr
  34. }
  35. function loadModuleForAddress(address) {
  36.   var modules = Process.enumerateModules()
  37.   var i

  38. 分享標(biāo)題:使用Frida對Windows平臺的程序進(jìn)行逆向分析
    網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/dhcedjo.html