奇怪的死循环

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{
int i;
int a[10];
for(i=0;i<=10;++i)
{
a[i]=0;
printf("%d\n",a[i]);
}
return 0;
}

该程序对应的汇编代码见如下代码:

大小端法互换

1.以int32类型为例:

  • 方法1:
1
2
3
4
5
6
7
8
9
10
11
12
13
void swapInt(int *rhs)
{
unsigned char *p=rhs;
unsigned char temp;
temp=p[0];
p[0]=[1];
p[1]=temp;
temp=p[1];
p[1]=[2];
p[2]=temp;
return ;
}
  • 方法2:
1
2
3
4
5
void swapInt(int *rhs)
{
*rhs=(((*rhs)&0xff000000)>>24) | (((*rhs)&0x00ff0000)>>8) \
| (((*rhs)&0x000000ff)<<24) | (((*rhs)&0x0000ff00)<<8);
}

2.检测机器字节序:大端法or小端法

  • 方法1:
1
2
3
4
5
6
int checkEndian()//检查主机字节顺序是否是大端法,如果是,返回1,否则返回0.
{
int i=0x12345678;
unsigned char *p=&i;
return (0x12==p[0]);
}
  • 方法2:
1
2
3
4
5
6
7
8
9
int checkEndian()
{
union{
unsigned int i;
unsigned char s[4];
}c;
c.i=0x12345678;
return (0x12==c.s[0]);
}

MFC thunk技术模拟

//参考http://www.cnblogs.com/satng/archive/2010/12/30/2138833.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<iostream>
using namespace std;
//thunk技术模拟
typedef void (*fun)(void *,int i);
class CFun;//类声明。
#pragma pack(push)
#pragma pack(1)
typedef struct Thunk{
unsigned char call;
int offset;
fun pf;//函数指针。
unsigned char code[5];
CFun *ths;//this指针。
unsigned char jmp;
unsigned char ecx;
}Thunk;
#pragma pack(pop)
#define OFF(s,m) ((unsigned int)&((s*)0)->m)//求结构体的偏移量,s为结构体的类型,m为结构体的数据成员。
class CFun{
public:
CFun()
{
createThunk();
}
~CFun()
{
delete thunk;
}
public:
void createThunk()
{
Thunk* tk=new Thunk;
//call des
tk->call=0xE8;//call
tk->offset=OFF(Thunk,code[0])-OFF(Thunk,pf);//des
tk->pf=CFun::funx;//函数地址。
//pop ecx
//等价于:
//mov ecx,[esp]
//sub esp,4
tk->code[0]=0x59;//pop ecx
//mov [esp+4],this
tk->code[1]=0xc7;//mov
tk->code[2]=0x44;//dword ptr
//4[esp]
tk->code[3]=0x24;//[esp]
tk->code[4]=0x04;//+4
tk->ths=this;//修改栈,设置this指针。
//jmp [ecx]
tk->jmp=0xFF;//jmp
tk->ecx=0x21;//[ecx]
thunk=(fun)tk;
return ;
}
static void funx(void *pFun,int i)
{
CFun *pf=(CFun*)pFun;
pf->print(i);
}
void print(int i )
{
cout<<"Recevie="<<i<<endl;
}
fun GetThunk()
{
return thunk;
}
private:
fun thunk;
};
int main()
{
CFun cf;
fun pf=cf.GetThunk();
pf("Hello",123);
return 0;
}

24 bits解析为有符号整数

最近遇到了24bits来解析为有符号整数的问题,提供如下两个解决思路:

方法1:

24bits即从高位到低位为:buf[0],buf[1],buf[2] 三个bytes;通过将最高字节buf[0]符号扩展为两个字节(假设从高位到低位为ps[1],ps[0]),然后将ps[1],ps[0],buf[1],buf[2]拼接为int变量的四个字节;见下图;
pic1