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补丁

放在同文件目录下运行软件

 

点登录,进去,完事说明:我也是个菜鸡,也是最近在学的破解,文中的软件是借用其余大牛的,我只是作个课后记录,把学习中遇到的问题记录下来,没有其余意思.

相关文章
相关标签/搜索