go语言逆向学习笔记(二)函数

纯新手小白,大佬多多指正。

接着第一篇,变量和指向变量的指针大差不差,本文讨论一下函数。

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("happy")
	happy()
	go hello()
	time.Sleep(1000)
	//hello()
}
func happy() {
	fmt.Println("unhappy")
}
func hello() {
	var a int
	for a = 12; a < 18; a++ {
		fmt.Println(a)
	}
}

简简单单的程序,看看反汇编

ida的函数识别只识别出来了hello函数,并未识别happy函数,应该是hello函数中用了go关键字,新开了一个协程

 

调试过程中,从内存的字符串也能看出,编译时并未把happy函数当做独立的函数来出处理,而是直接将源代码中happy函数的代码写入main函数,作为一个统一的函数来处理。

 在源代码中,我们也能明显地感到go关键字存在与否带来的巨大差异,

 在此时新开了一个协程,对应代码如下

 此时我们就不能把新开的协程给暂停了,可以跟进,逻辑很简单

 接下来是函数指针

package main

import "fmt"

func main() {
	fmt.Println("hello")
	var pt func()
	pt = touful
	pt()
}
func touful() {
	fmt.Println("joy")
}

此时我们用指针来调用函数,ida就能识别出touful函数了,也就是说,编译时给touful函数单独划分了栈帧。

至于指针,如图就是用指针调用函数的过程,可以看出,总的来说,go的指针是比较方便使用的。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值