.NET程序集批量分析与静态逆向分析

背景

某老系统(下文简称X系统)采用.net 编写,没有文档没有代码。但运行中偶有发生问题。为进行问题分析,需逆向并静态分析源代码。记录下此过程。

分析思路

此系统有以下特点:

  1. 同时运行多个exe程序。
  2. exe程序虽然文件名不同,但部分exe的文件内容相同。存在重复文件。
  3. 每个exe程序目录下,都会独立引用第三方组件。

需要回答的问题:

1,进程分析。当前进程中哪些进程可能与此系统相关?

2,基于上步的进程分析,初步找到exe程序所在的文件夹。注意,可能会找出多个文件夹。则:这些文件夹下的exe或者dll,是否重复?版本如何?另外,还需要做关联分析,即:X系统有关的(需要做静态逆向)的组件有哪些。

3,除了进程分析,还要分析服务、任务计划等。这些地方有无与X系统相关的服务或者计划任务?(本文略过此点)

分析步骤

1,静态分析x-system 相关的exe/dll。

查看文件夹下所有exe/dll的信息。假设已将所有exe/dll的目录,全部集中放置到 d:\x-system下。

打开powershell,切换当前目录。

cd d:\x-system

然后执行以下命令,查看每个exe/dll的相关信息。

(Get-ChildItem -Recurse -Include *.exe,*.dll)|Select-Object FullName,@{Name="MD5_Hash";expression= {Get-FileHash $_ -Algorithm MD5 | Select-Object Hash}}, CreationTime,LastWriteTime,LastAccessTime,{$_.VersionInfo.OriginalFilename},{$_.VersionInfo.CompanyName},{$_.VersionInfo.FileVersion},{$_.VersionInfo.ProductVersion},{$_.VersionInfo.LegacyCopyRight},{$_.VersionInfo.LegalTrademarks} | Sort-Object -Property @{Expression="MD5_HASH"},@{Expression="FullName"} | Export-Csv -Path .\result.csv -NoTypeInformation -Encoding UTF8

注意:

1,上步抓取了版本、版权、商标等信息。如果发现有不属于x-system的程序集,则还应该要用这些信息进行进一步过滤。目的是识别出需要做逆向工程的目标程序集(仅x-system自己的dll/exe)。此例中未做过滤。

2,同时可查看到第三方的dll的MD5哈希值。识别出x-system中多处引用的第三方程序集是否一致。

3,这里有个逻辑:如果文件的MD5哈希值相同,则认为是同一个文件。

4,结果信息保存到result.csv(可自行定义)

如果要加过滤条件,例如,过滤掉 CompanyName 为 kw1或者kw2,以及过滤掉 LegalTrademarks为 kw3 或kw4,则可以在Select之前加上过滤条件:

(Get-ChildItem -Recurse -Include *.exe,*.dll)|Where-Object -FilterScript {$_.VersionInfo.CompanyName -CNotMatch "(kw1|kw2)"} |Where-Object -FilterScript {$_.VersionInfo.LegalTrademarks -CNotMatch "(kw3|kw4)"} | Select-Object FullName,@{Name="MD5_Hash";expression= {Get-FileHash $_ -Algorithm MD5 | Select-Object Hash}}, CreationTime,LastWriteTime,LastAccessTime,{$_.VersionInfo.OriginalFilename},{$_.VersionInfo.CompanyName},{$_.VersionInfo.FileVersion},{$_.VersionInfo.ProductVersion},{$_.VersionInfo.LegacyCopyRight},{$_.VersionInfo.LegalTrademarks} | Sort-Object -Property @{Expression="MD5_HASH"},@{Expression="FullName"} | Export-Csv -Path .\result.csv -NoTypeInformation -Encoding UTF8

2,在服务器上抓取任务进程清单,保存到文件。

wmic process get executablepath,name,processid | findstr /v /i "system32 microsoft syswow64" > process.txt

注:

1,服务器上抓取进程清单时,由于不确定哪些与X系统有关,所以采用 findstr /v,将确定与X系统无关的进程排除后,保存到文件(假设名为process.txt) 

2,排除词可以依据实际情况进行调整。

3,将静态分析的exe,和服务器的进程清单做比较。分析是否有遗漏。

将服务器上抓取出来的 process.txt 文件,拷贝到分析机器上。和第一步的result.csv放在同级目录下。

提取result.csv中的路径。在wt或者cmd中执行:

