首页
社区
课程
招聘
[求助] 新手 CreateFileW inline hook 程序总是奔溃,请前辈大神们指点。
发表于: 2018-5-13 21:55 3622

[求助] 新手 CreateFileW inline hook 程序总是奔溃,请前辈大神们指点。

2018-5-13 21:55
3622
小弟资质愚钝, 折腾了好几天,CreateFileW inline hook 总是奔溃,请前辈大神们提点。 
系统:win10 64bit
程序:32bit
代码如下:
  
_declspec (naked) void WINAPI create_file(LPCWSTR lpFileName,
	DWORD dwDesiredAccess,
	DWORD dwShareMode,
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDisposition,
	DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
	_asm
	{
		nop
		nop
		nop
		nop
		nop
	}
	_asm
	{
		nop
		nop
		nop
		nop
		nop
	}
}

void hook_create_file_w()
{
	DWORD flag, flag2;
	BYTE old_code[5];
	BYTE jmp_in[] = { 0xe9, 0, 0, 0, 0 };
	BYTE jmp_out[] = { 0xe9, 0, 0, 0, 0 };
	g_old_create_file_w = (FARPROC)GetProcAddress(GetModuleHandleA("kernel32"), "CreateFileW");
	*((DWORD*)(jmp_in + 1)) = (DWORD)create_file - (DWORD)g_old_create_file_w - 5;
	*((DWORD*)(jmp_out + 1)) = (DWORD)g_old_create_file_w - (DWORD)create_file - 5;

	VirtualProtectEx(GetCurrentProcess(), g_old_create_file_w, 5, PAGE_EXECUTE_READWRITE, &flag);
	memcpy(old_code, g_old_create_file_w, 5);
	WriteProcessMemory(GetCurrentProcess(), g_old_create_file_w, jmp_in, 5, NULL);
	VirtualProtectEx(GetCurrentProcess(), g_old_create_file_w, 5, flag, &flag);

	VirtualProtectEx(GetCurrentProcess(), create_file, 10, PAGE_EXECUTE_READWRITE, &flag2);
	WriteProcessMemory(GetCurrentProcess(), create_file, old_code, 5, NULL);
	WriteProcessMemory(GetCurrentProcess(), (void*)((DWORD)create_file+5), jmp_out, 5, NULL);
	VirtualProtectEx(GetCurrentProcess(), create_file, 10, flag2, &flag2);
}


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

最后于 2018-5-13 22:02 被shithappen编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 6314
活跃值: (952)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你GetProcAddress得到的地址可能是一个跳转地址
这种问题调试看一下就知道了
2018-5-13 23:39
0
雪    币: 7519
活跃值: (5357)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
_declspec  (naked)裸函数,要自己写返回  ret  0x1C,或者把_declspec  (naked),函数里面就可以什么都不做了
2018-5-14 00:56
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
解决方案如楼上所述,崩溃的原因是栈不平衡.stdcall需要被调用者平衡栈
2018-5-14 09:19
0
雪    币: 2058
活跃值: (1626)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
W7  X64测试正常。HOOK  时,可用  OD  什么的调试工具,跟一下。
2018-5-14 09:20
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
1、detours了解一下?
2、_declspec  (naked)是想干吗
3、void  WINAPI  create_file是什么鬼,CreateFileW返回值不是BOOL
最后于 2018-5-14 09:38 被hzqst编辑 ,原因:
2018-5-14 09:37
0
雪    币: 746
活跃值: (3395)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
7
代码看着基本没有问题。
二楼说的有道理。五楼的解决方法值得一试。
我看了一下win10的CreateFileW函数,确实是一个跳转,也许二楼说的就是真相了。
你把代码里的kernel32.dll换成kernelbase.dll试试。
最后于 2018-5-14 11:46 被yeyeshun编辑 ,原因:
2018-5-14 11:24
0
雪    币: 6314
活跃值: (952)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
yeyeshun 代码看着基本没有问题。二楼说的有道理。五楼的解决方法值得一试。我看了一下win10的CreateFileW函数,确实是一个跳转,也许二楼说的就是真相了。你把代码里的kernel32.dll换成kern ...
看来还是有明白人的
崩溃原因跟栈和函数声明什么的感觉没什么关系嘛
换成kernelbase应该就行了
2018-5-14 11:53
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢各位热心指点。学习了很多。
调试了下,此处程序奔溃的直接原因确实是因为从kernel32取到的是一个跳转。
2018-5-14 13:08
0
游客
登录 | 注册 方可回帖
返回
//