zylc369 发表于 2011-11-8 10:26

申请加入LSG

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。鲜花送上


我的作品目前没能拿出手的,现在主要是模仿和分析别人的代码,以下一段是我分析别人的Hook Api的一段代码,写了详细的注释:
/*
*
对hook的操作
*/
class HookOperations
{
private:

BYTE m_bytOldCode;
// 保存被Hook的机器码

BYTE m_bytNewCode;
// 保存将要替换的机器码

intm_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;

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 =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, &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;

}
};



zylc369 发表于 2011-11-13 10:34

5天了没人理啊
自己顶一下{:301_973:}

9月° 发表于 2011-11-13 14:12

{:1_918:}支持一下。

binqi 发表于 2011-11-13 14:15

支持一下

beni1314 发表于 2011-11-20 23:20

看似是点难度,支持你一下

boolean 发表于 2011-11-21 16:12

支持下 楼主。哈哈哈哈

zylc369 发表于 2011-11-25 15:32

谢谢各位的支持
再顶一下,以防沉底

zylc369 发表于 2011-11-29 11:13

本帖最后由 zylc369 于 2011-11-29 11:17 编辑

再顶一下哥哥姐姐们,我这快点处理吧{:301_980:},快一个月了都http://www.52pojie.cn/static/image/smiley/default/9.gif

nioupan 发表于 2011-12-3 10:35

支持楼主,希望LZ早日成功咯……

zylc369 发表于 2011-12-15 12:00

淡顶
页: [1] 2
查看完整版本: 申请加入LSG