好友
阅读权限10
听众
最后登录1970-1-1
|
ID:zylc369邮箱:873542509@qq.com
是否阅读LSG制度并决定遵守(是/否):是
专长领域:
我学的东西比较杂,我的专长在Win32 Api。
我目前还是学生,除了学校上的课程,还自学Win底层知识。
技术方向:学校教java,C#,HTML+CSS,javascript。自学了C/C++,
ASM。
主要看的书有:
Windows程序设计,王爽的汇编语言,INTEL汇编语言程序设计第5版。正在看windows核心编程。了解一些驱动编程,目前主攻Win内核方向。
对于系统底层知识有浓厚的兴趣。
个人的自学,特别是自学系统底层的道路是孤寂的,所以希望加入LSG这个大家庭。和大家一起探讨一起提高,学习前辈们的经验,更重要的是有人气,不自己一个人窝在家里闭门造车。我特别喜欢吾爱破解这个论坛,刚开始这个论坛的背景是彩虹,现在的背景火红的秋天,阳光和热情是我对吾爱破解的第一印象,论坛里大家探讨也非常的积极,我很喜欢(可能是因为我是宅男吧,喜欢热闹~~)
我也相信LSG大家庭也是和睦和技术气氛浓厚的,希望各位大虾、牛人可以接纳让我融入LSG。鲜花送上[s:55]
我的作品目前没能拿出手的,现在主要是模仿和分析别人的代码,以下一段是我分析别人的Hook Api的一段代码,写了详细的注释:
/*
*
对hook的操作
*/
class HookOperations
{
private:
BYTE m_bytOldCode[5];
// 保存被Hook的机器码
BYTE m_bytNewCode[5];
// 保存将要替换的机器码
int m_iFunAddr;
// 保存指定DLL中的指定函数的地址
BOOL setCodeBeOK;
// 保存是否被成功hook
public:
// 设置hook Api的跳转代码
BOOL SetHookApiJmpCode(TCHAR* szDllName, TCHAR* szFunName, int iFunAddr)
{
setCodeBeOK = FALSE;
// 这个值保存设置代码是否成功
int iJmpAddr = 0;
// 将要跳转到的地址
HMODULE hModule = GetModuleHandle(szDllName);
// 获得DLL模块句柄
if (NULL == hModule)
// 如果获得失败
return FALSE;
char buf[256];
wcstombs(buf, szFunName, sizeof(buf));
m_iFunAddr = (int)GetProcAddress(hModule, buf);
// 获得指定模块中的函数地址
if (NULL == m_iFunAddr)
// 如果获得失败
return FALSE;
// 保存旧的机器码的前5个字节,以供以后恢复使用
CopyMemory(m_bytOldCode, (const void *)m_iFunAddr, 5);
m_bytNewCode[0] =0xE9;
// 0xE9是汇编代码中的jmp
// 计算出将要跳转到的地址。
// 这里减5,是因为这5个字节要写入跳转汇编指令jmp XXX。因为跳转指令的实质是移动一个偏移地址。即,jmp后一条指令和跳转目的地地址之间的差值。
// m_iFunAddr保存的是系统API函数的地址。iFunAddr保存的是我自己写的函数的地址。5代表了我的jmp XXX指令要占5个字节,这是我人为分配的。
// iFunAddr减去jmp指令所在地址m_iFunAddr,再减去其占用的5个字节,就是jmp指令的下一条指令的地址
iJmpAddr = iFunAddr - m_iFunAddr-5;
// 组成新的机器码:jmp &iJmpAddr(这是伪码),这条汇编占用了5个字节
// 为什么要占5个字节哪?因为,jmp的机器码是E9(我调试用汇编写出的程序和控制台程序,jmp的机器码有FF25、EB,所以要看具体情况,这应该和长跳和短跳有关,有兴趣的可以具体试验下)
// jmp 后面跟了一个32位的地址偏移!一个字节的jmp机器码,4个字节的地址,加起来就要占用5个字节!
CopyMemory(&m_bytNewCode[1], &iJmpAddr, 4);
setCodeBeOK = TRUE;
// 设置代码成功
HookApi(TRUE);
return TRUE;
}
/********************************************
* 安装/卸载 Api hook
*
* TRUE=安装, FALSE=卸载
*
* 必须先调用SetHookApiJmpCode设置跳转代码!!!
*
*******************************************/
BOOL HookApi(BOOL bIsHook)
{
DWORD oldACC,newACC;
// 保存新旧保护值
if (!setCodeBeOK)
// 如果设置代码没有成功
return FALSE;
if (bIsHook)
// 如果启用
{
// 参数1:指向要变更保护属性的内存基址。这里是一个系统API代码的开始地址。
// 参数2:VirtualProtect函数只做用于前五个字节
// 参数3:代码页PAGE_WRITECOPY(我的理解是可写)
// 参数4:保存旧的保护值
VirtualProtect((LPVOID)m_iFunAddr, 5, PAGE_WRITECOPY, &oldACC);
// 向指定地址写入新的机器码。
// 这里是把一个系统API的前5个字节替换成了jmp XXX,让程序执行到此处时,跳转到我们自己的代码区域
// 这就等于hook了这个系统API函数
CopyMemory((void *)m_iFunAddr, m_bytNewCode, 5);
// 恢复原始的保护值
VirtualProtect((LPVOID)m_iFunAddr, 5, oldACC, &newACC);
}
else
// 如果禁用
{
// 恢复被hook掉的5个字节的代码,那些代码保存在m_bytOldCode
// 1.先设置可写。2.然后写入旧代码。3.恢复保护值
VirtualProtect((LPVOID)m_iFunAddr, 5, PAGE_WRITECOPY, &oldACC);
CopyMemory((void *)m_iFunAddr, m_bytOldCode, 5);
VirtualProtect((LPVOID)m_iFunAddr, 5, oldACC, &newACC);
}
return TRUE;
}
};
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|