簡(jiǎn)析AutoIt程序脫殼后的自校驗(yàn)處理
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
軟件大?。?1739 KB
軟件語(yǔ)言: 英文 軟件類別: 國(guó)外軟件 / 免費(fèi)版 / 系統(tǒng)增強(qiáng) 應(yīng)用平臺(tái): Win9x/NT/2000/XP 加入時(shí)間: 2005-02-13 15:41:45 下載次數(shù): 5596 開(kāi) 發(fā) 商: http://www.hiddensoft.com/AutoIt/index.html 軟件介紹: 允許您使用宏來(lái)自動(dòng)執(zhí)行一些操作,可以將宏編譯成 EXE 來(lái)運(yùn)行。 【作者聲明】:只是感興趣,沒(méi)有其他目的。失誤之處敬請(qǐng)諸位大俠賜教 【調(diào)試環(huán)境】:WinXP、OllyDBD、PEiD、LordPE、WinHex ————————————————————————————————— 【調(diào)試過(guò)程】: AutoIt是一款功能強(qiáng)大的程序。下面來(lái)簡(jiǎn)單分析一下AutoIt程序脫殼后的自校驗(yàn)處理。 ————————————————————————————————— 一、如何確定是AutoIt編譯的文件 先下載AutoIt主程序,用其自帶的Examples文件編譯一個(gè)例子。 復(fù)制內(nèi)容到剪貼板 代碼: ;Test AutoIt CRC ; AutoIt Version: 3.10 ; Language: English ; Platform: WinALL ; Author: fly ; Use the @CRLF macro to do a newline in a MsgBox - it is similar to the \n in v2.64 MsgBox(0, "Test AutoIt CRC", " fly" & @CRLF & "http://www.unpack.cn" & @CRLF & " 2006.02.25")使用Aut2Exe.exe編譯Test.AutoIt.CRC.au3腳本,得到Test.AutoIt.CRC.exe 1、AutoIt 目前使用UPX V1.25壓縮,腳本數(shù)據(jù)以O(shè)verlay保存 PEiD V0.94顯示如下: 用WinHex打開(kāi)Test.AutoIt.CRC.exe,可以看到UPX版本: 2、在WinHex里面搜索ASCII文本字符串:AutoIt 找到“<description>AutoIt 3</description>”字樣 基本可以確定是AutoIt編譯的文件了 ————————————————————————————————— 二、脫殼 UPX用UPX相應(yīng)版本自脫是最完美的 使用UPX V1.25 -d對(duì)Test.AutoIt.CRC.exe脫殼,附加數(shù)據(jù)自動(dòng)保留下來(lái) 也可以用UPX-Ripper脫殼 如果手動(dòng)脫殼的話,則需要手工處理Overlay 脫殼文件重命名為:UnPacKed.exe ————————————————————————————————— 三、附加數(shù)據(jù) 由于腳本數(shù)據(jù)以O(shè)verlay保存在程序中,所以先說(shuō)一下如何簡(jiǎn)單識(shí)別附加數(shù)據(jù)吧。 1、看上面的圖片,PEiD偵殼時(shí)已經(jīng)顯示“[Overlay]”字樣 2、用LordPE打開(kāi)Test.AutoIt.CRC.exe的區(qū)段,可以看到最后一個(gè)區(qū)段的信息: 復(fù)制內(nèi)容到剪貼板 代碼: RawOffset=0001B800 RawSize=00007200 0001B800+00007200=22A00最后一個(gè)區(qū)段數(shù)據(jù)至0X229FF處為止。 如果偏移0X22A00處及其后還有數(shù)據(jù),就是Overlay了 3、可以用LordPE來(lái)快速確定Overlay 在最后區(qū)段上點(diǎn)右鍵->Hex Edit Secton,向下拉動(dòng)滾動(dòng)條察看 一直拉到“黑白”交界處,0X22A00下面就是附加數(shù)據(jù)了。 ————————————————————————————————— 四、分析校驗(yàn) 如果現(xiàn)在運(yùn)行脫殼文件,會(huì)提示錯(cuò)誤的 那么開(kāi)始調(diào)試吧。用OllyDbg載入Test.AutoIt.CRC.exe原版 復(fù)制內(nèi)容到剪貼板 代碼: 00459160 60 pushad //暫停在UPX外殼入口 00459161 BE 00E04300 mov esi,43E000 00459166 8DBE 0030FCFF lea edi,dword ptr ds:[esi+FFFC3000] 0045916C 57 push edi 0045916D 83CD FF or ebp,FFFFFFFF 00459170 EB 10 jmp short 00459182不必管UPX BP SetFilePointer F9運(yùn)行,中斷后取消斷點(diǎn) 復(fù)制內(nèi)容到剪貼板 代碼: 0011EB10 0042C552 /CALL 到 SetFilePointer 來(lái)自 Test_Aut.0042C54C 0011EB14 000000D8 |hFile = 000000D8 (window) 0011EB18 FFFFFFF4 |OffsetLo = FFFFFFF4 (-12.) 0011EB1C 00000000 |pOffsetHi = NULL 0011EB20 00000002 \Origin = FILE_END文件指針移動(dòng)至文件末尾,從末尾再向上移動(dòng)12字節(jié) 再BP ReadFile,中斷后取消斷點(diǎn) 復(fù)制內(nèi)容到剪貼板 代碼: 0011EACC 0042C98E /CALL 到 ReadFile 來(lái)自 Test_Aut.0042C988 0011EAD0 000000D8 |hFile = 000000D8 (window) 0011EAD4 003F9D28 |Buffer = 003F9D28 0011EAD8 00001000 |BytesToRead = 1000 (4096.) 0011EADC 0011EAF0 |pBytesRead = 0011EAF0 0011EAE0 00000000 \pOverlapped = NULL數(shù)據(jù)窗口中定位到003F9D28處,Ctrl+F9執(zhí)行完ReadFile 復(fù)制內(nèi)容到剪貼板 代碼: 003F9D28 22 87 A8 AA AA 80 A8 AA 3C FC 95 58可以看到003F9D28處是讀取的12個(gè)字節(jié)數(shù)據(jù) 用WinHex打開(kāi)Test.AutoIt.CRC.exe,到末尾看看 復(fù)制內(nèi)容到剪貼板 代碼: Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00022D80 22 87 A8 AA AA 80 A8 AA 00022D90 3C FC 95 58正是這些數(shù)據(jù)。 這些數(shù)據(jù)有何用處?呵呵,3個(gè)Dword數(shù)據(jù)就是AutoIt需要校驗(yàn)的三個(gè)值了 抓住這個(gè)線索吧 數(shù)據(jù)窗口003F9D28處選擇這12個(gè)字節(jié),點(diǎn)擊右鍵->斷點(diǎn)->內(nèi)存訪問(wèn) F9運(yùn)行,中斷在0042C88F 復(fù)制內(nèi)容到剪貼板 代碼: 0042C88B 0FB601 movzx eax,byte ptr ds:[ecx] 0042C88E 41 inc ecx 0042C88F 890E mov dword ptr ds:[esi],ecx 0042C891 5E pop esi 0042C892 C3 retn //返回00429747 00429742 E8 86300000 call 0042C7CD 00429747 83F8 FF cmp eax,-1 0042974A 59 pop ecx 0042974B 74 28 je short 00429775 0042974D 8803 mov byte ptr ds:[ebx],al //EBX=0012ECAD 每個(gè)處理取4個(gè)字節(jié)至[EBX] 0042974F 8B46 18 mov eax,dword ptr ds:[esi+18] 00429752 43 inc ebx 00429753 FF4D 08 dec dword ptr ss:[ebp+8] 00429756 8945 14 mov dword ptr ss:[ebp+14],eax 00429759 837D 08 00 cmp dword ptr ss:[ebp+8],0 0042975D 0F85 76FFFFFF jnz 004296D9 00429763 8B45 10 mov eax,dword ptr ss:[ebp+10] 00429766 5F pop edi 00429767 5E pop esi 00429768 5B pop ebx 00429769 C9 leave 0042976A C3 retn取消內(nèi)存斷點(diǎn),在數(shù)據(jù)窗口定位至0012ECAD處,選擇那4個(gè)字節(jié),右鍵->斷點(diǎn)->內(nèi)存寫入 F9運(yùn)行,中斷在00427F07處 復(fù)制內(nèi)容到剪貼板 代碼: 00427EFD FF36 push dword ptr ds:[esi] 00427EFF 8D5E 04 lea ebx,dword ptr ds:[esi+4] 00427F02 BF AAAAAAAA mov edi,AAAAAAAA 00427F07 317D F8 xor dword ptr ss:[ebp-8],edi //[ebp-8]=AAA88722 XOR AAAAAAAA=00022D88 //第一個(gè)校驗(yàn)值 //這個(gè)是計(jì)算CRC的代碼長(zhǎng)度 //可以記住0X00022D88處數(shù)據(jù),然后在脫殼文件中搜索,就可以得到新的長(zhǎng)度=00043B88取消內(nèi)存斷點(diǎn),下面就是其他2組校驗(yàn)值的處理了 復(fù)制內(nèi)容到剪貼板 代碼: 00427F0A 6A 01 push 1 00427F0C 6A 04 push 4 00427F0E 53 push ebx 00427F0F E8 56170000 call 0042966A 00427F14 FF36 push dword ptr ds:[esi] 00427F16 313B xor dword ptr ds:[ebx],edi //[ebx]=[0012FCD0]=AAA880AA XOR AAAAAAAA=00022A00 //第二個(gè)校驗(yàn)值 //WinHex中去偏移00022A00處看看,發(fā)現(xiàn)是附加數(shù)據(jù)開(kāi)始的地址復(fù)制內(nèi)容到剪貼板 代碼: 00427F18 8D45 F0 lea eax,dword ptr ss:[ebp-10] 00427F1B 6A 01 push 1 00427F1D 6A 04 push 4 00427F1F 50 push eax 00427F20 E8 45170000 call 0042966A 00427F25 317D F0 xor dword ptr ss:[ebp-10],edi //[ebp-10]=[0012ECA4]=5895FC3C XOR AAAAAAAA=F23F5696 //第三個(gè)校驗(yàn)值 //這個(gè)運(yùn)算后的值是文件校驗(yàn)值復(fù)制內(nèi)容到剪貼板 代碼: 00427F28 33FF xor edi,edi 00427F2A 57 push edi 00427F2B 57 push edi 00427F2C FF36 push dword ptr ds:[esi] 00427F2E E8 3A160000 call 0042956D 00427F33 8B45 F8 mov eax,dword ptr ss:[ebp-8] 00427F36 83C4 48 add esp,48 00427F39 85C0 test eax,eax 00427F3B 7E 4A jle short 00427F87 00427F3D 8D8F 00000100 lea ecx,dword ptr ds:[edi+10000] 00427F43 3BC8 cmp ecx,eax 00427F45 7E 07 jle short 00427F4E 00427F47 2BC7 sub eax,edi 00427F49 8945 0C mov dword ptr ss:[ebp+C],eax 00427F4C EB 07 jmp short 00427F55 00427F4E C745 0C 00000100 mov dword ptr ss:[ebp+C],10000 00427F55 FF36 push dword ptr ds:[esi] 00427F57 037D 0C add edi,dword ptr ss:[ebp+C] 00427F5A 8D85 E4FEFEFF lea eax,dword ptr ss:[ebp+FFFEFEE4] 00427F60 FF75 0C push dword ptr ss:[ebp+C] 00427F63 6A 01 push 1 00427F65 50 push eax 00427F66 E8 FF160000 call 0042966A 00427F6B 83C4 10 add esp,10 00427F6E 8D85 E4FEFEFF lea eax,dword ptr ss:[ebp+FFFEFEE4] 00427F74 8D4D EC lea ecx,dword ptr ss:[ebp-14] 00427F77 FF75 0C push dword ptr ss:[ebp+C] 00427F7A 50 push eax 00427F7B E8 25060000 call 004285A5 //計(jì)算校驗(yàn)值 00427F80 8B45 F8 mov eax,dword ptr ss:[ebp-8] 00427F83 3BF8 cmp edi,eax //EAX=計(jì)算CRC的代碼長(zhǎng)度 00427F85 7C B6 jl short 00427F3D 00427F87 8B45 F0 mov eax,dword ptr ss:[ebp-10] 00427F8A 3B45 EC cmp eax,dword ptr ss:[ebp-14] //[ebp-14]中是計(jì)算出的校驗(yàn)值 比較校驗(yàn)值 00427F8D 74 05 je short 00427F94 //不跳就掛了 00427F8F 6A 03 push 3 00427F91 5F pop edi 00427F92 EB 45 jmp short 00427FD9————————————————————————————————— 五、修復(fù)校驗(yàn) 分析清楚了 AutoIt取Overlay的最后12個(gè)字節(jié)異或AAAAAAAA得到校驗(yàn)值或者數(shù)據(jù)地址 復(fù)制內(nèi)容到剪貼板 代碼: 1、第一個(gè)校驗(yàn)數(shù)據(jù) XOR AAAAAAAA=計(jì)算CRC的代碼長(zhǎng)度 2、第二個(gè)校驗(yàn)數(shù)據(jù) XOR AAAAAAAA=附加數(shù)據(jù)開(kāi)始的地址 3、第三個(gè)校驗(yàn)數(shù)據(jù) XOR AAAAAAAA=文件校驗(yàn)值看看我們用UPX對(duì)Test.AutoIt.CRC.exe脫殼得到的UnPacKed.exe文件信息: 復(fù)制內(nèi)容到剪貼板 代碼: 1、計(jì)算CRC的代碼長(zhǎng)度=00043B88 2、附加數(shù)據(jù)開(kāi)始的地址=00043800 3、文件校驗(yàn)值=需要跟蹤->F928C0C3修復(fù)校驗(yàn): 復(fù)制內(nèi)容到剪貼板 代碼: 1、第一個(gè)校驗(yàn)數(shù)據(jù)=00043B88 XOR AAAAAAAA=AAAE9122 2、第二個(gè)校驗(yàn)數(shù)據(jù)=00043800 XOR AAAAAAAA=AAAE92AA在UnPacKed.exe的校驗(yàn)數(shù)據(jù)開(kāi)始的地址處修正這2個(gè)值,再看文件校驗(yàn) 載入U(xiǎn)nPacKed.exe調(diào)試,BP 00427F8A,運(yùn)行、中斷,[ebp-14]=[0012ECA0]=F928C0C3 復(fù)制內(nèi)容到剪貼板 代碼: 3、第三個(gè)校驗(yàn)數(shù)據(jù)=F928C0C3 XOR AAAAAAAA=53826A69當(dāng)然,第三個(gè)校驗(yàn)可以修改00427F8D jmp 00427F94直接去除,但是不推薦這樣做 復(fù)制內(nèi)容到剪貼板 代碼: Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00043B80 22 91 AE AA AA 92 AE AA 00043B90 69 6A 82 53 修正這12個(gè)字節(jié)后,脫殼文件就可以正常運(yùn)行了。 ————————————————————————————————— 六、例子演示 論壇有個(gè)SW.exe也是AutoIt編譯的文件 用UPX-Ripper脫殼得到SW.UnPacKed.exe 載入SW.exe原版調(diào)試 復(fù)制內(nèi)容到剪貼板 代碼: [/code] 00476760 60 pushad //暫停在UPX外殼入口 00476761 BE 00E04400 mov esi,44E000 00476766 8DBE 0030FBFF lea edi,dword ptr ds:[esi+FFFB3000] 0047676C 57 push edi 0047676D 83CD FF or ebp,FFFFFFFF 00476770 EB 10 jmp short 00476782 004768CB 61 popad 004768CC E9 17A9FCFF jmp 004411E8 //F4 到這里復(fù)制內(nèi)容到剪貼板 代碼: 004411E8 55 push ebp //OEP 004411E9 8BEC mov ebp,esp 004411EB 6A FF push -1 004411ED 68 28E44400 push 44E428 004411F2 68 50254400 push 442550 004411F7 64:A1 00000000 mov eax,dword ptr fs:[0] 004411FD 50 push eax 004411FE 64:8925 00000000 mov dword ptr fs:[0],esp 00441205 83EC 58 sub esp,58 00441208 53 push ebx 00441209 56 push esi 0044120A 57 push edi 0044120B 8965 E8 mov dword ptr ss:[ebp-18],esp 0044120E FF15 A4D94600 call dword ptr ds:[46D9A4] ; kernel32.GetVersion正常的分析途徑如上面所操作的。不過(guò)這里用個(gè)簡(jiǎn)便的方法來(lái)到檢驗(yàn)值處理的地方 Ctrl+F 在整個(gè)段塊搜索命令:mov edi,0AAAAAAAA 找到0043D50A處,下斷,F(xiàn)9運(yùn)行后中斷 復(fù)制內(nèi)容到剪貼板 代碼: 0043D50A BF AAAAAAAA mov edi,AAAAAAAA 0043D50F 317D FC xor dword ptr ss:[ebp-4],edi //[ebp-4]=[0012E844]=AAA81120 XOR AAAAAAAA=0002BB8A //第一個(gè)校驗(yàn)值 //計(jì)算CRC的代碼長(zhǎng)度 //看看0X0002BB8A處數(shù)據(jù),然后去SW.UnPacKed.exe里搜索,得到新的長(zhǎng)度=0005F58A 0043D512 6A 01 push 1 0043D514 6A 04 push 4 0043D516 53 push ebx 0043D517 E8 55230000 call 0043F871 0043D51C FF36 push dword ptr ds:[esi] 0043D51E 313B xor dword ptr ds:[ebx],edi //[ebx]=[0012F864]=AAA80CAA XOR AAAAAAAA=0002A600 //第二個(gè)校驗(yàn)值 //附加數(shù)據(jù)開(kāi)始的地址,UnPacKed.exe里的附加數(shù)據(jù)開(kāi)始地址=0005E000 0043D520 8D45 F4 lea eax,dword ptr ss:[ebp-C] 0043D523 6A 01 push 1 0043D525 6A 04 push 4 0043D527 50 push eax 0043D528 E8 44230000 call 0043F871 0043D52D 317D F4 xor dword ptr ss:[ebp-C],edi //[ebp-C]=[0012E83C]=5BC7EF2F XOR AAAAAAAA=F16D4585 //第三個(gè)校驗(yàn)值 //這個(gè)運(yùn)算后的值是文件校驗(yàn)值 0043D530 33FF xor edi,edi 0043D532 57 push edi 0043D533 57 push edi 0043D534 FF36 push dword ptr ds:[esi] 0043D536 E8 39220000 call 0043F774 0043D53B 8B45 FC mov eax,dword ptr ss:[ebp-4] 0043D53E 83C4 48 add esp,48 0043D541 85C0 test eax,eax 0043D543 7E 4A jle short 0043D58F 0043D545 8D8F 00000100 lea ecx,dword ptr ds:[edi+10000] 0043D54B 3BC8 cmp ecx,eax 0043D54D 7E 07 jle short 0043D556 0043D54F 2BC7 sub eax,edi 0043D551 8945 0C mov dword ptr ss:[ebp+C],eax 0043D554 EB 07 jmp short 0043D55D 0043D556 C745 0C 00000100 mov dword ptr ss:[ebp+C],10000 0043D55D FF36 push dword ptr ds:[esi] 0043D55F 037D 0C add edi,dword ptr ss:[ebp+C] 0043D562 8D85 E8FEFEFF lea eax,dword ptr ss:[ebp+FFFEFEE8] 0043D568 FF75 0C push dword ptr ss:[ebp+C] 0043D56B 6A 01 push 1 0043D56D 50 push eax 0043D56E E8 FE220000 call 0043F871 0043D573 83C4 10 add esp,10 0043D576 8D85 E8FEFEFF lea eax,dword ptr ss:[ebp+FFFEFEE8] 0043D57C 8D4D F0 lea ecx,dword ptr ss:[ebp-10] 0043D57F FF75 0C push dword ptr ss:[ebp+C] 0043D582 50 push eax 0043D583 E8 25060000 call 0043DBAD 0043D588 8B45 FC mov eax,dword ptr ss:[ebp-4] 0043D58B 3BF8 cmp edi,eax 0043D58D 7C B6 jl short 0043D545 0043D58F 8B45 F4 mov eax,dword ptr ss:[ebp-C] 0043D592 3B45 F0 cmp eax,dword ptr ss:[ebp-10] //比較校驗(yàn)值 0043D595 74 05 je short 0043D59C 0043D597 6A 03 push 3 0043D599 5F pop edi 0043D59A EB 45 jmp short 0043D5E1修復(fù)SW.UnPacKed.exe的校驗(yàn): 復(fù)制內(nèi)容到剪貼板 代碼: 1、第一個(gè)校驗(yàn)數(shù)據(jù)=0005F58A XOR AAAAAAAA=AAAF5F20 2、第二個(gè)校驗(yàn)數(shù)據(jù)=0005E000 XOR AAAAAAAA=AAAF4AAA在SW.UnPacKed.exe的校驗(yàn)數(shù)據(jù)開(kāi)始的地址處修正這2個(gè)值,再看文件校驗(yàn) 載入SW.UnPacKed.exe調(diào)試,BP 0043D592,運(yùn)行、中斷,[ebp-10]=[0012E838]=6C93F7B3 復(fù)制內(nèi)容到剪貼板 代碼: 3、第三個(gè)校驗(yàn)數(shù)據(jù)=6C93F7B3 XOR AAAAAAAA=C6395D19再修正最后一個(gè)校驗(yàn)值,可以運(yùn)行了。 Game Over 該文章在 2014/4/10 11:45:04 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |