欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

簡析AutoIt程序脫殼后的自校驗處理

admin
2014年4月10日 11:45 本文熱度 6750
軟件大小: 1739 KB
軟件語言: 英文
軟件類別: 國外軟件 / 免費版 / 系統增強
應用平臺: Win9x/NT/2000/XP
加入時間: 2005-02-13 15:41:45
下載次數: 5596
開 發 商: http://www.hiddensoft.com/AutoIt/index.html
軟件介紹: 允許您使用宏來自動執行一些操作,可以將宏編譯成 EXE 來運行。

【作者聲明】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教

【調試環境】:WinXP、OllyDBD、PEiD、LordPE、WinHex

—————————————————————————————————
【調試過程】:




AutoIt是一款功能強大的程序。下面來簡單分析一下AutoIt程序脫殼后的自校驗處理。
—————————————————————————————————
一、如何確定是AutoIt編譯的文件


先下載AutoIt主程序,用其自帶的Examples文件編譯一個例子。 復制內容到剪貼板 代碼:
;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壓縮,腳本數據以Overlay保存
PEiD V0.94顯示如下:


用WinHex打開Test.AutoIt.CRC.exe,可以看到UPX版本:



2、在WinHex里面搜索ASCII文本字符串:AutoIt


找到“<description>AutoIt 3</description>”字樣



基本可以確定是AutoIt編譯的文件了


—————————————————————————————————
二、脫殼


UPX用UPX相應版本自脫是最完美的
使用UPX V1.25 -d對Test.AutoIt.CRC.exe脫殼,附加數據自動保留下來
也可以用UPX-Ripper脫殼
如果手動脫殼的話,則需要手工處理Overlay
脫殼文件重命名為:UnPacKed.exe


—————————————————————————————————
三、附加數據


由于腳本數據以Overlay保存在程序中,所以先說一下如何簡單識別附加數據吧。
1、看上面的圖片,PEiD偵殼時已經顯示“[Overlay]”字樣
2、用LordPE打開Test.AutoIt.CRC.exe的區段,可以看到最后一個區段的信息:

復制內容到剪貼板 代碼:
RawOffset=0001B800
RawSize=00007200
0001B800+00007200=22A00
最后一個區段數據至0X229FF處為止。
如果偏移0X22A00處及其后還有數據,就是Overlay了
3、可以用LordPE來快速確定Overlay
在最后區段上點右鍵->Hex Edit Secton,向下拉動滾動條察看


一直拉到“黑白”交界處,0X22A00下面就是附加數據了。


—————————————————————————————————
四、分析校驗


如果現在運行脫殼文件,會提示錯誤的


那么開始調試吧。用OllyDbg載入Test.AutoIt.CRC.exe原版 復制內容到剪貼板 代碼:
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運行,中斷后取消斷點 復制內容到剪貼板 代碼:
0011EB10 0042C552 /CALL 到 SetFilePointer 來自 Test_Aut.0042C54C
0011EB14 000000D8 |hFile = 000000D8 (window)
0011EB18 FFFFFFF4 |OffsetLo = FFFFFFF4 (-12.)
0011EB1C 00000000 |pOffsetHi = NULL
0011EB20 00000002 \Origin = FILE_END
文件指針移動至文件末尾,從末尾再向上移動12字節

再BP ReadFile,中斷后取消斷點 復制內容到剪貼板 代碼:
0011EACC 0042C98E /CALL 到 ReadFile 來自 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
數據窗口中定位到003F9D28處,Ctrl+F9執行完ReadFile 復制內容到剪貼板 代碼:
003F9D28 22 87 A8 AA AA 80 A8 AA 3C FC 95 58可以看到003F9D28處是讀取的12個字節數據

用WinHex打開Test.AutoIt.CRC.exe,到末尾看看 復制內容到剪貼板 代碼:
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
正是這些數據。

這些數據有何用處?呵呵,3個Dword數據就是AutoIt需要校驗的三個值了