rg -e "(.*?)\\([^\\]+)\\([^\\]+?\.exe).*" result.csv --no-line-number -r $2\$3 > result_extracted.txt

 将提取的结果保存到文件(result_extracted.txt)

然后提取进程文件(process.txt )中的路径。在wt或者cmd中执行:

rg -e "(.*?)\\([^\\]+)\\([^\\]+?\.exe)\s+(.*)" process.txt --no-line-number -r $2\$3 > process_extracted.txt

执行以下命令,查看是否有遗漏(即:进程中有,但是所拷贝出来的文件夹没有)。

"C:\Program Files\Git\usr\bin\cat.exe" process_extracted.txt result_extracted.txt result_extracted.txt | "C:\Program Files\Git\usr\bin\sort.exe" | "C:\Program Files\Git\usr\bin\uniq.exe" -u

注:

1,以上需要提前安装ripgrep和git。 

2,如果有遗漏,则需要从服务器上再复制。

3,由于存放路径不同,为了便于比较,将路径做了提取。但由于不同目录可能存在同名文件,所以提取了exe文件的上一级目录和exe文件全名。若确定没有重名,则直接提取exe文件全名便可。

也可以执行以下命令,看看有没有多拷贝(即:进程中没有,但拷贝的文件夹有): 

"C:\Program Files\Git\usr\bin\cat.exe" process_extracted.txt result_extracted.txt process_extracted.txt | "C:\Program Files\Git\usr\bin\sort.exe" | "C:\Program Files\Git\usr\bin\uniq.exe" -u 

 注:

有多拷贝的exe本文并没有剔除。如果要剔除,则需要回到第一步,再做过滤。

4,对于重复的exe/dll,选择要逆向哪一个。

首先查看重复的情况。结果显示中,Count表示有重复项的数量。

(Get-ChildItem -Recurse -Include *.exe,*.dll)|Select-Object FullName,@{Name="MD5_Hash";expression= {Get-FileHash $_ -Algorithm MD5 | Select-Object Hash}} | Sort-Object -Property @{Expression="$_.MD5_HASH.Hash"},@{Expression="FullName"} | Group-Object -Property {$_.MD5_Hash.Hash} 

如果想查看重复的具体文件名,则可以:

(Get-ChildItem -Recurse -Include *.exe,*.dll)|Select-Object FullName,@{Name="MD5_Hash";expression= {Get-FileHash $_ -Algorithm MD5 | Select-Object Hash}} | Sort-Object -Property @{Expression="$_.MD5_HASH.Hash"},@{Expression="FullName"} | Group-Object -Property {$_.MD5_Hash.Hash} -AsHashTable -AsString  

从重复者中选择一个来作为逆向工程的目标:

(Get-ChildItem -Recurse -Include *.exe,*.dll)|Select-Object FullName,@{Name="MD5_Hash";expression= {Get-FileHash $_ -Algorithm MD5 | Select-Object Hash}} | Sort-Object -Property @{Expression="$_.MD5_HASH.Hash"},@{Expression="FullName"} | Group-Object -Property {$_.MD5_Hash.Hash} | Select-Object {$_.Values[0]},{$_.Group[0].FullName}

把上一步的命令执行结果保存到文件。

(Get-ChildItem -Recurse -Include *.exe,*.dll)|Select-Object FullName,@{Name="MD5_Hash";expression= {Get-FileHash $_ -Algorithm MD5 | Select-Object Hash}} | Sort-Object -Property @{Expression="$_.MD5_HASH.Hash"},@{Expression="FullName"} | Group-Object -Property {$_.MD5_Hash.Hash} | Select-Object {$_.Values[0]},{$_.Group[0].FullName} | Format-Table -HideTableHeaders > to_be_decompiled_temp.txt

然后对文件做一点处理,准备进行反编译。 

rg -e "(\w+)\s(D:\\.*\\([^\\]+?)\.exe)" to_be_decompiled_temp.txt --no-line-number -r $1,$2,$3 > to_be_decompiled.txt

注:
提取出文件名,用于建立存放源代码的子目录。

5,进行批量反编译。

for /f "tokens=1,2,3 delims=," %i in ('type to_be_decompiled.txt') do (ilspycmd -o .\output_src\%k -p %j)

注:

1,需要提前安装ilspycmd

2,反编译后的源代码将保存在 output_src下。

到此处全部完成。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值