PC端逆向会用到的常见伪指令
由于之前学到的编程还只是在刚刚入门的地步,现在重新来看伪指令,只能浅浅说一些基础的、常见的伪指令,做出一些简单的理解。
一开始学汇编的时候,会先接触到类似codesg segment ......codesg ends这样表达一个代码段的开始和结束的伪指令,但是其实在实际的逆向分析中这种伪指令还是比较少见的,更多的是其他的,例如我们这边用一个简单的程序来用ida分析看看
追踪这个变量去看他的汇编代码
这里边出现最多的就是db这个伪指令,用于定义字节数据,像这里就标识%d,类似的还有dw,dd,dq都是定义的不同的字节数据类型。
但是这个标识符老实说也没什么用,主要是后面的进制数表示的内容。
那么常见的,比较有用的伪指令有哪些呢?像我们常见的.text代码段标识,.rdata只读数据段,.data数据段,其实也是一种伪指令,归根到底,伪指令始终是服务于人的理解的。
学习伪指令是为了让我们快速的定位到需要分析的一个进程,通过伪指令形成一个可视的结构,利于我们去理解整个代码的结构和进程。
类似的有align对齐指令,帮助区分有效数据和编译器自动填充的垃圾数据,帮助我们顺利定位到程序的逻辑
align也方便于数据储存和访问,可能会想到为什么明明我们写程序的时候没有接触过这些伪指令,但是编译,反编译之后确确实实存在了,这就是编译器对于编写的程序源码的处理,这些伪指令本质也就是二进制数据,这些都服务于让这些程序能够较好的执行
XREF标注当前数据被哪些地址引用了,这个也可以帮助我们顺利的掌握程序的逻辑,只不过还要去学习地址的定位和使用
像这里面就标出来了数据和对应的引用的地址。
off_XXXX偏移标识,例如off_403000表示指向403000地址的指针,我们可以通过这个去区分普通的数值和内存指针。
总的来说,平常在逆向过程中,如果是简单的逆向一般较少涉及到具体利用伪指令分析汇编代码,进而了解程序进程,到目前为止,我了解到的伪指令也不多,主要是通过追踪变量或关键函数,去理解程序的进程。实际上,伪指令的存在就是方便我们在分析程序的时候构建出一个代码理解的框架,进而分析出程序作用。
主要是目前学到的伪指令还是太少了,上学期学汇编也才堪堪学到栈的概念而已,这块确实不是很熟悉……
; int scanf(...)注释伪指令,从图中也清晰的看出来作用
proc near函数开始伪指令,这边就标识了scanf函数的开始
后续还有符号定义伪指令,和偏移定义伪指令,在栈上进行的操作。
XREF前面可以加code或者data标识代码交叉引用或数据交叉引用,后面有跟段名称和地址,可以很好的去定位到数据位置
最后是函数的结束标识
总体而言这段汇编代码就是实现了scanf这个函数的底层逻辑,上面各种伪指令可以帮助我们理解这个函数的逻辑。