-
-
[旧帖] [原创]一个c程序的始末(带嵌套) 0.00雪花
-
发表于: 2015-5-6 21:40 1343
-
int CumulativeHundred1(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j);
int CumulativeHundred7(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred1 (a+20,b+20, c+20,d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +g+h+i+j + ((a<<1)+10+(b<<1)+10+(c<<1) +10+(d<<1) +10
+(e<<1) +10+(f<<1)+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred6(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred7(a+20,b+20, c+20,d+20, e+20,f+20, g+20,h+20,i+20,j+20);
sum = stub +f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+ (d<<1)
+10 +(e<<1)+10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred5(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred6(a+20,b+20, c+20, d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +e+f+g+h+i+j + ((a<<1)+10+(b<<1) +10+(c<<1)+ 10+(d<<1)
+10 +e+10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred4(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred5(a+20,b+20,c+20, d+20,e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +d+e+f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+d+
10+ e+ 10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred3(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0: CumulativeHundred4 (a+20,b+20, c+20,d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +c+d+e+f+g+h+i+j + ((a<<1) +10+ (b<<1) +10+c +10+d +10+e + 10 +f +10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred2(int a,int b,int c,int d,int e, int f, int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0: CumulativeHundred3 (a+20, b+20, c+20, d+20,e+20, f+20,g+20,h+20,i+20,j+20);
sum = stub+b+c+d+e+f+g+h+i+j + ((a<<1) +10 +b +10 +c +10 +d +10 +e +10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred1(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred2(a+20,b+20, c+20, d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +a+b+c+d+e+f+g+h+i+j + (a+10+b+10 +c+10+d +10+e+10 +f+10 +g+10+h+10+i+10+j+10);
return sum;
}
void main()
{
CumulativeHundred1(1,2,3,5,6,7,8,9,10,11);
}
这个是练习移位运算,熟悉C语言的反汇编的
这是我画的内存单元图
0012FC04 0012FC10edi
0012FC08 0esi
0012FC0C 7FFD8000ebx
0012FC10 CC CC CC CC 烫烫
0012FC14 CC CC CC CC 烫烫
0012FC18 CC CC CC CC 烫烫
0012FC1C CC CC CC CC 烫烫
0012FC20 CC CC CC CC 烫烫
0012FC24 CC CC CC CC 烫烫
0012FC28 CC CC CC CC 烫烫
0012FC2C CC CC CC CC 烫烫
0012FC30 CC CC CC CC 烫烫
0012FC34 CC CC CC CC 烫烫
0012FC38 CC CC CC CC 烫烫
0012FC3C CC CC CC CC 烫烫
0012FC40 CC CC CC CC 烫烫
0012FC44 CC CC CC CC 烫烫
0012FC48 CC CC CC CC 烫烫
0012FC4C CC CC CC CC 烫烫
0012FC50 CC CC CC CC 烫烫 00 00 00 00 mov dword ptr [ebp-0Ch],0
0012FC54 CC CC CC CC 烫烫 00 00 00 00 ecx,dword ptr [ebp-0Ch] dword ptr [ebp-8],ecx
0012FC58 CC CC CC CC 烫烫
0012FC5C ebp
0012FC60 eflage
0012FC64 65
0012FC68 66
0012FC6C 67
0012FC70 69
0012FC74 0000006A
0012FC78 0000006B
0012FC7C 0000006C
0012FC80 0000006D
0012FC84 0000006E
0012FC88 0000006F 函数6
0012FC8C 0012FD6Cedi
0012FC90 esi0
0012FC94 7FFD8000ebx
0012FC98 CC CC CC CC 烫烫
0012FC9C CC CC CC CC 烫烫
0012FCA0 CC CC CC CC 烫烫
0012FCA4 CC CC CC CC 烫烫
0012FCA8 CC CC CC CC 烫烫
0012FCAC CC CC CC CC 烫烫
0012FCB0 CC CC CC CC 烫烫
0012FCB4 CC CC CC CC 烫烫
0012FCB8 CC CC CC CC 烫烫
0012FCBC CC CC CC CC 烫烫
0012FCC0 CC CC CC CC 烫烫
0012FCC4 CC CC CC CC 烫烫
0012FCC8 CC CC CC CC 烫烫
0012FCCC CC CC CC CC 烫烫
0012FCD0 CC CC CC CC 烫烫
0012FCD4 CC CC CC CC 烫烫
0012FCD8 CC CC CC CC 烫烫
0012FCDC CC CC CC CC 烫烫
0012FCE0 CC CC CC CC 烫烫
0012FCE4 0012FD6C
0012FCE8 eflage
0012FCEC 51
0012FCF0 52
0012FCF4 53
0012FCF8 55
0012FCFC 56
0012FD00 57
0012FD04 58
0012FD08 59
0012FD0C 0000005A
0012FD10 0000005B 函数5
0012FD14 0012FD14edi
0012FD18 esi0
0012FD1C 7FFD8000ebx
0012FD20 CC CC CC CC 烫烫
0012FD24 CC CC CC CC 烫烫
0012FD28 CC CC CC CC 烫烫
0012FD2C CC CC CC CC 烫烫
0012FD30 CC CC CC CC 烫烫
0012FD34 CC CC CC CC 烫烫
0012FD38 CC CC CC CC 烫烫
0012FD3C CC CC CC CC 烫烫
0012FD40 CC CC CC CC 烫烫
0012FD44 CC CC CC CC 烫烫
0012FD48 CC CC CC CC 烫烫
0012FD4C CC CC CC CC 烫烫
0012FD50 CC CC CC CC 烫烫
0012FD54 CC CC CC CC 烫烫
0012FD58 CC CC CC CC 烫烫
0012FD5C CC CC CC CC 烫烫
0012FD60 CC CC CC CC 烫烫
0012FD64 CC CC CC CC 烫烫
0012FD68 CC CC CC CC 烫烫
0012FD6C 0012fd04ebp
0012FD70 elage
0012FD74 0000003D
0012FD78 0000003E
0012FD7C 0000003F
0012FD80 41
0012FD84 42
0012FD88 43
0012FD8C 44
0012FD90 45
0012FD94 46
0012FD98 47 函数4
0012FD9C 0012FE7C
0012FDA0 0
0012FDA4 7FFD8000
0012FDA8 CC CC CC CC 烫烫
0012FDAC CC CC CC CC 烫烫
0012FDB0 CC CC CC CC 烫烫
0012FDB4 CC CC CC CC 烫烫
0012FDB8 CC CC CC CC 烫烫
0012FDBC CC CC CC CC 烫烫
0012FDC0 CC CC CC CC 烫烫
0012FDC4 CC CC CC CC 烫烫
0012FDC8 CC CC CC CC 烫烫
0012FDCC CC CC CC CC 烫烫
0012FDD0 CC CC CC CC 烫烫
0012FDD4 CC CC CC CC 烫烫
0012FDD8 CC CC CC CC 烫烫
0012FDDC CC CC CC CC 烫烫
0012FDE0 CC CC CC CC 烫烫
0012FDE4 CC CC CC CC 烫烫
0012FDE8 CC CC CC CC 烫烫
0012FDEC CC CC CC CC 烫烫
0012FDF0 CC CC CC CC 烫烫
0012FDF4 0012FE7C
0012FDF8 eflage
0012FDFC 29
0012FE00 0000002A
0012FE04 0000002B
0012FE08 0000002D
0012FE0C 0000002E
0012FE10 0000002F
0012FE14 30
0012FE18 31
0012FE1C 32
0012FE20 33 函数3
0012FE24 0012FF04
0012FE28 0
0012FE2C 7FFD8000
0012FE30 CC CC CC CC 烫烫
0012FE34 CC CC CC CC 烫烫
0012FE38 CC CC CC CC 烫烫
0012FE3C CC CC CC CC 烫烫
0012FE40 CC CC CC CC 烫烫
0012FE44 CC CC CC CC 烫烫
0012FE48 CC CC CC CC 烫烫
0012FE4C CC CC CC CC 烫烫
0012FE50 CC CC CC CC 烫烫
0012FE54 CC CC CC CC 烫烫
0012FE58 CC CC CC CC 烫烫
0012FE5C CC CC CC CC 烫烫
0012FE60 CC CC CC CC 烫烫
0012FE64 CC CC CC CC 烫烫
0012FE68 CC CC CC CC 烫烫
0012FE6C CC CC CC CC 烫烫
0012FE70 CC CC CC CC 烫烫
0012FE74 CC CC CC CC 烫烫
0012FE78 CC CC CC CC 烫烫
0012FE7C 0012FF04
0012FE80 eflage
0012FE84 15
0012FE88 16
0012FE8C 17
0012FE90 19
0012FE94 0000001A
0012FE98 0000001B
0012FE9C 0000001C
0012FEA0 0000001D
0012FEA4 0000001E
0012FEA8 0000001F 函数2
0012FEAC 0012FF80edi
0012FEB0 esi0
0012FEB4 7FFD8000ebx
0012FEB8 CC CC CC CC 烫烫
0012FEBC CC CC CC CC 烫烫
0012FEC0 CC CC CC CC 烫烫
0012FEC4 CC CC CC CC 烫烫
0012FEC8 CC CC CC CC 烫烫
0012FECC CC CC CC CC 烫烫
0012FED0 CC CC CC CC 烫烫
0012FED4 CC CC CC CC 烫烫
0012FED8 CC CC CC CC 烫烫
0012FEDC CC CC CC CC 烫烫
0012FEE0 CC CC CC CC 烫烫
0012FEE4 CC CC CC CC 烫烫
0012FEE8 CC CC CC CC 烫烫
0012FEEC CC CC CC CC 烫烫
0012FEF0 CC CC CC CC 烫烫
0012FEF4 CC CC CC CC 烫烫
0012FEF8 CC CC CC CC 烫烫
0012FEFC CC CC CC CC 烫烫
0012FF00 CC CC CC CC 烫烫
0012FF04 0012FF04ebp
0012FF08 eflage
0012FF0C 01 00 00 00 ....
0012FF10 02 00 00 00 ....
0012FF14 03 00 00 00 ....
0012FF18 05 00 00 00 ....
0012FF1C 06 00 00 00 ....
0012FF20 07 00 00 00 ....
0012FF24 08 00 00 00 ....
0012FF28 09 00 00 00 9
0012FF2C 0A 00 00 00 ....
0012FF30 0B 00 00 00 .... 函数1
0012FF34 0
0012FF38 0
0012FF3C 7FFDD000
0012FF40 CC CC CC CC 烫烫
0012FF44 CC CC CC CC 烫烫
0012FF48 CC CC CC CC 烫烫
0012FF4C CC CC CC CC 烫烫
0012FF50 CC CC CC CC 烫烫
0012FF54 CC CC CC CC 烫烫
0012FF58 CC CC CC CC 烫烫
0012FF5C CC CC CC CC 烫烫
0012FF60 CC CC CC CC 烫烫
0012FF64 CC CC CC CC 烫烫
0012FF68 CC CC CC CC 烫烫
0012FF6C CC CC CC CC 烫烫
0012FF70 CC CC CC CC 烫烫
0012FF74 CC CC CC CC 烫烫
0012FF78 CC CC CC CC 烫烫
0012FF7C CC CC CC CC 烫烫
0012FF80 0012FFC0 void main
0012FF84
过程:
1,将函数的输入值存入内存空间
2.push ebp(保存ebp的原值)
3.esp减去一个数,处于上端,如果设这个值为x
4,push ebx,esi,edi(保存它们的原值)
5, 将edi置为步骤3中的x
6.使用rep stos将其间的全部置为cccccccc
7.如果本函数内有计算出的值存入之前置为cccccccc的内存空间
8.结束的时候,pop edi(还原edi)
pop esi(还原esi)
pop ebx(还原ebx)
将ebp中的值赋给esp,之前存储了esp的值,为下面还原ebp做准备
pop ebp(还原ebp)
顺着内存单元的时候,很简单画内存单元图就可以理解了
逆着的时候(在最后一个引用函数结束之后的汇编)
要结合程序的流程理解
每次先讲上一个结果(eax)存入之前说的cccccccc中
再将其存入这个内存单元下面的内存单元(疑问“不过我还是不明白为什么要保存两份之前的值”疑问)和ecx中,
之后就是计算(略)
18: sum = stub +f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+ (d<<1)+10 +(e<<1)+10+f+10+g+10+h+10+i+10+j+10)
004011FE mov edx,dword ptr [ebp-8] stub
00401201 add edx,dword ptr [ebp+1Ch] f
00401204 add edx,dword ptr [ebp+20h] g
00401207 add edx,dword ptr [ebp+24h] h
0040120A add edx,dword ptr [ebp+28h] i
0040120D add edx,dword ptr [ebp+2Ch] j
00401210 mov eax,dword ptr [ebp+8] a
00401213 mov ecx,dword ptr [ebp+1Ch] f
00401216 lea eax,[ecx+eax*2+0Ah] f+(a<<1)+10
0040121A mov ecx,dword ptr [ebp+0Ch] b
0040121D lea eax,[eax+ecx*2] f+(a<<1)+10+(b<<1)
00401220 mov ecx,dword ptr [ebp+10h] c
00401223 lea eax,[eax+ecx*2+14h] f+(a<<1)+10+(b<<1)+(c<<1)+10+10
00401227 mov ecx,dword ptr [ebp+14h] d
0040122A lea eax,[eax+ecx*2] f+(a<<1)+10+(b<<1)+(c<<1)+10+10+(d<<1)
0040122D mov ecx,dword ptr [ebp+18h] e
00401230 lea eax,[eax+ecx*2+14h] f+(a<<1)+10+(b<<1)+(c<<1)+10+10+(d<<1)+(e<<1)+10+10
00401234 mov ecx,dword ptr [ebp+20h]
00401237 lea eax,[eax+ecx+0Ah] eax = eax+10+f
0040123B mov ecx,dword ptr [ebp+24h]
0040123E lea eax,[eax+ecx+0Ah] eax = eax+10+g
00401242 mov ecx,dword ptr [ebp+28h]
00401245 lea eax,[eax+ecx+0Ah] eax = eax+10+h
00401249 add edx,dword ptr [ebp+2Ch] i
0040124C lea ecx,[eax+edx+14h] eax = eax+i+j+20
这里就是发现C语言移位<<1翻译为汇编时是*2,不是shl,sal。
最后都结束时
我是新手,以上可能有很多不足之处,希望大家能指出,另外帖子中有我的一个疑问希望大家能告诉我是怎么一回事(疑问“不过我还是不明白为什么要保存两份之前的值”疑问),提前说声谢谢
int CumulativeHundred7(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred1 (a+20,b+20, c+20,d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +g+h+i+j + ((a<<1)+10+(b<<1)+10+(c<<1) +10+(d<<1) +10
+(e<<1) +10+(f<<1)+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred6(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred7(a+20,b+20, c+20,d+20, e+20,f+20, g+20,h+20,i+20,j+20);
sum = stub +f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+ (d<<1)
+10 +(e<<1)+10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred5(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred6(a+20,b+20, c+20, d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +e+f+g+h+i+j + ((a<<1)+10+(b<<1) +10+(c<<1)+ 10+(d<<1)
+10 +e+10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred4(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred5(a+20,b+20,c+20, d+20,e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +d+e+f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+d+
10+ e+ 10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred3(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0: CumulativeHundred4 (a+20,b+20, c+20,d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +c+d+e+f+g+h+i+j + ((a<<1) +10+ (b<<1) +10+c +10+d +10+e + 10 +f +10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred2(int a,int b,int c,int d,int e, int f, int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0: CumulativeHundred3 (a+20, b+20, c+20, d+20,e+20, f+20,g+20,h+20,i+20,j+20);
sum = stub+b+c+d+e+f+g+h+i+j + ((a<<1) +10 +b +10 +c +10 +d +10 +e +10+f+10+g+10+h+10+i+10+j+10);
return sum;
}
int CumulativeHundred1(int a,int b,int c,int d,int e, int f,int g,int h,int i,int j)
{
int sum;
int stub;
stub = (a>=90) ? 0:CumulativeHundred2(a+20,b+20, c+20, d+20, e+20, f+20, g+20,h+20,i+20,j+20);
sum = stub +a+b+c+d+e+f+g+h+i+j + (a+10+b+10 +c+10+d +10+e+10 +f+10 +g+10+h+10+i+10+j+10);
return sum;
}
void main()
{
CumulativeHundred1(1,2,3,5,6,7,8,9,10,11);
}
这个是练习移位运算,熟悉C语言的反汇编的
这是我画的内存单元图
0012FC04 0012FC10edi
0012FC08 0esi
0012FC0C 7FFD8000ebx
0012FC10 CC CC CC CC 烫烫
0012FC14 CC CC CC CC 烫烫
0012FC18 CC CC CC CC 烫烫
0012FC1C CC CC CC CC 烫烫
0012FC20 CC CC CC CC 烫烫
0012FC24 CC CC CC CC 烫烫
0012FC28 CC CC CC CC 烫烫
0012FC2C CC CC CC CC 烫烫
0012FC30 CC CC CC CC 烫烫
0012FC34 CC CC CC CC 烫烫
0012FC38 CC CC CC CC 烫烫
0012FC3C CC CC CC CC 烫烫
0012FC40 CC CC CC CC 烫烫
0012FC44 CC CC CC CC 烫烫
0012FC48 CC CC CC CC 烫烫
0012FC4C CC CC CC CC 烫烫
0012FC50 CC CC CC CC 烫烫 00 00 00 00 mov dword ptr [ebp-0Ch],0
0012FC54 CC CC CC CC 烫烫 00 00 00 00 ecx,dword ptr [ebp-0Ch] dword ptr [ebp-8],ecx
0012FC58 CC CC CC CC 烫烫
0012FC5C ebp
0012FC60 eflage
0012FC64 65
0012FC68 66
0012FC6C 67
0012FC70 69
0012FC74 0000006A
0012FC78 0000006B
0012FC7C 0000006C
0012FC80 0000006D
0012FC84 0000006E
0012FC88 0000006F 函数6
0012FC8C 0012FD6Cedi
0012FC90 esi0
0012FC94 7FFD8000ebx
0012FC98 CC CC CC CC 烫烫
0012FC9C CC CC CC CC 烫烫
0012FCA0 CC CC CC CC 烫烫
0012FCA4 CC CC CC CC 烫烫
0012FCA8 CC CC CC CC 烫烫
0012FCAC CC CC CC CC 烫烫
0012FCB0 CC CC CC CC 烫烫
0012FCB4 CC CC CC CC 烫烫
0012FCB8 CC CC CC CC 烫烫
0012FCBC CC CC CC CC 烫烫
0012FCC0 CC CC CC CC 烫烫
0012FCC4 CC CC CC CC 烫烫
0012FCC8 CC CC CC CC 烫烫
0012FCCC CC CC CC CC 烫烫
0012FCD0 CC CC CC CC 烫烫
0012FCD4 CC CC CC CC 烫烫
0012FCD8 CC CC CC CC 烫烫
0012FCDC CC CC CC CC 烫烫
0012FCE0 CC CC CC CC 烫烫
0012FCE4 0012FD6C
0012FCE8 eflage
0012FCEC 51
0012FCF0 52
0012FCF4 53
0012FCF8 55
0012FCFC 56
0012FD00 57
0012FD04 58
0012FD08 59
0012FD0C 0000005A
0012FD10 0000005B 函数5
0012FD14 0012FD14edi
0012FD18 esi0
0012FD1C 7FFD8000ebx
0012FD20 CC CC CC CC 烫烫
0012FD24 CC CC CC CC 烫烫
0012FD28 CC CC CC CC 烫烫
0012FD2C CC CC CC CC 烫烫
0012FD30 CC CC CC CC 烫烫
0012FD34 CC CC CC CC 烫烫
0012FD38 CC CC CC CC 烫烫
0012FD3C CC CC CC CC 烫烫
0012FD40 CC CC CC CC 烫烫
0012FD44 CC CC CC CC 烫烫
0012FD48 CC CC CC CC 烫烫
0012FD4C CC CC CC CC 烫烫
0012FD50 CC CC CC CC 烫烫
0012FD54 CC CC CC CC 烫烫
0012FD58 CC CC CC CC 烫烫
0012FD5C CC CC CC CC 烫烫
0012FD60 CC CC CC CC 烫烫
0012FD64 CC CC CC CC 烫烫
0012FD68 CC CC CC CC 烫烫
0012FD6C 0012fd04ebp
0012FD70 elage
0012FD74 0000003D
0012FD78 0000003E
0012FD7C 0000003F
0012FD80 41
0012FD84 42
0012FD88 43
0012FD8C 44
0012FD90 45
0012FD94 46
0012FD98 47 函数4
0012FD9C 0012FE7C
0012FDA0 0
0012FDA4 7FFD8000
0012FDA8 CC CC CC CC 烫烫
0012FDAC CC CC CC CC 烫烫
0012FDB0 CC CC CC CC 烫烫
0012FDB4 CC CC CC CC 烫烫
0012FDB8 CC CC CC CC 烫烫
0012FDBC CC CC CC CC 烫烫
0012FDC0 CC CC CC CC 烫烫
0012FDC4 CC CC CC CC 烫烫
0012FDC8 CC CC CC CC 烫烫
0012FDCC CC CC CC CC 烫烫
0012FDD0 CC CC CC CC 烫烫
0012FDD4 CC CC CC CC 烫烫
0012FDD8 CC CC CC CC 烫烫
0012FDDC CC CC CC CC 烫烫
0012FDE0 CC CC CC CC 烫烫
0012FDE4 CC CC CC CC 烫烫
0012FDE8 CC CC CC CC 烫烫
0012FDEC CC CC CC CC 烫烫
0012FDF0 CC CC CC CC 烫烫
0012FDF4 0012FE7C
0012FDF8 eflage
0012FDFC 29
0012FE00 0000002A
0012FE04 0000002B
0012FE08 0000002D
0012FE0C 0000002E
0012FE10 0000002F
0012FE14 30
0012FE18 31
0012FE1C 32
0012FE20 33 函数3
0012FE24 0012FF04
0012FE28 0
0012FE2C 7FFD8000
0012FE30 CC CC CC CC 烫烫
0012FE34 CC CC CC CC 烫烫
0012FE38 CC CC CC CC 烫烫
0012FE3C CC CC CC CC 烫烫
0012FE40 CC CC CC CC 烫烫
0012FE44 CC CC CC CC 烫烫
0012FE48 CC CC CC CC 烫烫
0012FE4C CC CC CC CC 烫烫
0012FE50 CC CC CC CC 烫烫
0012FE54 CC CC CC CC 烫烫
0012FE58 CC CC CC CC 烫烫
0012FE5C CC CC CC CC 烫烫
0012FE60 CC CC CC CC 烫烫
0012FE64 CC CC CC CC 烫烫
0012FE68 CC CC CC CC 烫烫
0012FE6C CC CC CC CC 烫烫
0012FE70 CC CC CC CC 烫烫
0012FE74 CC CC CC CC 烫烫
0012FE78 CC CC CC CC 烫烫
0012FE7C 0012FF04
0012FE80 eflage
0012FE84 15
0012FE88 16
0012FE8C 17
0012FE90 19
0012FE94 0000001A
0012FE98 0000001B
0012FE9C 0000001C
0012FEA0 0000001D
0012FEA4 0000001E
0012FEA8 0000001F 函数2
0012FEAC 0012FF80edi
0012FEB0 esi0
0012FEB4 7FFD8000ebx
0012FEB8 CC CC CC CC 烫烫
0012FEBC CC CC CC CC 烫烫
0012FEC0 CC CC CC CC 烫烫
0012FEC4 CC CC CC CC 烫烫
0012FEC8 CC CC CC CC 烫烫
0012FECC CC CC CC CC 烫烫
0012FED0 CC CC CC CC 烫烫
0012FED4 CC CC CC CC 烫烫
0012FED8 CC CC CC CC 烫烫
0012FEDC CC CC CC CC 烫烫
0012FEE0 CC CC CC CC 烫烫
0012FEE4 CC CC CC CC 烫烫
0012FEE8 CC CC CC CC 烫烫
0012FEEC CC CC CC CC 烫烫
0012FEF0 CC CC CC CC 烫烫
0012FEF4 CC CC CC CC 烫烫
0012FEF8 CC CC CC CC 烫烫
0012FEFC CC CC CC CC 烫烫
0012FF00 CC CC CC CC 烫烫
0012FF04 0012FF04ebp
0012FF08 eflage
0012FF0C 01 00 00 00 ....
0012FF10 02 00 00 00 ....
0012FF14 03 00 00 00 ....
0012FF18 05 00 00 00 ....
0012FF1C 06 00 00 00 ....
0012FF20 07 00 00 00 ....
0012FF24 08 00 00 00 ....
0012FF28 09 00 00 00 9
0012FF2C 0A 00 00 00 ....
0012FF30 0B 00 00 00 .... 函数1
0012FF34 0
0012FF38 0
0012FF3C 7FFDD000
0012FF40 CC CC CC CC 烫烫
0012FF44 CC CC CC CC 烫烫
0012FF48 CC CC CC CC 烫烫
0012FF4C CC CC CC CC 烫烫
0012FF50 CC CC CC CC 烫烫
0012FF54 CC CC CC CC 烫烫
0012FF58 CC CC CC CC 烫烫
0012FF5C CC CC CC CC 烫烫
0012FF60 CC CC CC CC 烫烫
0012FF64 CC CC CC CC 烫烫
0012FF68 CC CC CC CC 烫烫
0012FF6C CC CC CC CC 烫烫
0012FF70 CC CC CC CC 烫烫
0012FF74 CC CC CC CC 烫烫
0012FF78 CC CC CC CC 烫烫
0012FF7C CC CC CC CC 烫烫
0012FF80 0012FFC0 void main
0012FF84
过程:
1,将函数的输入值存入内存空间
2.push ebp(保存ebp的原值)
3.esp减去一个数,处于上端,如果设这个值为x
4,push ebx,esi,edi(保存它们的原值)
5, 将edi置为步骤3中的x
6.使用rep stos将其间的全部置为cccccccc
7.如果本函数内有计算出的值存入之前置为cccccccc的内存空间
8.结束的时候,pop edi(还原edi)
pop esi(还原esi)
pop ebx(还原ebx)
将ebp中的值赋给esp,之前存储了esp的值,为下面还原ebp做准备
pop ebp(还原ebp)
顺着内存单元的时候,很简单画内存单元图就可以理解了
逆着的时候(在最后一个引用函数结束之后的汇编)
要结合程序的流程理解
每次先讲上一个结果(eax)存入之前说的cccccccc中
再将其存入这个内存单元下面的内存单元(疑问“不过我还是不明白为什么要保存两份之前的值”疑问)和ecx中,
之后就是计算(略)
18: sum = stub +f+g+h+i+j + ((a<<1)+10+(b<<1)+10+ (c<<1)+10+ (d<<1)+10 +(e<<1)+10+f+10+g+10+h+10+i+10+j+10)
004011FE mov edx,dword ptr [ebp-8] stub
00401201 add edx,dword ptr [ebp+1Ch] f
00401204 add edx,dword ptr [ebp+20h] g
00401207 add edx,dword ptr [ebp+24h] h
0040120A add edx,dword ptr [ebp+28h] i
0040120D add edx,dword ptr [ebp+2Ch] j
00401210 mov eax,dword ptr [ebp+8] a
00401213 mov ecx,dword ptr [ebp+1Ch] f
00401216 lea eax,[ecx+eax*2+0Ah] f+(a<<1)+10
0040121A mov ecx,dword ptr [ebp+0Ch] b
0040121D lea eax,[eax+ecx*2] f+(a<<1)+10+(b<<1)
00401220 mov ecx,dword ptr [ebp+10h] c
00401223 lea eax,[eax+ecx*2+14h] f+(a<<1)+10+(b<<1)+(c<<1)+10+10
00401227 mov ecx,dword ptr [ebp+14h] d
0040122A lea eax,[eax+ecx*2] f+(a<<1)+10+(b<<1)+(c<<1)+10+10+(d<<1)
0040122D mov ecx,dword ptr [ebp+18h] e
00401230 lea eax,[eax+ecx*2+14h] f+(a<<1)+10+(b<<1)+(c<<1)+10+10+(d<<1)+(e<<1)+10+10
00401234 mov ecx,dword ptr [ebp+20h]
00401237 lea eax,[eax+ecx+0Ah] eax = eax+10+f
0040123B mov ecx,dword ptr [ebp+24h]
0040123E lea eax,[eax+ecx+0Ah] eax = eax+10+g
00401242 mov ecx,dword ptr [ebp+28h]
00401245 lea eax,[eax+ecx+0Ah] eax = eax+10+h
00401249 add edx,dword ptr [ebp+2Ch] i
0040124C lea ecx,[eax+edx+14h] eax = eax+i+j+20
这里就是发现C语言移位<<1翻译为汇编时是*2,不是shl,sal。
最后都结束时
我是新手,以上可能有很多不足之处,希望大家能指出,另外帖子中有我的一个疑问希望大家能告诉我是怎么一回事(疑问“不过我还是不明白为什么要保存两份之前的值”疑问),提前说声谢谢
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: