能力值:
( LV13,RANK:240 )
|
-
-
2 楼
自己拿本汇编的书多看看。问一下,人家告诉你一下。人家这么告诉你,你问题不还是一堆??
同时你这个模式是DEBUG模式,调成RELEASE模式汇编代码会更加简洁易懂
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
你这是debug模式啊,前后到处都是没有用的代码啊。。。你先改成release再看汇编呗。。。
你的那句汇编,他的前面都是DEBUG模式下编译器生成的堆栈代码,为的就是在你的堆栈里面填充0xCC个0xCC。
0xCC这个数值翻译成汇编指令就是int 3,是个单步中断指令。
你的那句汇编,他后面的是平衡堆栈代码,前面使用了0xCC个堆栈,后面自然要调整ESP回复原状。后面的那个 CheckEsp是编译器运行时库的函数,debug模式就会有这样的奇怪代码出现。。。
你看这些都没有用,因为真正的程序你去逆向的时候都不会有这种东西的。。。
另外就是你这个main函数既没有返回值也没有参数,你想通过他来观看参数传递压栈的流程,是不是有点搞笑了。。
至于你说的压栈和出栈的规则,栈嘛,自然是后入先出呗。。。还能有什么规则。。。
在就和楼上的说的一样,自己多看书,这种很基础的知识是必须自己一点一点学的,靠着提问是问不清楚的。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
004113A0 push ebp
004113A1 mov ebp,esp 上面两句主要是为用EBP读参数做准备,也是为程序运行完毕后恢复堆栈做准备,ESP会随时改变,所以才会用EBP做为读取函数参数的指针
004113A3 sub esp,0CCh 留出局部变量空间
004113A9 push ebx
004113AA push esi
004113AB push edi 和你看到的一样,保存寄存器,防止函数里面破坏这些数据
004113AC lea edi,[ebp-0CCh] EBP-0CCH其实就是局部变量的地址,这是在做什么?我也是菜鸟,不懂
004113B2 mov ecx,33h
004113B7 mov eax,0CCCCCCCCh
004113BC rep stos dword ptr es:[edi] 这3句我也不懂,我想也不会影响什么
int i;
_asm
{
MOV i,0x123456
004113BE mov dword ptr [i],123456h
}
}
004113C5 pop edi
004113C6 pop esi
004113C7 pop ebx 和上面的PUSH对应,其实不恢复也没什么,只要函数里不改变这些寄存器就没事,程序能不能平衡堆栈主要看下面MOV ESP,EBP和POP EBP
004113C8 add esp,0CCh 清除局部变量地址,其实也没真正的清除,就是把指针移动一下而已,不做这步也行,反正后面有MOV ESP,EBP呢
004113CE cmp ebp,esp
004113D0 call @ILT+310(__RTC_CheckEsp) (41113Bh) 这是做什么?估计是C语言怕EBP被改变而造成程序真的不能正确返回而做的检测吧
004113D5 mov esp,ebp
004113D7 pop ebp 这两句才是真正保证程序堆栈平衡的关键,配合开始两句使用,如果你不想让程序正确返回只要把EBP的值改乱就行了
004113D8 ret
我也不懂的是INT I;是4字节的变量啊,为什么申请0CCH空间大小?
|
|
|