UPX脱壳全程分析(转)
【文章標題】: UPX脫殼全程分析
【保護方式】: 本地驗證 【使用工具】: OllyDBG 【作者聲明】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教! --------------------------------------------------------------------------------
???????? 004629D0?? ??? ? > 60 ?? ??? ??? ??? ?pushad ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//保存現場(pushad 相當于 push 所有的寄存器)
004629D1 ?? ??? ?BE 00F04300 ?? ??? ?mov esi, 0043F000 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//把代碼段放到esi寄存器
004629D6 ?? ??? ?8DBE 0020FCFF ?? ??? ?lea edi, dword ptr [esi+FFFC2000] ?? ??? ??? ??? ??? ??? ?//得到基址
004629DC ?? ??? ?C787 9CC00400 7>?? ?mov dword ptr [edi+4C09C], 46CD167B ?? ??? ??? ??? ??? ?//將第一個函數的地址放到[edi+ 4C09C]
004629E6 ?? ??? ?57 push edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//將基址壓棧
004629E7 ?? ??? ?83CD FF or ebp, FFFFFFFF ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//將0012FFC0與 FFFFFFFF或
004629EA ?? ??? ?EB 0E jmp short 004629FA
004629EC ?? ??? ?90 nop
004629ED ?? ??? ?90 nop
004629EE ?? ??? ?90 nop
004629EF ?? ??? ?90 nop
004629F0 ?? ??? ?8A06 ?? ??? ??? ??? ?mov al, byte ptr [esi] ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//取出0043F004的一個字節
004629F2 ?? ??? ?46 ?? ??? ??? ??? ??? ?inc esi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向下一個字節
004629F3 ?? ??? ?8807 ?? ??? ??? ??? ?mov byte ptr [edi], al ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//從00401000開始,開始還原代碼
004629F5 ?? ??? ?47 ?? ??? ??? ??? ??? ?inc edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向下一個地址
004629F6 ?? ??? ?01DB ?? ??? ??? ??? ?add ebx, ebx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//ebx + ebx,當ebx不等于零的時候跳轉,下面的adc如果為,就取出下一個地址,并放到ebx中
004629F8 ?? ??? ?75 07 ?? ??? ??? ??? ?jnz short 00462A01
004629FA ?? ??? ?8B1E ?? ??? ??? ??? ?mov ebx, dword ptr [esi] ?? ??? ??? ??? ??? ??? ??? ??? ?//將0043F000放到ebx中
004629FC ?? ??? ?83EE FC ?? ??? ??? ?sub esi, -4 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//0043F000加4
004629FF ?? ??? ?11DB ?? ??? ??? ??? ?adc ebx, ebx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//進位加法器
00462A01 ?? ??? ?^ 72 ED ?? ??? ??? ?jb short 004629F0 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 向上跳轉,ebx做為是否回跳的標志,循環處理代碼
00462A03 ?? ??? ?B8 01000000 ?? ??? ?mov eax, 1 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// eax = 1
00462A08 ?? ??? ?01DB ?? ??? ??? ??? ?add ebx, ebx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// ebx依然作為循環的標志
00462A0A ?? ??? ?75 07 ?? ??? ??? ??? ?jnz short 00462A13
00462A0C ?? ??? ?8B1E ?? ??? ??? ??? ?mov ebx, dword ptr [esi] ?? ??? ??? ??? ??? ??? ??? ??? ?//esi指向的地址放到ebx里面
00462A0E ?? ??? ?83EE FC ?? ??? ??? ?sub esi, -4 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//esi + 4
00462A11 ?? ??? ?11DB ?? ??? ??? ??? ?adc ebx, ebx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//進位加法
00462A13 ?? ??? ?11C0 ?? ??? ??? ??? ?adc eax, eax ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//進位加法
00462A15 ?? ??? ?01DB ?? ??? ??? ??? ?add ebx, ebx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//ebx + ebx
00462A17 ?? ??? ?73 0B ?? ??? ??? ??? ?jnb short 00462A24
00462A19 ?? ??? ?75 28 ?? ??? ??? ??? ?jnz short 00462A43 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//跳到下面
00462A95 ?? ??? ?81FD 00FBFFFF ?? ??? ?cmp ebp, -500 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//迷惑指令
00462A9B ?? ??? ?83D1 02 ?? ??? ??? ?adc ecx, 2 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//進位加法
00462A9E ?? ??? ?8D142F ?? ??? ??? ??? ?lea edx, dword ptr [edi+ebp] ?? ??? ??? ??? ??? ??? ??? ?//edi + ebp的地址裝載到edx,即原來的代碼段的地址
00462AA1 ?? ??? ?83FD FC ?? ??? ??? ?cmp ebp, -4 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//判斷跳轉標志,EBP小于等于-4就跳
00462AA4 ?? ??? ?76 0E ?? ??? ??? ??? ?jbe short 00462AB4
00462AA6 ?? ??? ?8A02 ?? ??? ??? ??? ?mov al, byte ptr [edx] ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//取出代碼段的一字節
00462AA8 ?? ??? ?42 ?? ??? ??? ??? ??? ?inc edx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向下一個地址
00462AA9 ?? ??? ?8807 ?? ??? ??? ??? ?mov byte ptr [edi], al ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//取出的代碼放到edi里面
00462AAB ?? ??? ?47 ?? ??? ??? ??? ??? ?inc edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向下一個代碼
00462AAC ?? ??? ?49 ?? ??? ??? ??? ??? ?dec ecx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//計數器
00462AAD ?? ??? ?^ 75 F7 ?? ??? ??? ?jnz short 00462AA6 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//關于計數器(ecx)的跳轉
00462AAF ?? ??? ?^ E9 42FFFFFF ?? ??? ?jmp 004629F6 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//向上面跳,跳到add ebx,ebx
00462AB4 ?? ??? ?8B02 ?? ??? ??? ??? ?mov eax, dword ptr [edx] ?? ??? ??? ??? ??? ??? ??? ??? ?//處理輸入表
00462AB6 ?? ??? ?83C2 04 ?? ??? ??? ?add edx, 4 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//edx + 4,指向下一個地址
00462AB9 ?? ??? ?8907 ?? ??? ??? ??? ?mov dword ptr [edi], eax ?? ??? ??? ??? ??? ??? ??? ??? ?//將代碼放到edi
00462ABB?? ??? ?83C7 04 ?? ??? ??? ?add edi, 4 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// edi + 4, 存放代碼的地址
00462AC3 ?? ??? ?01CF ?? ??? ??? ??? ?add edi, ecx ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//edi + ecx,指向接收代碼的地址的最后一個字節
00462AC5 ?? ??? ?^ E9 2CFFFFFF ?? ??? ?jmp 004629F6 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//跳到 add ebx,ebx
00462AD2 ?? ??? ?8A07 ?? ??? ??? ??? ?mov al, byte ptr [edi] ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向我們原來代碼段的代碼,取出到AL里面
00462AD4 ?? ??? ?47 ?? ??? ??? ??? ??? ?inc edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向下一個字節
00462AD5?? ??? ?2C E8 ?? ??? ??? ??? ?sub al, 0E8 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//處理CALL
00462AD7 ?? ??? ?3C 01 ?? ??? ??? ??? ?cmp al, 1 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//判斷al是否大于1
00462AD9 ?? ??? ?^ 77 F7 ?? ??? ??? ?ja short 00462AD2?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//循環,到下一個CALL的第一個字節為止
00462AE0 ?? ??? ?8B07 ?? ??? ??? ??? ?mov eax, dword ptr [edi] ?? ??? ??? ??? ??? ??? ??? ??? ?//取出里面的地址,里面的地址是定位CALL的絕對地址要用到的
00462AE2 ?? ??? ?8A5F 04 ?? ??? ??? ?mov bl, byte ptr [edi+4] ?? ??? ??? ??? ??? ??? ??? ??? ?//得到下條地址的開始字節放到AL里面,CALL絕對地址就是下條指令開始+剛才上面取出的那個數字
00462AE5?? ??? ?66:C1E8 08 ?? ??? ??? ?shr ax, 8 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//ax右移8位
00462AE9 ?? ??? ?C1C0 10 ?? ??? ??? ?rol eax, 10 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//eax算術左移 8位
00462AEC ?? ??? ?86C4?? ??? ??? ??? ?xchg ah, al ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//交換內容
00462AEE ?? ??? ?29F8 ?? ??? ??? ??? ?sub eax, edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//eax - edi
00462AF0 ?? ??? ?80EB E8 ?? ??? ??? ?sub bl, 0E8?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//再減去E8
00462AF3 ?? ??? ?01F0 ?? ??? ??? ??? ?add eax, esi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//eax + esi,其中 esi是代碼段開始的地方
00462AF5 ?? ??? ?8907 ?? ??? ??? ??? ?mov dword ptr [edi], eax ?? ??? ??? ??? ??? ??? ??? ??? ?//這里處理CALL的地址,算出CALL的偏移到EDI里面
00462AF7 ?? ??? ?83C7 05 ?? ??? ??? ?add edi, 5 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//edi + 5,指向call的后面
00462AFA ?? ??? ?88D8 ?? ??? ??? ??? ?mov al, bl ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//bl的內容放到al中
00462AFC ?? ??? ?^ E2 D9 ?? ??? ??? ?loopd short 00462AD7 ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//循環處理CALL,其中ecx作為計數器
00462AFE ?? ??? ?8DBE 00F00500 ?? ??? ?lea edi, dword ptr [esi+5F000] ?? ??? ??? ??? ??? ??? ??? ?//代碼段的起始地址 + 5F000
00462B04 ?? ??? ?8B07 ?? ??? ??? ??? ?mov eax, dword ptr [edi] ?? ??? ??? ??? ??? ??? ??? ??? ?//現在EDI指向我們的代碼的輸入表
00462B06 ?? ??? ?09C0 ?? ??? ??? ??? ?or eax, eax ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//eax 或 eax ,判斷eax是否為零
00462B0A ?? ??? ?8B5F 04 ?? ??? ??? ?mov ebx, dword ptr [edi+4] ?? ??? ??? ??? ??? ??? ??? ??? ?//取得這個地址的數據放到ebx
00462B0D ?? ??? ?8D8430 AC2D0600 ?? ?lea eax, dword ptr [eax+esi+62DAC] ?? ??? ??? ??? ??? ??? ?// 取得外殼段的KERNEL32.DLL的地址放eax
00462B14 ?? ??? ?01F3 ?? ??? ??? ??? ?add ebx, esi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//我們代碼段的起始地址加上剛才取出的那個數據
00462B16 ?? ??? ?50 ?? ??? ??? ??? ??? ?push eax ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//kernel32.dll的地址
00462B17 ?? ??? ?83C7 08 ?? ??? ??? ?add edi, 8 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//edi + 8
00462B1A ?? ??? ?FF96 4C2E0600 ?? ??? ?call dword ptr [esi+62E4C] ?? ??? ??? ??? ??? ??? ??? ??? ?//裝載kernel32.dll
00462B20 ?? ??? ?95 ?? ??? ??? ??? ??? ?xchg eax, ebp ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//交換數據,即eax指向kernel32.dll的地址
00462B21 ?? ??? ?8A07 ?? ??? ??? ??? ?mov al, byte ptr [edi] ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//取得現在的EDI的地址指向的數據放到AL
00462B23 ?? ??? ?47 ?? ??? ??? ??? ??? ?inc edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//指向下一個函數
00462B24 ?? ??? ?08C0 ?? ??? ??? ??? ?or al, al ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//al 或 al,判斷al是否為零
00462B26 ?? ??? ?^ 74 DC ?? ??? ??? ?je short 00462B04
00462B28 ?? ??? ?89F9 ?? ??? ??? ??? ?mov ecx, edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//取出的函數的名字放到ecx里面
00462B2A ?? ??? ?57 ?? ??? ??? ??? ??? ?push edi ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//函數名字壓棧
00462B2B ?? ??? ?48 ?? ??? ??? ??? ??? ?dec eax ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//eax - 1
00462B2C ?? ??? ?F2:AE ?? ??? ??? ??? ?repne scas byte ptr es:[edi]
00462B2E ?? ??? ?55 ?? ??? ??? ??? ??? ?push ebp ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//kernel32.dll的基址
00462B2F ?? ??? ?FF96 502E0600 ?? ??? ?call dword ptr [esi+62E50] ?? ??? ??? ??? ??? ??? ??? ??? ?//外殼的GetProcaddress
00462B35 ?? ??? ?09C0 ?? ??? ??? ??? ?or eax, eax ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//eax或eax,得到函數的地址
00462B37 ?? ??? ?74 07 ?? ??? ??? ??? ?je short 00462B40
00462B39 ?? ??? ?8903?? ? ?? ??? ??? ?mov dword ptr [ebx], eax ?? ??? ??? ??? ??? ??? ??? ??? ?//處理輸入表
00462B3B ?? ??? ?83C3 04 ?? ??? ??? ?add ebx, 4 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//ebx + 4,指向下一個輸入表的地址
00462B46 ?? ??? ?8BAE 542E0600 ?? ??? ?mov ebp, dword ptr [esi+62E54] ?? ??? ??? ??? ??? ??? ??? ?//VirtualProtect的地址放到ebp
00462B4C ?? ??? ?8DBE 00F0FFFF ?? ??? ?lea edi, dword ptr [esi-1000] ?? ??? ??? ??? ??? ??? ??? ?//指向PE頭,即映像基址
00462B52 ?? ??? ?BB 00100000 ?? ??? ?mov ebx, 1000 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//把1000放到ebx,即ebx = 1000
00462B5D ?? ??? ?FFD5 ?? ??? ??? ??? ?call ebp ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//改變屬性
00462B5F ?? ??? ?8D87 1F020000 ?? ??? ?lea eax, dword ptr [edi+21F] ?? ??? ??? ??? ??? ??? ??? ?//現在eax指向PE頭中區段的偏移起始位置
00462B65 ?? ??? ?8020 7F ?? ??? ??? ?and byte ptr [eax], 7F ?? ??? ??? ??? ??? ??? ??? ??? ??? ?//改寫區段名字
00462B68 ?? ??? ?8060 28 7F ?? ??? ??? ?and byte ptr [eax+28], 7F ?? ??? ??? ??? ??? ??? ??? ??? ?//改寫區塊屬性第一個區塊的屬性
00462B75 ?? ??? ?61 ?? ??? ??? ??? ??? ?popad ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//恢復現場
00462B76 ?? ??? ?8D4424 80 ?? ??? ??? ?lea eax, dword ptr [esp-80]
00462B7A ?? ??? ?6A 00 ?? ??? ??? ??? ?push 0
00462B7C ?? ??? ?39C4 ?? ??? ??? ??? ?cmp esp, eax
00462B7E ?? ??? ?^ 75 FA ?? ??? ??? ?jnz short 00462B7A
00462B80 ?? ??? ?83EC 80 ?? ??? ??? ?sub esp, -80
00462B83 ?? ??? ?^ E9 109FFEFF ?? ??? ?jmp 0044CA98 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//跨區段的轉移,跳到OEP
提供一份附件,看起來可能更直觀:
http://www.2cto.com/uploadfile/2012/1202/20121202072155254.zip
轉載于:https://www.cnblogs.com/Fightingbirds/p/3172890.html
總結
以上是生活随笔為你收集整理的UPX脱壳全程分析(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: San 3.7.4 发布,百度开源的 M
- 下一篇: introduce of servlet