抓住這個線索吧
數據窗口003F9D28處選擇這12個字節,點擊右鍵->斷點->內存訪問
F9運行,中斷在0042C88F 復制內容到剪貼板 代碼:
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 每個處理取4個字節至[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
取消內存斷點,在數據窗口定位至0012ECAD處,選擇那4個字節,右鍵->斷點->內存寫入
F9運行,中斷在00427F07處 復制內容到剪貼板 代碼:
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
//第一個校驗值
//這個是計算CRC的代碼長度
//可以記住0X00022D88處數據,然后在脫殼文件中搜索,就可以得到新的長度=00043B88
取消內存斷點,下面就是其他2組校驗值的處理了 復制內容到剪貼板 代碼:
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
//第二個校驗值
//WinHex中去偏移00022A00處看看,發現是附加數據開始的地址
復制內容到剪貼板 代碼:
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
//第三個校驗值
//這個運算后的值是文件校驗值
復制內容到剪貼板 代碼:
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
//計算校驗值
00427F80 8B45 F8 mov eax,dword ptr ss:[ebp-8]
00427F83 3BF8 cmp edi,eax
//EAX=計算CRC的代碼長度
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]中是計算出的校驗值 比較校驗值
00427F8D 74 05 je short 00427F94
//不跳就掛了
00427F8F 6A 03 push 3
00427F91 5F pop edi
00427F92 EB 45 jmp short 00427FD9
—————————————————————————————————
五、修復校驗


分析清楚了
AutoIt取Overlay的最后12個字節異或AAAAAAAA得到校驗值或者數據地址 復制內容到剪貼板 代碼:
1、第一個校驗數據 XOR AAAAAAAA=計算CRC的代碼長度
2、第二個校驗數據 XOR AAAAAAAA=附加數據開始的地址
3、第三個校驗數據 XOR AAAAAAAA=文件校驗值
看看我們用UPX對Test.AutoIt.CRC.exe脫殼得到的UnPacKed.exe文件信息: 復制內容到剪貼板 代碼:
1、計算CRC的代碼長度=00043B88
2、附加數據開始的地址=00043800
3、文件校驗值=需要跟蹤->F928C0C3
修復校驗: 復制內容到剪貼板 代碼:
1、第一個校驗數據=00043B88 XOR AAAAAAAA=AAAE9122
2、第二個校驗數據=00043800 XOR AAAAAAAA=AAAE92AA
在UnPacKed.exe的校驗數據開始的地址處修正這2個值,再看文件校驗
載入UnPacKed.exe調試,BP 00427F8A,運行、中斷,[ebp-14]=[0012ECA0]=F928C0C3 復制內容到剪貼板 代碼:
3、第三個校驗數據=F928C0C3 XOR AAAAAAAA=53826A69當然,第三個校驗可以修改00427F8D jmp 00427F94直接去除,但是不推薦這樣做 復制內容到剪貼板 代碼:
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個字節后,脫殼文件就可以正常運行了。


—————————————————————————————————
六、例子演示


論壇有個SW.exe也是AutoIt編譯的文件
用UPX-Ripper脫殼得到SW.UnPacKed.exe
載入SW.exe原版調試 復制內容到剪貼板 代碼:
[/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 到這里
復制內容到剪貼板 代碼:
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
正常的分析途徑如上面所操作的。不過這里用個簡便的方法來到檢驗值處理的地方
Ctrl+F 在整個段塊搜索命令:mov edi,0AAAAAAAA
找到0043D50A處,下斷,F9運行后中斷 復制內容到剪貼板 代碼:
0043D50A BF AAAAAAAA mov edi,AAAAAAAA
0043D50F 317D FC xor dword ptr ss:[ebp-4],edi
//[ebp-4]=[0012E844]=AAA81120 XOR AAAAAAAA=0002BB8A
//第一個校驗值
//計算CRC的代碼長度
//看看0X0002BB8A處數據,然后去SW.UnPacKed.exe里搜索,得到新的長度=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
//第二個校驗值
//附加數據開始的地址,UnPacKed.exe里的附加數據開始地址=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
//第三個校驗值
//這個運算后的值是文件校驗值
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]
//比較校驗值
0043D595 74 05 je short 0043D59C
0043D597 6A 03 push 3
0043D599 5F pop edi
0043D59A EB 45 jmp short 0043D5E1
修復SW.UnPacKed.exe的校驗: 復制內容到剪貼板 代碼:
1、第一個校驗數據=0005F58A XOR AAAAAAAA=AAAF5F20
2、第二個校驗數據=0005E000 XOR AAAAAAAA=AAAF4AAA
在SW.UnPacKed.exe的校驗數據開始的地址處修正這2個值,再看文件校驗
載入SW.UnPacKed.exe調試,BP 0043D592,運行、中斷,[ebp-10]=[0012E838]=6C93F7B3 復制內容到剪貼板 代碼:
3、第三個校驗數據=6C93F7B3 XOR AAAAAAAA=C6395D19再修正最后一個校驗值,可以運行了。


Game Over

該文章在 2014/4/10 11:45:04 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved