PEbundle V2.3脫殼 - 某演算法序號產生器

看雪資料發表於2015-11-15

【脫文標題】 PEbundle V2.3脫殼 - 某演算法序號產生器

【脫文作者】 weiyi75[Dfcg] 

【作者郵箱】 weiyi75@sohu.com

【作者主頁】 Dfcg官方大本營 --- www.chinadfcg.com
 
【使用工具】 Fi,Ollydbg,Loadpe,Imprec1.42

【脫殼平臺】 Win2K

【軟體名稱】 keygen

【軟體簡介】 PEbundle v2.3 加殼的一個某演算法序號產生器

【軟體大小】 164KB  

【下載地址】 本地下載

【加殼方式】 PEbundle v2.3

【保護方式】 壓縮殼,IAT簡單加密
 
【脫殼宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享: 
  

-------------------------------------------------------------------------------- 

【脫殼內容】 

看過 PEbundle V2.3脫殼――唐詩三百首 V1.2 脫文,大家對PEbundle V2.3有些概念吧,特點是迴圈多。

既然有了前面的經驗,就沒必要慢慢跟蹤了,首先找Oep。

OD設定忽略全部異常設定,載入程式,無須隱藏OD,因為PEbundle是個壓縮殼。

00439000 >  9C              pushfd  //入口點
00439001    60              pushad
00439002    E8 02000000     call keygen.00439009
00439007    33C0            xor eaxeax
00439009    8BC4            mov eaxesp
0043900B    83C0 04         add eax, 4
0043900E    93              xchg eaxebx
0043900F    8BE3            mov espebx
00439011    8B5B FC         mov ebxdword ptr ds:[ebx-4]
00439014    81EB 07304000   sub ebx, keygen.00403007                 ; ASCII "D$"
0043901A    87DD            xchg ebpebx
0043901C    80BD DD3B4000 0>cmp byte ptr ss:[ebp+403BDD], 0
00439023    74 21           je short keygen.00439046
00439025    8D85 D6384000   lea eaxdword ptr ss:[ebp+4038D6]
0043902B    50              push eax
0043902C    FF95 B2384000   call dword ptr ss:[ebp+4038B2]
00439032    8D8D 2C3A4000   lea ecxdword ptr ss:[ebp+403A2C]
00439038    51              push ecx
00439039    50              push eax
0043903A    FF95 A2384000   call dword ptr ss:[ebp+4038A2]
....................................................................................

找Oep試試我的二次軟硬斷點結合法,這個方法只能找Oep,IAT無法避免加密。

命令列 d 12ffc0

0012FFC0  F8 FF 12 00 F5 87 E6 77 A8 16 55 00 56 00 00 00  ?.w?U.V...  //已經有資料了,沒關係,還是下個硬體寫入dword斷點
0012FFD0  00 F0 FD 7F 00 02 00 00 C8 FF 12 00 00 02 00 00  .瘕...?....
0012FFE0  FF FF FF FF B4 F0 E7 77 C8 8E E6 77 00 00 00 00  答ww....
0012FFF0  00 00 00 00 00 00 00 00 00 90 43 00 00 00 00     .........C.....

F9執行

硬體斷點1

00439376    C3              retn
00439377    C8 000000       enter 0, 0
0043937B    57              push edi
0043937C    56              push esi
0043937D    8B75 08         mov esidword ptr ss:[ebp+8]
00439380    8B7D 0C         mov edidword ptr ss:[ebp+C]
00439383    8A06            mov albyte ptr ds:[esi]
00439385    3C 61           cmp al, 61
00439387    72 06           jb short keygen.0043938F
00439389    3C 7A           cmp al, 7A
0043938B    77 02           ja short keygen.0043938F
0043938D    04 E0           add al, 0E0
0043938F    8A27            mov ahbyte ptr ds:[edi]
00439391    80FC 61         cmp ah, 61
00439394    72 08           jb short keygen.0043939E
00439396    80FC 7A         cmp ah, 7A
00439399    77 03           ja short keygen.0043939E
0043939B    80C4 E0         add ah, 0E0
0043939E    46              inc esi
0043939F    47              inc edi
004393A0    837D 10 01      cmp dword ptr ss:[ebp+10], 1
004393A4    75 01           jnz short keygen.004393A7
...........................................................................

然後Alt+M 開啟記憶體映象視窗。

記憶體映象,專案 12
 地址=00401000      //Code 段下記憶體訪問斷點,F9執行
 大小=0000D000 (53248.)
 Owner=keygen   00400000
 區段=.text
 包含=code
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE
 
記憶體斷點

0040D1EF  /.  55            push ebp        //OEP 入口,LoadPe脫殼
0040D1F0  |.  8BEC          mov ebpesp
0040D1F2  |.  6A FF         push -1
0040D1F4  |.  68 10FD4000   push keygen.0040FD10
0040D1F9  |.  68 4ED34000   push keygen.0040D34E                     ;  jmp to MSVCRT._except_handler3; SE handler 

installation
0040D1FE  |.  64:A1 0000000>mov eaxdword ptr fs:[0]
0040D204  |.  50            push eax
0040D205  |.  64:8925 00000>mov dword ptr fs:[0], esp
0040D20C  |.  83EC 68       sub esp, 68
0040D20F  |.  53            push ebx
0040D210  |.  56            push esi
0040D211  |.  57            push edi
0040D212  |.  8965 E8       mov dword ptr ss:[ebp-18], esp
0040D215  |.  33DB          xor ebxebx
0040D217  |.  895D FC       mov dword ptr ss:[ebp-4], ebx
0040D21A  |.  6A 02         push 2
0040D21C  |.  FF15 54E44000 call dword ptr ds:[40E454]               ;  MSVCRT.__set_app_type
0040D222  |.  59            pop ecx
0040D223  |.  830D 70234100>or dword ptr ds:[412370], FFFFFFFF
0040D22A  |.  830D 74234100>or dword ptr ds:[412374], FFFFFFFF
0040D231  |.  FF15 50E44000 call dword ptr ds:[40E450]               ;  MSVCRT.__p__fmode
0040D237  |.  8B0D 64234100 mov ecxdword ptr ds:[412364]
0040D23D  |.  8908          mov dword ptr ds:[eax], ecx
0040D23F  |.  FF15 4CE44000 call dword ptr ds:[40E44C]               ;  MSVCRT.__p__commode
.........................................................................................

脫殼後發現程式不能執行,這時需要用Imprec修復引入函式表(Import Table)

Imprec選擇程式,在Oep處填71B80,點IT自動搜尋,然後點獲輸入資訊,看到輸入表有無效的,點顯示無效按鈕,提示有1個未修復的指標,這是垃

圾指標嗎?直接Cut程式是無法執行的,刪除這個指標程式可以執行,感覺不爽。為這個問題特地請教Jwh51。

不同的DLL之間一定要有個空間進行區別,所以很多殼就在這個空間內插入垃圾了,而同一個DLL之內是沒有空餘空間的.所以也無法插入垃圾了。

一般情況下,垃圾總是位於兩個DLL之間,而這個指標位於Kernel32.dll之間, 所以這個指標不是垃圾指標,為什麼這個指標刪除仍然可以執行?這是因為在程式裡API是按順序排列的,排上去不併不一定馬上就要用到。當然

,可能程式裡沒用到這個指標,就不會出錯了。

那我們找找它是Kernel32.dll的哪個Api函式。

圖中我們看到,40e078處的指標無法識別,這個用功能強大的OD下斷點,基本上都能從堆疊獲暫存器裡找到加密指標。

還是命令列 d 40e078,然後對40e078下硬體寫入dword斷點,當加密指標時Od立刻會通知我們。

F9執行中斷兩次,第二次到這裡中斷。

硬體中斷

00439BD4  ^E9 67FFFFFF     jmp keygen.00439B40
00439BD9    F8              clc
00439BDA    C3              retn
00439BDB    F9              stc
00439BDC    C3              retn
00439BDD    0000            add byte ptr ds:[eax], al
00439BDF    0000            add byte ptr ds:[eax], al
00439BE1    0000            add byte ptr ds:[eax], al
00439BE3    0000            add byte ptr ds:[eax], al
00439BE5    0000            add byte ptr ds:[eax], al
00439BE7    0000            add byte ptr ds:[eax], al
00439BE9    0000            add byte ptr ds:[eax], al
00439BEB    0000            add byte ptr ds:[eax], al
00439BED    0000            add byte ptr ds:[eax], al
00439BEF    0000            add byte ptr ds:[eax], al
..........................................................................................


0012FF80   00036000
0012FF84   00439B87  keygen.00439B87
0012FF88   004394AA  keygen.004394AA
0012FF8C   77E705CF  KERNEL32.LoadLibraryA  //堆疊捲軸往上一點看到 KERNEL32.LoadLibraryA
0012FF90   00400000  keygen.00400000
0012FF94   00410A30  keygen.00410A30
0012FF98   00439ABC  返回到 keygen.00439ABC 來自 keygen.00439AC9
0012FF9C   004392C1  返回到 keygen.004392C1 來自 keygen.00439AAD
0012FFA0   005516A8

ECX 00410A30 keygen.00410A30
EDX 00400000 keygen.00400000
EBX 004110B8 ASCII "LoadLibraryA"  //暫存器EBX中存放的加密指標
ESP 0012FF98
EBP 00036000
ESI 00410914 keygen.00410914
EDI 0040E07C keygen.0040E07C
EIP 00439BD4 keygen.00439BD4
C 1  ES 0023 32bit 0(FFFFFFFF)
P 1  CS 001B 32bit 0(FFFFFFFF)
A 0  SS 0023 32bit 0(FFFFFFFF)
Z 0  DS 0023 32bit 0(FFFFFFFF)
S 1  FS 0038 32bit 7FFDE000(FFF)
T 0  GS 0000 NULL
D 0
O 0  LastErr ERROR_SUCCESS (00000000)
EFL 00000287 (NO,B,NE,BE,S,PE,L,LE)
ST0 empty 0.0
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 0.0
ST7 empty -UNORM E330 00000020 00000000
               3 2 1 0      E S P U O Z D I
FST 0000  Cond 0 0 0 0  Err 0 0 0 0 0 0 0 0  (GT)
FCW 027F  Prec NEAR,53  Mask    1 1 1 1 1 1
..............................................................................

於是在Rva 0000E078 處填入 KERNEL32.LoadLibraryA

指標全部修復,修復程式,正常執行。



【脫殼總結】PEbundle V2.3手動脫殼一般用二次軟硬斷點結合法找OEP,IAT一般沒有加密,加密指標也很容易用硬體訪問斷點找到答案。



--------------------------------------------------------------------------------  
  
 

【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整,感謝Jwh51兄的耐心指點!



相關文章