i=8; 这是您的本地函数main
这个我是在拆开的指令引用的一
a) mov DWORD PTR [ebp-0x4], 0x8 <-- i local variable
指令b引用my_global_var
b) mov eax, DWORD PTR [ebp+0x8]
在普通函数范围内,所有低于 ebp (ebp-4,ebp-8,ebp-100) 等的地址都是局部变量访问
ebp 以上的所有地址(ebp+8、ebp+1c、ebp + 256)等访问传递给函数的参数或函数外部可见的其他全局变量
发布的 ecx 未定义,您可能没有粘贴推送指令,_htons()也使用 u_short 而不是 int
u_short WSAAPI htons(
_In_ u_short hostshort
);
你应该发布一个带有代码或反汇编的正确查询,任何人都可以轻松重现以获得正确的答案
编译并产生结果的代码如下所示
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
int my_global_var ;
int main()
{
u_short i = 8;
my_global_var = htons(i);
printf("%d\n" , my_global_var);
}
您应该始终在尽可能多的警告下进行编译,并尽可能让编译器进行代码分析以减少缺陷
如果您使用的是 Visual Studio,则应复制此命令行或使用反映项目中这些开关的适当设置
cl /Zi /Od /W4 /analyze:log foo.txt htons.cpp /link /RELEASE
在W4使警告的最高水平/分析:日志foo.txt的做了代码分析,并显示在您的代码有什么可能的缺陷
cat foo.txt
<?xml version="1.0" encoding="UTF-8"?>
<DEFECTS></DEFECTS>
编译并执行这应该产生2048 或 0x800结果
_htons 基本上就是做这个操作
0:000> ?? 8 << 0x8 | 8 >> 0x8
int 0x800
0:000> .enable_long_status 0
0:000> ?? 8 << 0x8 | 8 >> 0x8
int 0n2048
相关反汇编本地/全局变量的范围和内容如下
当前 src 行
0:000> lsa .
6:
7: int main()
8: {
9: u_short i = 8;
> 10: my_global_var = htons(i);
11: printf("%d\n" , my_global_var);
12: }
函数main的反汇编
0:000> uf .
htons!main [c:\xxx\htons.cpp @ 8]:
8 00861000 55 push ebp
8 00861001 8bec mov ebp,esp
8 00861003 51 push ecx
9 00861004 b808000000 mov eax,8
9 00861009 668945fc mov word ptr [ebp-4],ax
10 0086100d 0fb74dfc movzx ecx,word ptr [ebp-4]
10 00861011 51 push ecx
10 00861012 e8b9000000 call htons!htons (008610d0)
10 00861017 0fb7d0 movzx edx,ax
10 0086101a 891578488a00 mov dword ptr [htons!my_global_var (008a4878)],edx
11 00861020 a178488a00 mov eax,dword ptr [htons!my_global_var (008a4878)]
11 00861025 50 push eax
11 00861026 68b0b18900 push offset htons!__xt_z+0x10 (0089b1b0)
11 0086102b e860000000 call htons!printf (00861090)
11 00861030 83c408 add esp,8
12 00861033 33c0 xor eax,eax
12 00861035 8be5 mov esp,ebp
12 00861037 5d pop ebp
12 00861038 c3 ret
本地我
0:000> dv /v /t
0016fc10 unsigned short i = 8
全球的
0:000> dt /v /t my_global_var
Got address 008a4878 for symbol
htons!my_global_var
0n0