-
-
[原创]菜鸟与你分享汇编与c语言转换
-
发表于:
2013-1-15 08:40
4641
-
一直以来都是从看雪这边索取,现在也应该反馈一点。
本人比较菜,高手请绕道。
本人也是刚刚学习汇编不久,对于汇编调用不是很明白但是看了天书夜读大有启发所以想跟新手分享我的心得。这篇是我第一次写的教程不好还请大家见谅。
因为c语言的main本身就是函数,所以我就从函数讲起
int fuction(int a,int b)
像一个函数调用
基本都是汇编都是一样都是:
1保存ebp(这边就是保存返回地址)一般都是跟return(实际上就是pop ebp)联系。
2保存esp(但是这边一般都是复制到ebp);
3到堆栈中腾出一些空间给变量用,栈顶都是用esp表示,栈是低字节序,就是在堆栈存放一个4字节,esp就减去4;出栈,esp加上4。
4保存ebx,esi,edi到堆栈中,等函数调用完后恢复,
5把局部变量全部初始话位0cccccccch,0cch就是机器码int 3中断,表示局部变量不能被执行,如果执行程序必然出错。
6然后做函数想做的事情就是传递参数,以为c语言是_cdecl调用规则就是从右边到左边到堆栈中所以
esp+12就是第二个参数,esp+8就是第一个参数,esp+4为返回地址。
7做完后恢复各个寄存器变量
下面是一个简单示例:
int fuction(int a,int b)
{
int d=a+b;
int i=1,c=0;
while(c<100)
{
c=c+i;
}
switch(c)
{
case 0:
d=1;
case 1:
d=c;
break;
default:
d=0;
break;
}
return d;
}
int fuction(int a,int b)
{
00412D90 push ebp
00412D91 mov ebp,esp
00412D93 sub esp,0E8h
00412D99 push ebx
00412D9A push esi
00412D9B push edi
00412D9C lea edi,[ebp-0E8h]
00412DA2 mov ecx,3Ah
00412DA7 mov eax,0CCCCCCCCh
00412DAC rep stos dword ptr es:[edi]
int d=a+b;
00412DAE mov eax,dword ptr [a] //这边的a就是esp+8为了大家简单理解把它们替换了
00412DB1 add eax,dword ptr //b就是esp+8
00412DB4 mov dword ptr [d],eax
int i=1,c=0;
00412DB7 mov dword ptr [i],1
00412DBE mov dword ptr [c],0
while(c<100)
00412DC5 cmp dword ptr [c],64h
00412DC9 jge fuction+46h (412DD6h)
{
c=c+i;
00412DCB mov eax,dword ptr [c]
00412DCE add eax,dword ptr [i]
00412DD1 mov dword ptr [c],eax
}
00412DD4 jmp fuction+35h (412DC5h)
switch(c)
00412DD6 mov eax,dword ptr [c]
00412DD9 mov dword ptr [ebp-0E8h],eax
00412DDF cmp dword ptr [ebp-0E8h],0
00412DE6 je fuction+63h (412DF3h)
00412DE8 cmp dword ptr [ebp-0E8h],1
00412DEF je fuction+6Ah (412DFAh)
00412DF1 jmp fuction+72h (412E02h)
{
case 0:
d=1;
00412DF3 mov dword ptr [d],1
case 1:
d=c;
00412DFA mov eax,dword ptr [c]
00412DFD mov dword ptr [d],eax
break;
00412E00 jmp fuction+79h (412E09h)
default:
d=0;
00412E02 mov dword ptr [d],0
break;
}
return d;
00412E09 mov eax,dword ptr [d]
}
00412E0C pop edi
00412E0D pop esi
00412E0E pop ebx
00412E0F mov esp,ebp
00412E11 pop ebp
00412E12 ret
是不是看起来头没有那么大呢?
假如还是的话,,,,那我也没有办法了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)