DLL補丁劫持製做

DLL:網絡

因爲輸入表中只包含 DLL 名而沒有它的路徑名,所以加載程序必須在磁盤上搜索 DLL 文件。首先會嘗試從當前程序所在的目錄加載 DLL,若是沒找到,則在Windows 系統目錄中查找,最後是在環境變量中列出的各個目錄下查找。利用這個特色,先僞造一個系統同名的 DLL,提供一樣的輸出表,每一個輸出函數轉向真正的系統 DLL。程序調用系統 DLL 時會先調用當前目錄下僞造的 DLL,完成相關功能後,再跳到系統DLL同名函數裏執行。這個過程用個形象的詞來描述就是系統 DLL 被劫持(hijack)了。

利用這種方法取得控制權後,能夠對主程序進行補丁。此種方法只對除kernel32.dll、ntdll.dll等核心系統庫之外的DLL有效,如網絡應用程序的ws2_32.dll、遊戲程序中的d3d8.dll,還有大部分應用程序都調用的lpk.dll、sxs.dll,這些DLL均可被劫持。函數


僞造的 dll 製做好後,放到程序當前目錄下,這樣當原程序調用原函數時就調用了僞造的dll的同名函數,進入劫持DLL的代碼,處理完畢後,再調用原DLL此函數。工具

 

案例軟件也是從某個破解論壇上找的,算是拿着作課後練習,邊學邊記錄.學習

 

0x01ui

ODspa

PYG-優雅DLL劫持補丁製做工具3d

 

0x02指針

這個軟件是比較低的版本,跟如今升級以後的網絡驗證有不少不一樣,本篇是講的DLL補丁劫持code

 

0x03遊戲

PEID查殼

無殼,C++編寫的,不用在乎字符串找不到的問題

 

0x04

載入OD,CTRL+G,到401000

由於以前沒有加殼,80%的多是能夠查找到字符串的

來到最上邊,找到到期時間雙擊到代碼處,咱們就幹掉試用時間,達到長久試用的效果

00401291  |. /0F85 2B010000jnz 2.004013C2 00401297  |. |68 40726A00   push 2.006A7240 0040129C  |. |8B0424        mov eax, dword ptr ss:[esp] 0040129F  |. |8B00          mov eax, dword ptr ds:[eax] 004012A1  |. |8B00          mov eax, dword ptr ds:[eax] 004012A3  |. |FF90 88000000call dword ptr ds:[eax+0x88] 004012A9  |. |8945 F8       mov [local.2], eax 004012AC  |. |837D F8 01    cmp [local.2], 0x1 004012B0  |. |0F85 D7000000jnz 2.0040138D 004012B6  |. |68 40726A00   push 2.006A7240 004012BB  |. |8B0424        mov eax, dword ptr ss:[esp] 004012BE  |. |8B00          mov eax, dword ptr ds:[eax] 004012C0  |. |8B00          mov eax, dword ptr ds:[eax] 004012C2  |. |FF50 28       call dword ptr ds:[eax+0x28] 004012C5  |. |8945 FC       mov [local.1], eax 004012C8  |. |FF75 FC       push [local.1] 004012CB  |. |68 7E844700   push 2.0047847E                          ;  到期時間: 004012D0  |. |B9 02000000   mov ecx, 0x2 004012D5  |. |E8 AAFEFFFF   call 2.00401184 004012DA  |. |83C4 08       add esp, 0x8 004012DD  |. |8945 F8       mov [local.2], eax 004012E0  |. |8B5D FC       mov ebx, [local.1] 004012E3  |. |85DB          test ebx, ebx 004012E5  |. |74 09         je short 2.004012F0 004012E7  |. |53            push ebx 004012E8  |. |E8 156F0000   call 2.00408202 004012ED  |. |83C4 04       add esp, 0x4 004012F0  |> |6A 00         push 0x0 004012F2  |. |6A 00         push 0x0 004012F4  |. |6A 00         push 0x0 004012F6  |. |68 01030080   push 0x80000301 004012FB  |. |6A 00         push 0x0 004012FD  |. |68 00000000   push 0x0 00401302  |. |68 04000080   push 0x80000004 00401307  |. |6A 00         push 0x0 00401309  |. |8B45 F8       mov eax, [local.2] 0040130C  |. |85C0          test eax, eax 0040130E  |. |75 05         jnz short 2.00401315 00401310  |. |B8 79844700   mov eax, 2.00478479 00401315  |> |50            push eax 00401316  |. |68 03000000   push 0x3 0040131B  |. |BB 608D4000   mov ebx, 2.00408D60 00401320  |. |E8 E36E0000   call 2.00408208 00401325  |. |83C4 28       add esp, 0x28 00401328  |. |8B5D F8       mov ebx, [local.2] 0040132B  |. |85DB          test ebx, ebx 0040132D  |. |74 09         je short 2.00401338 0040132F  |. |53            push ebx 00401330  |. |E8 CD6E0000   call 2.00408202 00401335  |. |83C4 04       add esp, 0x4 00401338  |> |6A 00         push 0x0 0040133A  |. |68 00000000   push 0x0 0040133F  |. |6A FF         push -0x1 00401341  |. |6A 05         push 0x5 00401343  |. |68 00000106   push 0x6010000 00401348  |. |68 01000152   push 0x52010001 0040134D  |. |E8 DA6E0000   call 2.0040822C 00401352  |. |83C4 18       add esp, 0x18 00401355  |. |68 02000080   push 0x80000002 0040135A  |. |6A 00         push 0x0 0040135C  |. |68 01000000   push 0x1 00401361  |. |6A 00         push 0x0 00401363  |. |6A 00         push 0x0 00401365  |. |6A 00         push 0x0 00401367  |. |68 01000100   push0x10001 0040136C  |. |68 A3000106   push 0x60100A3 00401371  |. |68 A4000152   push 0x520100A4 00401376  |. |68 03000000   push 0x3 0040137B  |. |BB C0854000   mov ebx, 2.004085C0 00401380  |. |E8 836E0000   call 2.00408208 00401385  |. |83C4 28       add esp, 0x28 00401388  |. |E9 30000000   jmp 2.004013BD 0040138D  |> \6A 00         push 0x0 0040138F  |.  6A 00        push 0x0 00401391  |.  6A 00        push 0x0 00401393  |.  68 01030080  push 0x80000301 00401398  |.  6A 00        push 0x0 0040139A  |.  68 00000000  push 0x0 0040139F  |.  68 04000080  push 0x80000004 004013A4  |.  6A 00        push 0x0 004013A6  |.  68 89844700  push 2.00478489                         ;  登陸失敗 004013AB  |.  68 03000000  push 0x3 004013B0  |.  BB 608D4000  mov ebx, 2.00408D60 004013B5  |.  E8 4E6E0000  call 2.00408208 004013BA  |.  83C4 28      add esp, 0x28 004013BD  |>  E9 5D000000  jmp 2.0040141F 004013C2  |>  68 40726A00  push 2.006A7240

0x05

注意看代碼,

「到期時間」往上找到一處跳轉,而後再往上,還有一處跳轉,跳過下面這一個

可是第一個跳轉是跳過登錄失敗,第二個是跳過試用時間

00401291  |. /0F85 2B010000jnz 2.004013C2 004012B0  |. /0F85 D7000000jnz 2.0040138D

咱們能夠修改jnz爲jmp或者用00 填充,nop填充

00401291      90            nop 00401292      90            nop 00401293      90            nop 00401294      90            nop 00401295      90            nop 00401296      90            nop 004012B0      90            nop 004012B1      90            nop 004012B2      90            nop 004012B3      90            nop 004012B4      90            nop 004012B5      90            nop

0x06

以後搜索二進制字符串FF25

查找易語言體

爲何來到這,由於咱們要找程序的開頭也就是入口點

每一個jmp回車找一下push ebp

這個地方我也不懂,擺渡的解釋是這樣的

子程序如何存取參數,由於缺省對堆棧操做的寄存器有 ESP 和 EBP,而 ESP是堆棧指針,沒法暫借使用,因此通常使用 EBP 來存取堆棧,假定在一個調用中有兩個參數,並且在 push 第一個參數前的堆棧指針 ESP 爲 X,那麼壓入兩個參數後的 ESP 爲 X-8,程序開始執行 call 指令,call 指令把返回地址壓入堆棧,這時候 ESP 爲 X-C,這時已經在子程序中了,咱們能夠開始使用 EBP 來存取參數了,但爲了在返回時恢復 EBP 的值,咱們仍是再須要一句 push ebp 來先保存 EBP 的值,這時 ESP 爲 X-10,再執行一句 mov ebp,esp,根據右圖能夠看出,實際上這時候 [ebp + 8] 就是參數1,[ebp + c]就是參數2。

 

0x07

看的我一連mengbi,找到倒數第五個jmp進去

00424F70  /.  55            push ebp 00424F71  |.  8BEC          mov ebp, esp 00424F73  |.  8B45 08       mov eax, [arg.1] 00424F76  |.  50            push eax 00424F77  |.  8B4D 08       mov ecx, [arg.1] 00424F7A  |.  8B148D B89269>mov edx, dword ptr ds:[ecx*4+0x6992B8] 00424F81  |.  52            push edx 00424F82  |.  B9 90336B00   mov ecx, 2.006B3390 00424F87  |.  E8 847EFFFF   call 2.0041CE10 00424F8C  |.  5D            pop ebp 00424F8D  \.  C3            retn[align=left]

 

這地方應該是一個特徵,咱們把它retn就行了 00424F70  /.  55            push ebp 改成 00424F70      C3            retn

把全部關鍵地方找到以後,開始打補丁製做工具對照以前修改的地方

 

0x08

而後生成DLL補丁

放在同文件目錄下運行軟件

 

點登錄,進去,完事說明:我也是個菜雞,也是最近在學的破解,文中的軟件是借用其餘大牛的,我只是作個課後記錄,把學習中遇到的問題記錄下來,沒有其餘意思.

相關文章
相關標籤/搜索