首页
社区
课程
招聘
[原创]高并发Hook_KiSwapContext技巧(0x64不需要这么麻烦)DPC也可以实现,火哥牛逼
发表于: 2020-5-22 11:08 3178

[原创]高并发Hook_KiSwapContext技巧(0x64不需要这么麻烦)DPC也可以实现,火哥牛逼

2020-5-22 11:08
3178

#includ


e "hook.h"

ULONG basejmp = 0;


static ULONG Structure_jmp(ULONG _RET, ULONG _go, _Out_ PCHAR jmp_bu)

{

jmp_bu[0] = 0xe9;

ULONG code = _go - _RET - 5;

*(ULONG *)((char *)jmp_bu + 1) = code;

KdPrint(("hook地址计算 %x\r\n", code));

return 0;

}

ULONG Highconcurrency_Hook(ULONG base, ULONG gou_eax, ULONG gou_edx, ULONG retu_ecx, ULONG retu_ebx)

{


_asm

{


cli;//将处理器标志寄存器的中断标志位清0,不允许中断

mov eax, cr0

and  eax, ~0x10000

mov cr0, eax

mov eax, gou_eax

mov edx, gou_edx

mov ebx, retu_ecx

mov ecx, retu_ebx

mov edi, [base]

lock cmpxchg8b qword ptr ss : [edi]



mov  eax, cr0

or     eax, 0x10000

mov  cr0, eax

sti;//将处理器标志寄存器的中断标志置1,允许中断

}


return 0;

}

ULONG fun(ULONG v1, ULONG v2)

{

/*

mov     [esp+0Ch], ebx

mov     [esp+8], esi

AGE:006139DC 8B FF                                                           mov     edi, edi

PAGE:006139DE 55                                                              push    ebp

PAGE:006139DF 8B EC                                                           mov     ebp, esp

PAGE:006139E1 51                                                              push    ecx

PAGE:006139E2 51                                                              push    ecx

PAGE:006139E3 64 A1 24 01 00 00                                               mov     eax, large fs:124h

PAGE:006139E9 8A 80 3A 01 00 00                                               mov     al, [eax+13Ah]


*/

char jmp_bu[8] = { 0, 0, 0, 0, 0, 0x90, 0x90, 0x90 };

//v1 = v1+5;

//basejmp = v1 + 8;


KdPrint(("NtOpenProcess %x\r\n functionhook\r\n", v1, v2));

Structure_jmp(v1, v2, jmp_bu);

Highconcurrency_Hook(v1, *((ULONG*)v1), *((ULONG*)v1 + 1), *((ULONG*)jmp_bu), *((ULONG*)jmp_bu + 1));

return v1 + 8;

}



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 137
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
干鸡 关注火哥不迷茫 火哥带你上高速
2020-5-22 11:12
0
雪    币: 515
活跃值: (3242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem
3
2020-5-22 12:03
0
雪    币: 137
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你这个是攻 来个守
BOOLEAN AddGdtItemCodeOrData(USHORT Selector,ULONG Base,ULONG attr)
{
       char g_gdt[6] = {0};
       //单核的
       
       __asm
       {
               sgdt g_gdt;
       }

       ULONG gdtBase = *(ULONG*)&g_gdt[2];
       USHORT gdtLimit = *(USHORT*)&g_gdt[0] & 0xfff8;
       Selector = Selector & 0xfff8;
       
       if (Selector > gdtLimit)
       {
               KdPrint(("line %d AddGdtItemCodeOrData\r\n", __LINE__));
               return FALSE;
       }

       PLARGE_INTEGER  pItem = (PLARGE_INTEGER)(gdtBase + Selector);

       pItem->LowPart = ((Base & 0xffff) << 16) | 0xffff;
       pItem->HighPart = (Base & 0xff000000) | (attr << 8) | ((Base & 0xff0000) >> 16);

       return TRUE;
}

BOOLEAN AddGdtItemCate(USHORT Selector, USHORT GotoSelector,ULONG Offset, ULONG attr)
{
       char g_gdt[6] = { 0 };
       __asm
       {
               sgdt g_gdt;
       }

       ULONG gdtBase = *(ULONG*)&g_gdt[2];
       USHORT gdtLimit = *(USHORT*)&g_gdt[0] & 0xfff8;
       Selector = Selector & 0xfff8;

       if (Selector > gdtLimit)
       {
               KdPrint(("line %d AddGdtItemCate\r\n", __LINE__));
               return FALSE;
       }

       PLARGE_INTEGER  pItem = (PLARGE_INTEGER)(gdtBase + Selector);

       pItem->LowPart = (Offset & 0xffff) | (GotoSelector << 16);
       pItem->HighPart = (Offset & 0xffff0000) | (attr & 0xffff);

       return TRUE;
}

ULONG GetIdtFuncById(ULONG idtId)
{
       char g_idt[6] = { 0 };

       __asm
       {
               sidt g_idt;
       }

       ULONG idtBase = *(ULONG*)&g_idt[2];
       USHORT idtLimit = *(USHORT*)&g_idt[0] & 0xfff8;
       idtId = idtId <= 0 ? 0 : idtId * 8;

       if (idtId > idtLimit)
       {
               KdPrint(("line %d GetIdtFuncById\r\n", __LINE__));
               return 0;
       }

       PLARGE_INTEGER  pItem = (PLARGE_INTEGER)(idtBase + idtId);

       return (pItem->HighPart & 0xffff0000) | (pItem->LowPart & 0xffff);
}

BOOLEAN UpDateIdtItemSelector(ULONG idtId,USHORT Selector,USHORT * OldSelector)
{
       char g_idt[6] = { 0 };
       //单核的

       __asm
       {
               sidt g_idt;
       }

       ULONG idtBase = *(ULONG*)&g_idt[2];
       USHORT idtLimit = *(USHORT*)&g_idt[0] & 0xfff8;
       idtId = idtId <= 0 ? 0 : idtId * 8;

       if (idtId > idtLimit)
       {
               KdPrint(("line %d GetIdtFuncById\r\n", __LINE__));
               return FALSE;
       }

       PLARGE_INTEGER  pItem = (PLARGE_INTEGER)(idtBase + idtId);
       if (OldSelector != NULL)
       {
               *OldSelector = (pItem->LowPart & 0xffff0000) >> 16;
       }

       pItem->LowPart = (pItem->LowPart & 0xffff) | (Selector << 16);

       return TRUE;
}


ULONG IdtFilter(ULONG idtId)
{
       KdPrint(("int %d\r\n", idtId));
       

       return GetIdtFuncById(idtId);
}

char g_callCate[6] = {0,0,0,0,0x90,0};

void __declspec(naked) CallCateFunc()
{
       __asm
       {
               pushfd;
               pushad;
               push fs;
               push 0x30;
               pop fs;

               push [esp + 0x28];
               call IdtFilter;
               mov [esp + 0x28], eax;
               pop fs;
               popad;
               popfd;

               add esp, 4;
               jmp [esp - 4];
       }
}

void __declspec(naked) Int3Hook()
{
       __asm
       {
               push 3;
               jmp fword ptr g_callCate
       }
}

BOOLEAN HookIdt(ULONG idtId,ULONG newFunc,USHORT Selector,USHORT GateSelector,USHORT * OldSelector)
{
       ULONG funcOffset =GetIdtFuncById(idtId);
       ULONG Base = newFunc - funcOffset;
       if (AddGdtItemCodeOrData(Selector, Base, 0xcf9b))
       {
               //添加调用门
               if (AddGdtItemCate(GateSelector, 0x8, (ULONG)CallCateFunc, 0xec00))
               {
                       return UpDateIdtItemSelector(idtId, Selector, OldSelector);
               }
       }

       return FALSE;
}


VOID DriverUpload(PDRIVER_OBJECT pDriver)
{
       UpDateIdtItemSelector(3, 0x8, NULL);
       KdPrint(("DriverUpload fuck over\r\n"));
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING pReg)
{
       pDriver->DriverUnload = DriverUpload;
       KdPrint(("DriverEntry continue fuck\r\n"));
       if (!HookIdt(3, (ULONG)Int3Hook, 0x48, 0x90, NULL))
       {
               KdPrint(("func !! Hook int 3 failed\r\n"));
       }
       return  STATUS_SUCCESS;
}
2020-5-22 15:47
0
雪    币: 6
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
lock cmpxchg8b   本来就是原子指令,前面不需要cli,也不需要提高中断等级
2020-5-22 19:00
0
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
lock可以不加 加也没事 加着玩的 锁缓存看心情
2020-5-22 19:37
0
雪    币: 137
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
干鸡
2020-5-22 19:55
0
游客
登录 | 注册 方可回帖
返回
//