能力值:
( LV5,RANK:65 )
|
-
-
2 楼
32位下,常规操做下,是可以这样理解,但是这个并不是绝对的
|
能力值:
( LV12,RANK:300 )
|
-
-
3 楼
请摒弃局部变量这种说法,在汇编中所有的“变量”不过是栈中的一个数值而已(也有一些情况下是在堆中),只不过这次压入的是从EBP(栈底指针)向上数第x个位置的数值或是这个值指向的另外一个值
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
gamehack
32位下,常规操做下,是可以这样理解,但是这个并不是绝对的
谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
pureGavin
请摒弃局部变量这种说法,在汇编中所有的“变量”不过是栈中的一个数值而已(也有一些情况下是在堆中),只不过这次压入的是从EBP(栈底指针)向上数第x个位置的数值或是这个值指向的另外一个值
无论是 [ebp+0xC] 还是 [ebp-0xC] 不要刻意去 区分 是 外部传入的参数 还是内部临时申请的局部变量, 都把它看成是一个内存地址 对吗
但是我区分是为了更好的 读懂反汇编。。都简单的理解为内存地址,理解起来会比较晦涩啊
最后于 2020-3-31 14:00
被TX杀手编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
常规是这么理解,不过还有根据esp寻址的,所以说不准
|
能力值:
( LV5,RANK:65 )
|
-
-
7 楼
一般程序内的变量,局部变量在寄存器或栈,全局变量在.data段或.bss段, 然后栈中参数传递的时候会涉及到栈帧的概念,了解下会比较好理解这个吧, 对于函数调用的传参,一般32位是压栈,64位寄存器多会使用六个寄存器,再多余的才会使用栈, 32位,函数调用先压栈传参,然后call的时候会把返回地址压栈,进入函数运行,函数开头那几个`push ebp; mov ebp,esp;`就保存原ebp,ebp指向被调用这个函数的栈帧栈底,后面`sub esp,xxx`就吧栈顶拉高,形成了一个栈帧空间了,其内的位置就是储存一些这个函数内的局部变量了,这样找个图看看或者调下标一标就发现,ebp后面的都是原来压入栈的参数,为加号,局部变量就是栈帧内部了,是减号,(这个地方要注意栈是逆向生长的哦),大致意思是如此, ida中就使用负数标记,一般使用`var_`前缀就是变量,`arg_`前缀就是参数,然后使用[ebp+var_xx]/[ebp+arg_xx]这样,还有记录esp偏移,用[esp+xx+var_xx]/[esp+xx+arg_xx]的情况,其实是一个道理,这里esp+xx和ebp应该是一致指向栈底。可以看看ida里一般一个函数前面会标注,var_xx 是负数多少,arg_xx是正数多少, 可以看看加密解密四 - 第四章,关于汇编这些,然后再去看汇编就舒服很多了,
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
令则
一般程序内的变量,局部变量在寄存器或栈,全局变量在.data段或.bss段,
然后栈中参数传递的时候会涉及到栈帧的概念,了解下会比较好理解这个吧,
对于函数调用的传参,一般32位是压栈,64位寄存 ...
谢谢
|
|
|