⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_30309.htm

📁 vc
💻 HTM
字号:
<p>
序号:30309 发表者:XiaoQi 发表日期:2003-02-21 19:23:14
<br>主题:???#pragma pack(....)的作用
<br>内容:有一防火墙源程序,有如下代码。我在MSDN中查#pragma pack(n),<BR>#pragma pack(push),#pragma pack(pop)的用法,说明让人费解。查了好多英文网站的资料,还是弄不明的。小弟不得以,打扰各位高人了,谢谢!!!<BR>#pragma pack(push)<BR>#pragma pack(1)<BR>typedef struct _HOOK_CONTEXT_STRUCT<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//runtime code<BR>&nbsp;&nbsp;&nbsp;&nbsp;ubyte&nbsp;&nbsp;&nbsp;&nbsp;code1_0x58; //0x58 | pop&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| pop caller IP from stack to eax<BR>&nbsp;&nbsp;&nbsp;&nbsp;ubyte&nbsp;&nbsp;&nbsp;&nbsp;code2_0x68; //0x68 | push IMM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| push our hook context address<BR>&nbsp;&nbsp;&nbsp;&nbsp;struct _HOOK_CONTEXT_STRUCT *m_pHookContext;//point this <BR>&nbsp;&nbsp;&nbsp;&nbsp;ubyte&nbsp;&nbsp;&nbsp;&nbsp;code3_0x50; //0x50 | push eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| push caller IP from eax to stack <BR>&nbsp;&nbsp;&nbsp;&nbsp;ubyte&nbsp;&nbsp;&nbsp;&nbsp;code4_0xE9; //0xE9 | jmp HookProc&nbsp;&nbsp;| jump our hook proc<BR>&nbsp;&nbsp;&nbsp;&nbsp;udword&nbsp;&nbsp; m_pHookProcOffset;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//our context data<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;&nbsp;&nbsp;&nbsp;m_pOriginalProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;&nbsp;&nbsp;&nbsp;m_pHookProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;&nbsp;&nbsp;&nbsp;m_pBindAdaptHandle;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;&nbsp;&nbsp;&nbsp;m_pProtocolContent;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;&nbsp; *m_ppOriginPtr;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;struct _HOOK_CONTEXT_STRUCT *m_pHookNext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>}HOOK_CONTEXT_STRUCT;<BR>#pragma pack(pop)<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-02-21 19:29:51
<br>内容:如上结构按照一个字节对齐
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-02-21 19:41:19
<br>内容:// e.g. <BR>// code lines<BR>//<BR><BR>#ifndef __DR0_H__<BR>#define __DR0_H__<BR><BR>// begin<BR>pack(push)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;pack(4) // the following structures between this push/pop pair are<BR>&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp; // aligned by 4 bytes.<BR>&nbsp;&nbsp;<BR>pack(pop)<BR><BR>pack(push)<BR>&nbsp;&nbsp;pack(1) // now , the structures between this push/pop pair<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// are aligned by 1 byte.<BR>&nbsp;&nbsp;...<BR>pack(pop)<BR><BR>#endif<BR>// end 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:XiaoQi 回复日期:2003-02-21 19:42:35
<br>内容:dr0老兄,请问#pragma pack(pop) and #pragma pack(push)??谢谢您的解答!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:XiaoQi 回复日期:2003-02-21 19:50:15
<br>内容:程序中有如下代码:HOOK_CONTEXT_STRUCT *HookNdisFunc(PVOID pHookProc,PVOID *ppOrigProc,PVOID pBindAdaptHandle,PVOID pProtocolContent)<BR>{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;HOOK_CONTEXT_STRUCT *pHookContext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID OrgFunc;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext = IsHookedNdisFunc(ppOrigProc[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( pHookContext )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OrgFunc = pHookContext-&gt;m_pOriginalProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OrgFunc = ppOrigProc[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( OrgFunc == NULL )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext = IsHookedNdisFuncEx(ppOrigProc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( pHookContext )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return pHookContext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext = ExAllocatePoolWithTag(NonPagedPool,sizeof(HOOK_CONTEXT_STRUCT),'HCSP');<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( pHookContext == NULL )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(pHookContext,0,sizeof(HOOK_CONTEXT_STRUCT));<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code1_0x58 = 0x58;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code2_0x68 = 0x68;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code3_0x50 = 0x50;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code4_0xE9 = 0xE9;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pHookContext&nbsp;&nbsp;&nbsp;&nbsp; = pHookContext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pHookProcOffset&nbsp;&nbsp;&nbsp;&nbsp; = ((udword)pHookProc) - (((udword)&amp;pHookContext-&gt;m_pHookProcOffset) + sizeof(udword));<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pBindAdaptHandle = pBindAdaptHandle;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pProtocolContent = pProtocolContent;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pOriginalProc&nbsp;&nbsp;&nbsp;&nbsp;= OrgFunc;//ppOrigProc[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_ppOriginPtr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= ppOrigProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pHookProc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= pHookProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;m_pHookNext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= m_pOurAllOfHookContext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_pOurAllOfHookContext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = pHookContext;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ppOrigProc[0] = pHookContext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return pHookContext;<BR>}<BR><BR>dr0兄:你看以上pHookContext-&gt;code1_0x58 = 0x58;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code2_0x68 = 0x68;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code3_0x50 = 0x50;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code4_0xE9 = 0xE9;<BR>中,ox58等是不是反编译之后,与#pragma pack(push),#pragma pack(pop)有关的Address?? 非常感激您!!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-02-21 19:55:57
<br>内容:compiler 有个 "结构对齐字节"(compiler内部变量) 的栈,#pragma pack(push) 意指当前编译的<BR>代码的结构按照 #pragma pack(push)/(pop) 对之间的pack(n)中的n来对齐<BR>n是2的幂。也就是说把n push到compiler的这个stack上,这样compiler总是用<BR>当前栈顶的n来对其push/pop对中的结构,这样当 pop 之后,当前n就没用了<BR>compiler会用上一个已经push的n来对齐。<BR><BR>你想象一下N0,N1,N2...组成一个stack,Ni和Ni+1之间就是你的代码. <BR>每个Ni都是用push压进,pop退出的,编译器就 按照这个Ni来对齐Ni和Ni+1之间的结构。<BR>自己看看msdn吧
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:dr0 回复日期:2003-02-21 20:01:51
<br>内容:&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code1_0x58 = 0x58;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code2_0x68 = 0x68;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code3_0x50 = 0x50;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pHookContext-&gt;code4_0xE9 = 0xE9;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;都是机器码,作者用pack()push()pop()防止编译器在_HOOK_CONTEXT_STRUCT<BR>&nbsp;&nbsp;&nbsp;&nbsp;中会插入padding data, 以保证指令的正确性。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;慢慢你就知道了。如果去掉这些pack,push,pop,你反汇编一下就知道<BR>&nbsp;&nbsp;&nbsp;&nbsp;了,上述的机器吗就不连续了.<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:XiaoQi 回复日期:2003-02-21 20:05:02
<br>内容:我了解了!<BR>dr0 sir:thanks!! 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-02-21 20:05:17
<br>内容:ox58等是不是反编译之后,与#pragma pack(push),#pragma pack(pop)有关的Address?? <BR>// 不是。pack,push,pop 都可以认为是编译器的内部设置,和地质没关系.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:蛤蛤 回复日期:2003-02-21 20:12:37
<br>内容:编译器缺省是按偶数对齐呢? 还是按整型长度对齐? //忘了, 嘿嘿, 俺原来是知道地!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-02-21 20:20:59
<br>内容:一定要是2的幂,VC缺省是8
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:XiaoQi 回复日期:2003-02-21 20:23:02
<br>内容:hunhun: you see (source to http://www.pdc.kth.se/doc/SP/manuals/ibmcxx-3.6.6/html/language/ref/rnpgpack.htm)<BR><BR> By default, structures and unions are aligned on 4 bytes on OS/2.<BR> By default, structures and unions are aligned on 8 bytes on Windows.<BR>The IBM C and C++ Compilers also lets you use the compiler options:<BR><BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:蛤蛤 回复日期:2003-02-21 20:29:48
<br>内容:I not saw it, before i see U! 3x!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:无形 回复日期:2003-02-22 10:43:53
<br>内容:郁闷,至到了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -