首页
社区
课程
招聘
[分享]重读老文章:DLL注入的又一个梗
发表于: 2014-4-20 11:44 25983

[分享]重读老文章:DLL注入的又一个梗

2014-4-20 11:44
25983

上回的梗是APC,但是遗憾的是不支持x64,而且嵌入会被某些15年战斗力的人鄙视~
那么这回的梗要高端大气一点了~,可以支持x64,而且没有汇编~
其实说白了就是靠传说中的KeUserModeCallBack调用来搞定的~
而且不是用KeUserModeCallBack注入shellcode,而是直接调用内核层的ClientLoadlibrary实现~其实更懒的方法是直接找到Win32k.sys里的那个


这里提一下比较好玩的地方主要是KeUserModeCallBack的参数,这里我偷了个懒,使用了小技巧的方式来进行参数初始化
具体代码如下

NTSYSAPI NTSTATUS NTAPI 
	KeUserModeCallback(
	IN ULONG ApiNumber,
	IN PVOID InputBuffer,
	IN ULONG InputLength,
	OUT PVOID *OutputBuffer,
	IN PULONG OutputLength
	);
typedef struct _CLientLoadLibraryParam
{
	DWORD dwSize;//+0
	DWORD dwStringLength; //+4
	DWORD ReservedZero1;//+8
	DWORD ReservedZero2;//+C
	DWORD ReservedZero3;//+10
	DWORD ReservedZero4;//+14
	DWORD ReservedZero5;//+18 () +1A () //不需要!
	DWORD ptrDllString;//+1C
	DWORD ReservedZero6;//+20
	DWORD ptrApiString;//+24
	WCHAR szDllName[MAX_PATH];
	WCHAR szApiName[MAX_PATH];
}CLientLoadLibraryParam,*PCLientLoadLibraryParam;

NTSTATUS InjectDll(LPCWSTR lpszDll,LPCWSTR lpszApi)
{
	PVOID Return;
	ULONG RetLen;
	PVOID BaseAddress = NULL;
	SIZE_T size = sizeof(CLientLoadLibraryParam);
	NTSTATUS ns;
	ns = ZwAllocateVirtualMemory(NtCurrentProcess(),
		&BaseAddress,
		0,
		&size,
		MEM_COMMIT,
		PAGE_EXECUTE_READWRITE);
	if (NT_SUCCESS(ns))
	{
		PCLientLoadLibraryParam p = (PCLientLoadLibraryParam)BaseAddress;
		RtlZeroMemory(p,sizeof(CLientLoadLibraryParam));
		p->dwSize = sizeof(CLientLoadLibraryParam);
		p->ReservedZero4 = 1;//这样子就是平滑模式了!
		wcsncpy(p->szApiName,lpszApi,MAX_PATH);
		wcsncpy(p->szDllName,lpszDll,MAX_PATH);
		p->ptrApiString = (DWORD)p->szApiName;
		p->ptrDllString = (DWORD)p->szDllName;
		
		ns = KeUserModeCallback(0x42,//Win7上是0x41
			BaseAddress,
			sizeof(CLientLoadLibraryParam),
			&Return,
			&RetLen
			);
	}
	return ns;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (35)
雪    币: 128
活跃值: (2788)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第一次离老v这么近
2014-4-20 11:53
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
指定程序注入dll,可以通过ProcessNotifyRoutine和ThreadNotifyRoutine
然后KeUserModeCallback就可以回调ntdll.LdrLoadDll注入了
2014-4-20 12:01
0
雪    币: 116
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了 顶V大
2014-4-20 12:35
0
雪    币: 615
活跃值: (590)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
老V又爆料了,看不大懂,肯定是好东西
2014-4-20 13:56
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不明觉厉呀. 老V能否说一下这些东西 你是怎么学的?
是每天对着ida 跟丫的 死嗑 嘛?
2014-4-20 14:17
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
占楼
2014-4-20 15:34
0
雪    币: 11220
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
占坑 ...这个真的看不懂。。
2014-4-20 17:34
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
差不多~
windbg调试+ida死磕~
2014-4-20 18:48
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
不过之前那个就调用个函数而已,还要嵌入asm,确实有点13
2014-4-20 20:11
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我是来这个帖子寻找15年经验的牛人的
2014-4-20 20:51
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
路过,看看!
2014-4-20 21:13
0
雪    币: 1088
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
标记一下
2014-4-21 13:05
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
14
ClientLoadlibrary 其实就是setwinhookex那一系列用来加载dll的玩意
还记得消息钩子dll不 那个dll就是这么进去的

话说KeUserModeCallBack有个很大的回调表
ClientLoadlibrary 是其中一个函数 还有好多其他的好玩函数
2014-4-21 15:36
0
雪    币: 2331
活跃值: (2220)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
15
其他好玩的,例如ClientImmLoadLayout,也是可以加载dll的。
2014-4-21 15:55
0
雪    币: 135
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
但是这里有个问题DLL被Load后,立刻被Free掉了~
所以DLL还要导出一个函数.

偶这个菜鸟问题个非常白痴的问题。为什么DLL导出一个函数就不会被Free掉。
2014-4-21 16:12
0
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
17
KernelMode         |                     UserMode                                          
nt!KeUserModeCallBack | -->  user32!__ClientLoadLibrary

int __stdcall __ClientLoadLibrary(int a1)
{
  void *v1; // edi@2
  const WCHAR *v2; // eax@3
  HMODULE v3; // esi@4
  FARPROC v4; // eax@5
  void *v6; // [sp+Ch] [bp-120h]@10
  int v7; // [sp+10h] [bp-11Ch]@10
  int v8; // [sp+14h] [bp-118h]@1
  int v9; // [sp+1Ch] [bp-110h]@1
  int v10; // [sp+20h] [bp-10Ch]@1
  CHAR ProcName; // [sp+24h] [bp-108h]@1
  char Dst; // [sp+25h] [bp-107h]@1
  unsigned int v13; // [sp+128h] [bp-4h]@1
  int v14; // [sp+12Ch] [bp+0h]@1

  v13 = (unsigned int)&v14 ^ __security_cookie;
  ProcName = 0;
  memset(&Dst, 0, 0x103u);
  v8 = 0;
  v9 = 0;
  v10 = 0;
  if ( *(_DWORD *)(a1 + 8) && !*(_DWORD *)(a1 + 20) )
    FixupCallbackPointers(a1);
  v1 = LoadLibraryExW(*(LPCWSTR *)(a1 + 0x1C), 0, 8u);
  if ( v1 )
  {
    v2 = *(const WCHAR **)(a1 + 0x24);
    if ( v2 )
    {
      v3 = v1;
      v1 = (void *)WideCharToMultiByte(0, 0x400u, v2, -1, &ProcName, 260, 0, 0);
      if ( !v1 )
        goto LABEL_16;
      v4 = GetProcAddress(v3, &ProcName);
      if ( !v4 || !InitUserApiHook(v3, v4) )
        v1 = 0;
      if ( v1 )
        v1 = v3;
      else
LABEL_16:
        FreeLibrary(v3);
    }
  }
  v6 = v1;
  v7 = 0;
  return NtCallbackReturn(&v6, 24, 0);
}

KeUserModeCallback这个函数只是一个工具一个入口而已,真正需要去学习的是他后面的那张KernelCallbackTable表。

0:005> dt ntdll!_PEB 7efde000
   +0x000 InheritedAddressSpace : 0 ''
   +0x001 ReadImageFileExecOptions : 0 ''
   ……………………
   ……………………
   +0x02c KernelCallbackTable : 0x7506b9f0 Void

0:005> dds 0x7506b9f0
7506b9f0  750af230 USER32!__fnCOPYDATA
7506b9f4  750af1ba USER32!__fnCOPYGLOBALDATA
7506b9f8  75066e19 USER32!__fnDWORD
7506b9fc  750699f4 USER32!__fnNCDESTROY
7506ba00  7508b8fa USER32!__fnDWORDOPTINLPMSG
7506ba04  750af30a USER32!__fnINOUTDRAG
7506ba08  75071f46 USER32!__fnGETTEXTLENGTHS
7506ba0c  750af6ee USER32!__fnINCNTOUTSTRING
7506ba10  750af7a1 USER32!__fnINCNTOUTSTRINGNULL
7506ba14  750af539 USER32!__fnINLPCOMPAREITEMSTRUCT
7506ba18  7506a6d8 USER32!__fnINLPCREATESTRUCT
7506ba1c  750af582 USER32!__fnINLPDELETEITEMSTRUCT
7506ba20  7507981e USER32!__fnINLPDRAWITEMSTRUCT
7506ba24  750af626 USER32!__fnINLPHELPINFOSTRUCT
7506ba28  750af5cb USER32!__fnINLPHLPSTRUCT
7506ba2c  750af356 USER32!__fnINLPMDICREATESTRUCT
7506ba30  750798a4 USER32!__fnINOUTLPMEASUREITEMSTRUCT
7506ba34  75068f7b USER32!__fnINLPWINDOWPOS
7506ba38  75068aab USER32!__fnINOUTLPPOINT5
7506ba3c  75078759 USER32!__fnINOUTLPSCROLLINFO
7506ba40  7508efda USER32!__fnINOUTLPRECT
7506ba44  750685e8 USER32!__fnINOUTNCCALCSIZE
7506ba48  75068edb USER32!__fnINOUTLPWINDOWPOS
7506ba4c  750af3b2 USER32!__fnINPAINTCLIPBRD
7506ba50  750af426 USER32!__fnINSIZECLIPBRD
7506ba54  750af499 USER32!__fnINDESTROYCLIPBRD
7506ba58  7508bf58 USER32!__fnINSTRING
7506ba5c  7508f11c USER32!__fnINSTRINGNULL
7506ba60  7508c4c1 USER32!__fnINDEVICECHANGE
7506ba64  7508dce4 USER32!__fnPOWERBROADCAST
7506ba68  750af94a USER32!__fnINOUTNEXTMENU
7506ba6c  750af16a USER32!__fnOPTOUTLPDWORDOPTOUTLPDWORD
7506ba70  750af0cb USER32!__fnOUTDWORDDWORD
7506ba74  750af11b USER32!__fnOUTDWORDINDWORD
7506ba78  750af4ea USER32!__fnOUTLPRECT
7506ba7c  75071e6f USER32!__fnOUTSTRING
7506ba80  750af8ef USER32!__fnPOPTINLPUINT
7506ba84  750af848 USER32!__fnPOUTLPINT
7506ba88  750af295 USER32!__fnSENTDDEMSG
7506ba8c  7507341c USER32!__fnINOUTSTYLECHANGE
7506ba90  7506810b USER32!__fnHkINDWORD
7506ba94  7507b224 USER32!__fnHkINLPCBTACTIVATESTRUCT
7506ba98  750783a7 USER32!__fnHkINLPCBTCREATESTRUCT
7506ba9c  750afa68 USER32!__fnHkINLPDEBUGHOOKSTRUCT
7506baa0  75072bd4 USER32!__fnHkINLPMOUSEHOOKSTRUCTEX
7506baa4  750af9dc USER32!__fnHkINLPKBDLLHOOKSTRUCT
7506baa8  750afa22 USER32!__fnHkINLPMSLLHOOKSTRUCT
7506baac  75068b52 USER32!__fnHkINLPMSG
7506bab0  750af996 USER32!__fnHkINLPRECT
7506bab4  750b06f9 USER32!__fnHkOPTINLPEVENTMSG
7506bab8  7507ffcd USER32!__ClientCopyDDEIn1
7506babc  750800a9 USER32!__ClientCopyDDEIn2
7506bac0  750801fb USER32!__ClientCopyDDEOut1
7506bac4  75080118 USER32!__ClientCopyDDEOut2
7506bac8  7506e889 USER32!__ClientCopyImage
7506bacc  750afdcc USER32!__ClientEventCallback
7506bad0  750afe63 USER32!__ClientFindMnemChar
7506bad4  750afd50 USER32!__ClientFreeDDEHandle
7506bad8  75072eab USER32!__ClientFreeLibrary
7506badc  750afd08 USER32!__ClientGetCharsetInfo
7506bae0  750afd8e USER32!__ClientGetDDEFlags
7506bae4  750afe1d USER32!__ClientGetDDEHookData
7506bae8  750afbcb USER32!__ClientGetListboxString
7506baec  750afc77 USER32!__ClientGetMessageMPH
7506baf0  750afab6 USER32!__ClientLoadImage
7506baf4  7506aa64 USER32!__ClientLoadLibrary
7506baf8  750743bc USER32!__ClientLoadMenu
7506bafc  750b00f8 USER32!__ClientLoadLocalT1Fonts
7506bb00  750afebc USER32!__ClientPSMTextOut
7506bb04  750aff63 USER32!__ClientLpkDrawTextEx
7506bb08  750affce USER32!__ClientExtTextOutW
7506bb0c  750b003a USER32!__ClientGetTextExtentPointW
7506bb10  7508c5cc USER32!__ClientCharToWchar
7506bb14  750b0099 USER32!__ClientAddFontResourceW
7506bb18  75069d7d USER32!__ClientThreadSetup
7506bb1c  750b01d4 USER32!__ClientDeliverUserApc
7506bb20  750b016c USER32!__ClientNoMemoryPopup
7506bb24  750744d7 USER32!__ClientMonitorEnumProc
7506bb28  750733d1 USER32!__ClientCallWinEventProc
7506bb2c  750afcc9 USER32!__ClientWaitMessageExMPH
7506bb30  75070d56 USER32!__ClientWOWGetProcModule
7506bb34  750b0384 USER32!__ClientWOWTask16SchedNotify
7506bb38  750b01e7 USER32!__ClientImmLoadLayout
7506bb3c  7508d5bf USER32!__ClientImmProcessKey
7506bb40  750b0256 USER32!__fnIMECONTROL
7506bb44  750b060d USER32!__fnINWPARAMDBCSCHAR
7506bb48  75071f46 USER32!__fnGETTEXTLENGTHS
7506bb4c  750af681 USER32!__fnINLPKDRAWSWITCHWND
7506bb50  750b03cd USER32!__ClientLoadStringW
7506bb54  750bd941 USER32!__ClientLoadOLE
7506bb58  750bd7bd USER32!__ClientRegisterDragDrop
7506bb5c  750bd803 USER32!__ClientRevokeDragDrop
7506bb60  750b0335 USER32!__fnINOUTMENUGETOBJECT
7506bb64  750b0110 USER32!__ClientPrinterThunk
7506bb68  7508d48b USER32!__fnOUTLPCOMBOBOXINFO
7506bb6c  750b0475 USER32!__fnOUTLPSCROLLBARINFO
7506bb70  75075d80 USER32!__fnINLPUAHDRAWMENU
7506bb74  75075d20 USER32!__fnINLPUAHDRAWMENUITEM
7506bb78  75075cd4 USER32!__fnINLPUAHINITMENU
7506bb7c  75075ece USER32!__fnINOUTLPUAHMEASUREMENUITEM
7506bb80  7508c2ee USER32!__fnINLPUAHNCPAINTMENUPOPUP
7506bb84  750757d1 USER32!__fnOUTLPTITLEBARINFOEX
7506bb88  750b04f4 USER32!__fnTOUCH
7506bb8c  750b0553 USER32!__fnGESTURE
7506bb90  750b05b2 USER32!__fnINPGESTURENOTIFYSTRUCT

至于为什么,看看上面的代码就明白了,老V这篇写的不详细,我很想扩充来写一下
2014-4-21 16:59
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
u can u up ,gogogo
2014-4-21 19:09
0
雪    币: 421
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
先膜拜各位大牛 话说以前通过R3回调 能够搞QQ密码 后来被TX搞了 不知道有没有这回事
2014-4-21 19:33
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
20
相关
http://bbs.pediy.com/showthread.php?t=105107
http://hi.baidu.com/_achillis/item/3b18870870961a143b53ee02
2014-4-22 09:22
0
雪    币: 35
活跃值: (96)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不明觉厉
2014-4-22 10:35
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
佩服这种死士精神
2014-4-22 15:28
0
雪    币: 220
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
下一步是不是要把DLL数组化,然后在RING0中运行?
2014-4-22 20:27
0
雪    币: 438
活跃值: (93)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
哏。。。。
2014-4-23 21:38
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
25
mark~
2014-4-23 21:40
0
游客
登录 | 注册 方可回帖
返回
//