您现在的位置是:首页 >其他 >.NET程序集批量分析与静态逆向分析网站首页其他
.NET程序集批量分析与静态逆向分析
背景
某老系统(下文简称X系统)采用.net 编写,没有文档没有代码。但运行中偶有发生问题。为进行问题分析,需逆向并静态分析源代码。记录下此过程。
分析思路
此系统有以下特点:
- 同时运行多个exe程序。
- exe程序虽然文件名不同,但部分exe的文件内容相同。存在重复文件。
- 每个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 .
esult.csv -NoTypeInformation -Encoding UTF8
注意:
1,上步抓取了版本、版权、商标等信息。如果发现有不属于x-system的程序集,则还应该要用这些信息进行进一步过滤。目的是识别出需要做逆向工程的目标程序集(仅x-system自己的dll/exe)。此例中未做过滤。
2,同时可查看到第三方的dll的MD5哈希值。识别出x-system中多处引用的第三方程序集是否一致。
3,这里有个逻辑:如果文件的MD5哈希值相同,则认为是同一个文件。
4,结果信息保存到result.csv(可自行定义)
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 FilesGitusrincat.exe" process_extracted.txt result_extracted.txt result_extracted.txt | "C:Program FilesGitusrinsort.exe" | "C:Program FilesGitusrinuniq.exe" -u
注:
1,以上需要提前安装ripgrep和git。
2,如果有遗漏,则需要从服务器上再复制。
3,由于存放路径不同,为了便于比较,将路径做了提取。但由于不同目录可能存在同名文件,所以提取了exe文件的上一级目录和exe文件全名。若确定没有重名,则直接提取exe文件全名便可。
也可以执行以下命令,看看有没有多拷贝(即:进程中没有,但拷贝的文件夹有):
"C:Program FilesGitusrincat.exe" process_extracted.txt result_extracted.txt process_extracted.txt | "C:Program FilesGitusrinsort.exe" | "C:Program FilesGitusrinuniq.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下。
到此处全部完成。