• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

IDA系列教程:基于堆栈传输特定指令

IDA系列教程 云涯 4年前 (2020-11-09) 1611次浏览

什么是堆栈?

堆栈是一个内存部分,其中的访问模式为FILO,表示先进先出。

它允许保存和恢复数据。对于数据处理,有两个基本操作:

PUSH将对象放置在堆栈上,其反操作POP取出最后被压入的元素。

在任何时候,它只能访问堆栈的顶部或最后推送的对象

通常,在32位中,PUSH用于在调用CALL之前将函数参数发送到堆栈

images

PUSH 64将dword 64放在堆栈的顶部,然后PUSH EAX将EAX值放在dword 64上面保存,因此EAX值现在将成为堆栈的顶部。

我们看到了不同的PUSH类型。我们可以推送常量,但是在这种情况下,我们也可以推送内存地址。

images

双击WindowName,发现使用两行进行描述,char WindowName []之所以存在,是因为它从api CreateWindow中检测到它接收到的参数必须是char []的LPCTSTR,并且该参数是一个称为WindowName的字符串

它是一个字符或字节数组,IDA向它添加了一些从api获得的更多信息。0x4020E7之后,反汇编中的下一个地址为0x4020F4。有一些连续的字节属于“ Crackme v1.0”的字符串字符,而0则界定了字符串的结尾。

images

images

如果按D更改WindowName上的数据类型,则可以使它停止将其检测为字符数组,并保留为db 0 byte

images

 

之前,是使用offset 将地址推入栈中,现在使用D快捷键修改字符数组为字节,指令变为

images

因为当它寻找0x4020E7的内容来告诉我们它是什么时,会有一个db,也就是说,我们将变量更改为一个字节

images

按下A作为ASCII字符串,它将像以前一样显示它

如果我们在工作时看到任何字符串都是分开的字节,则我们将执行相同的操作。

images

在这种情况下,有一个未在前两行中定义的字符串,并且没有说它是CHAR [],而是仅使用以字母a开头的标签定义为ASCII串。在前一种情况下,它显示了额外的信息,因为它检测到它是一个api参数或系统函数,并告诉它该参数应该是char [],这就是为什么要在其中添加参数,但是普通字符串看起来像最后一个。

images

在0x402110中,可以通过按菜单中的D来分隔其首字节

 

images

如果我们按A,我们将还原更改

如果按X查找参考,然后看到它在哪里使用该字符串…

images

 

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:IDA系列教程:基于堆栈传输特定指令
喜欢 (0)