前幾天公眾號里有位兄弟看了幾篇文章之后,也準備用windbg試試看,結果這一配就花了好幾天,(づ╥﹏╥)づ,我想也有很多躍躍欲試的朋友在配置的時候肯定會遇到這樣和那樣的問題,所以我覺得有必要整理一下,讓大家少走彎路。
現在安裝windbg越來越麻煩,還要安裝Windows 10 SDK,很多人就栽在這里,其實大家可以直接在網上找一鍵打包的windbg 6.0版本即可,才30多M,調生產調本地都很方便,順帶還可以練練SOS命令。
云盤:https://pan.baidu.com/s/1VqXVIGVHxAZVPNds1525Jg 提取碼:mahg
外網:http://www.33lc.com/soft/96743.html
解壓打開會有一個x64和x86文件夾,很顯然,32位的程序用x86下的windbg調試,64位的程序用x64的windbg調試,如下圖:
我比較喜歡用64bit程序,所以這里使用64位的windbg。
符號其實就是pdb文件,我們在debug模式下編譯項目都會看到這個,它的作用會對dll進行打標,這樣在調試時通過pdb就能看到局部變量,全局變量,行號等等其他信息,在FCL類庫中的pdb文件就放在微軟的公有服務器上,SRV*C:\mysymbols*http://msdl.microsoft.com/download/symbols。
很多時候大家都是事后調試,所以需要在生產上抓一個dump文件,為了將dump文件逆向到clr上的運行時狀態,你必須要尋找到當時運行程序clr版本,同時也要找到對應clr版本的sos.dll,他們通常是在一起的,sos 就是 你 和 clr交互的渠道,很多人都卡在尋找正確版本的sos和clr版本上。。。如果不清楚,我可以畫張圖。
有了這個前置基礎,接下來就可以在windows和centos上進行配置實踐了。。。
為了演示,我先上一段簡單的代碼:
static void Main(string[] args)
{
var info = "hello world!";
Console.WriteLine(info);
Console.ReadLine();
}
在netcore中,clr的名字變成了 coreclr.dll,路徑: C:\Program Files\dotnet\shared\Microsoft.NETCore.App.1.3
netcore3.0開始,sos就沒有放在版本號文件下了,詳見 SOS_README.md 內容。
SOS and other diagnostic tools now ship of band and work with any version of the .NET Core runtime.
SOS has moved to the diagnostics repo here: https://github.com/dotnet/diagnostics.git.
Instructions to install SOS: https://github.com/dotnet/diagnostics#installing-sos.
看了上面文檔,大概意思就是說老版本的windbg,需要通過小工具dotnet-sos 自己生成一個sos.dll,那就按照文檔來吧
PS C:\WINDOWS\system32> dotnet tool install -g dotnet-sos
You can invoke the tool using the following command: dotnet-sos
Tool 'dotnet-sos' (version '3.1.122203') was successfully installed.
PS C:\WINDOWS\system32> dotnet-sos install
Installing SOS to C:\Users\hxc\.dotnet\sos from C:\Users\hxc\.dotnet\tools\.store\dotnet-sos\3.1.122203\dotnet-sos\3.1.122203\tools\netcoreapp2.1\any\win-x64
Installing over existing installation...
Creating installation directory...
Copying files...
Execute '.load C:\Users\hxc\.dotnet\sos\sos.dll' to load SOS in your Windows debugger.
Cleaning up...
SOS install succeeded
PS C:\WINDOWS\system32>
仔細看輸出,sos.dll 已經生成好了,接下來在任務管理器中生成一個dump文件,然后使用 .load 命令把 coreclr 和 sos 加載進去即可。
.load C:\Users\hxc\.dotnet\sos\sos.dll
.load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3\coreclr.dll
最后我們抓一下 info 變量在堆上的分布。
0:000> ~0s
ntdll!ZwReadFile+0x14:
00007ff8`3228aa64 c3 ret
0:000> !clrstack -l
OS Thread Id: 0x41d4 (0)
000000246097EA40 00007FFF89C50F97 Error: Fail to initialize CoreCLR 80131022
ConsoleApp5.Program.Main(System.String[])
LOCALS:
0x000000246097EA68 = 0x0000021d8141aba8
0:000> !do 0x0000021d8141aba8
Name: System.String
MethodTable: 00007fff89cd1e18
EEClass: 00007fff89cc2128
Size: 46(0x2e) bytes
File: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3\System.Private.CoreLib.dll
String: hello world!
Fields:
MT Field Offset Type VT Attr Value Name
00007fff89c1b1e8 4000242 8 System.Int32 1 instance 12 _stringLength
00007fff89c18000 4000243 c System.Char 1 instance 68 _firstChar
00007fff89cd1e18 4000244 110 System.String 0 static 0000021d81411360 Empty
好了,windows上的netcore調試就這么簡單,希望這些配置能節省您的時間。
framework程序比netcore配置要方便的多,不需要自己去生成sos了,如下代碼所示:
64位程序加載路徑
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
32位程序加載路徑
.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll
.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
首先要明白,對于linux內核windbg就失效了,那怎么調試呢? 有兩種方式。
這個工具的地方在于,sos和clr都不需要你配置,直接使用它生成dump,然后直接調試,方便至極,下面看看怎么安裝,開兩個terminal,如下代碼:
terminal 1:
[root@10-25-198-96 data]# dotnet build
[root@10-25-198-96 netcoreapp3.1]# dotnet data.dll
hello world
terminal 2:
[root@10-25-198-96 cs2]# ps -ef | grep dotnet
root 31555 31247 0 22:28 pts/0 00:00:00 dotnet cs2.dll
root 32112 31995 0 22:29 pts/2 00:00:00 grep --color=auto dotnet
[root@10-25-198-96 cs2]# dotnet tool install -g dotnet-dump
You can invoke the tool using the following command: dotnet-dump
Tool 'dotnet-dump' (version '3.1.122203') was successfully installed.
[root@10-25-198-96 cs2]# export PATH=$PATH:$HOME/.dotnet/tools
[root@10-25-198-96 cs2]# dotnet-dump collect --process-id 31555
Writing full to /cs2/core_20200508_223204
Complete
可以看到dump文件已經好了 /cs2/core_20200508_223204 ,接下來用 dotnet-dump 對dump文件調試。
[root@10-25-198-96 cs2]# dotnet-dump analyze /cs2/core_20200508_223204
Loading core dump: /cs2/core_20200508_223204 ...
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
> clrstack -l
OS Thread Id: 0x7b43 (0)
Child SP IP Call Site
00007FFDFCABF2D0 00007fb0397af7fd [InlinedCallFrame: 00007ffdfcabf2d0] Interop+Sys.ReadStdin(Byte*, Int32)
00007FFDFCABF2D0 00007fafbebbb4db [InlinedCallFrame: 00007ffdfcabf2d0] Interop+Sys.ReadStdin(Byte*, Int32)
00007FFDFCABF2C0 00007FAFBEBBB4DB ILStubClass.IL_STUB_PInvoke(Byte*, Int32)
00007FFDFCABF9D0 00007FAFBECF844D System.Console.ReadLine()
00007FFDFCABF9E0 00007FAFBEBB037D cs2.Program.Main(System.String[]) [/cs2/Program.cs @ 13]
LOCALS:
0x00007FFDFCABF9F0 = 0x00007faf980081d8
00007FFDFCABFD08 00007fb037fc0f7f [GCFrame: 00007ffdfcabfd08]
00007FFDFCAC01F0 00007fb037fc0f7f [GCFrame: 00007ffdfcac01f0]
> dumpobj 0x00007faf980081d8
Name: System.String
MethodTable: 00007fafbec30f90
EEClass: 00007fafbeb9e1b0
Size: 44(0x2c) bytes
File: /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.3/System.Private.CoreLib.dll
String: hello world
Fields:
MT Field Offset Type VT Attr Value Name
00007fafbec2a0e8 400022a 8 System.Int32 1 instance 11 _stringLength
00007fafbec26f00 400022b c System.Char 1 instance 68 _firstChar
00007fafbec30f90 400022c 108 System.String 0 static 00007faf97fff360 Empty
>
就這么簡單,不過這個工具雖好,但是不能調試非托管堆,而且命令也不是太多,當然夠我們平時用了。
要想實現windbg級別的調試,可以使用lldb調試器,這個非常強大,這里我也來介紹一下吧。
lldb是使用C++寫的,也可以在 https://github.com/dotnet/diagnostics/blob/master/documentation/building/linux-instructions.md 尋找安裝辦法。
sudo yum install centos-release-SCL epel-release
sudo yum install cmake cmake3 gcc gcc-c++ gdb git libicu libunwind make python27 tar wget which zip
cd $HOME
git clone https://github.com/dotnet/diagnostics.git
$HOME/diagnostics/documentation/lldb/centos7/build-install-lldb.sh
一陣抽搐后就安裝好了,從下面可以看到目前版本是3.9.1。
[root@10-25-198-96 cs2]# lldb -v
lldb version 3.9.1 ( revision )
跟windbg一樣,你需要生成一個sos.dll 。。。 同樣也是使用 dotnet-sos 生成。
[root@10-25-198-96 cs2]# dotnet tool install -g dotnet-sos
You can invoke the tool using the following command: dotnet-sos
Tool 'dotnet-sos' (version '3.1.122203') was successfully installed.
[root@10-25-198-96 cs2]# dotnet-sos install
Installing SOS to /root/.dotnet/sos from /root/.dotnet/tools/.store/dotnet-sos/3.1.122203/dotnet-sos/3.1.122203/tools/netcoreapp2.1/any/linux-x64
Installing over existing installation...
Creating installation directory...
Copying files...
Updating existing /root/.lldbinit file - LLDB will load SOS automatically at startup
Cleaning up...
SOS install succeeded
從上面信息看,sos 是安裝在 /root/.dotnet/sos 目錄下,同時也看到在lldb啟動的時候會自動加載sos.dll 。。。
每個dotnet版本下都有一個createdump程序,可以用它生成dump文件,具體配置文檔可以參見:
https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
https://github.com/dotnet/runtime/blob/master/docs/design/coreclr/botr/xplat-minidump-generation.md#configurationpolicy
[root@10-25-198-96 cs2]# ps -ef | grep dotnet
root 31555 31247 0 22:28 pts/0 00:00:00 dotnet cs2.dll
root 32112 31995 0 22:29 pts/2 00:00:00 grep --color=auto dotnet
[root@10-25-198-96 cs2]# find / -name createdump
/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.3/createdump
[root@10-25-198-96 3.1.3]# ./createdump 31555 -f /lldb/test.dump
Writing minidump with heap to file /lldb/test.dump
Written 84692992 bytes (20677 pages) to core file
[root@10-25-198-96 3.1.3]# lldb --core /lldb/test.dump
(lldb) target create --core "/lldb/test.dump"
Core file '/lldb/test.dump' (x86_64) was loaded.
(lldb) clrstack -l
OS Thread Id: 0x7b43 (1)
00007FFDFCABF9E0 00007FAFBEBB037D cs2.Program.Main(System.String[]) [/cs2/Program.cs @ 13]
LOCALS:
0x00007FFDFCABF9F0 = 0x00007faf980081d8
00007FFDFCABFD08 00007fb037fc0f7f [GCFrame: 00007ffdfcabfd08]
00007FFDFCAC01F0 00007fb037fc0f7f [GCFrame: 00007ffdfcac01f0]
(lldb) dumpobj 0x00007faf980081d8
Name: System.String
MethodTable: 00007fafbec30f90
EEClass: 00007fafbeb9e1b0
Size: 44(0x2c) bytes
File: /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.3/System.Private.CoreLib.dll
String: hello world
Fields:
MT Field Offset Type VT Attr Value Name
00007fafbec2a0e8 400022a 8 System.Int32 1 instance 11 _stringLength
00007fafbec26f00 400022b c System.Char 1 instance 68 _firstChar
00007fafbec30f90 400022c 108 System.String 0 static 00007faf97fff360 Empty
(lldb)
可以看到,通過lldb也可以直接打入clr內部啦。。。
我覺得這篇文章肯定能給很多朋友節省不少的時間,想起朱一旦的那句話:有錢人的快樂,就是這么樸實無華且枯燥, 哈哈~
總部位于美國加州舊金山的網絡安全公司Lookout于近日發文稱,該公司旗下安全研究人員發現了一場與敘利亞黑客組織“敘利亞電子軍(Syrian Electronic Army)”存在關聯的網絡監視活動。
文章指出,這場監視活動可能開始于2018年1月,針對的是講阿拉伯語的移動設備用戶,涵蓋敘利亞本國以及周邊地區。在近期的行動中,該組織開始以“新型冠狀病毒”作為誘餌,旨在誘使受害者下載惡意APP。
最新惡意APP偽裝成是一個數字溫度計,只需將手指按在屏幕上顯示的指紋上方,就能測出實時體溫。
圖1.最新惡意APP樣本截圖
事實上,APP包含一種名為“AndoServer”的惡意軟件,通過從C2服務器接收的命令,它能夠執行以下行為:
進一步調查發現,同一C2服務器連接到71個惡意APP,其中有64個包含商業化的間諜軟件SpyNote,其他還有SandroRat、AndoServer和SLRat。
圖2.惡意APP示例
研究人員表示,所有這些APP均未出現在類似Google Play這樣的官方應用商店中,這表明它們可能是通過被黑的網站或第三方應用商店分發的。
研究人員解釋說,并非所有在這場監控活動中使用的惡意APP都被清除了敏感信息。例如,有很大一部分SpyNote樣本都將C2信息、版本號以及其他信息存儲在了“res/values/strings.xml中”。
在這些APP的strings.xml文件中,有22個都引用了“Allosh”,而這個名稱此前就曾被敘利亞電子軍使用過。例如,“c:\users\allosh hacker\documents\visual studio 2012\Projects\allosh\allosh\obj\Debug\Windows.pdb”和“c:\Users\Allosh Hacker\Desktop\Application\obj\Debug\Clean Application.pdb”
圖3.strings.xml文件截圖
據稱,敘利亞電子軍成立于2011年5月,主要任務就是攻擊敘利亞政府的“敵人”。
圖4.百度百科關于“敘利亞電子軍”的介紹
在2013年10月,敘利亞電子軍就曾聲稱黑掉了前任美國總統奧巴馬的個人網站,以及Twitter、Facebook賬號和電子郵箱。
在當時,點擊被黑網站會跳轉到SEA的一個網站,上面寫著“Hacked by SEA”。
圖5.跳轉頁面
而點擊Twitter和Facebook上面發布的幾條鏈接,全都會被重定向到一個顯示敘利亞真實現狀的視頻。
圖6.重定向鏈接
從當時該組織分享的截圖來看,他們還登陸了奧巴馬的Gmail:
圖7.Gmail截圖
在2014年3月,敘利亞電子軍還聲稱入侵了美軍中央指揮部,并公布了包含2萬多文件的軍方在線知識庫(Army Knowledge Online,AKO)服務器的文件目錄。
圖8.文件目錄
在同年的感恩節當天,敘利亞電子軍更是入侵了美國各大熱門媒體網站,并在網站的頁面上掛出一個窗口,上面寫著“你已經被SEA黑了”。
圖9.感恩節“特制”窗口
敘利亞電子軍最近也一直非常活躍,他們的一個Twitter帳戶分別于本月2日和7日聲稱對比利時媒體DDoS攻擊事件以及PayPal和eBay網站入侵事件負責。
圖10.@Official_SEA7最近發布的兩項聲明