[dafsic] # _


地狱天堂皆在人间

Recent

如何在二进制文件中查找全局变量的值

published on
背景 从二进制文件中找出一个初始化了的全局变量的值。 原理 初始化的全局变量的值,一定是在可执行文件中的,就看怎么定位到这个地址了。 环境说明 可执行二进制文件为linux下elf文件格式。二进制文件的符号表没被删除,并且知道这个全局变量名。 方法 先在文件中找到这个变量的地址。 readelf -s prob |grep accessID 319: 0000000000cf2610 16 OBJECT GLOBAL DEFAULT 9 main.accessID 4414: 00000000009ad660 17 OBJECT GLOBAL DEFAULT 2 main.accessID.str prob为二进制文件名,accessID就是我想知道的全局变量名,readelf -s 查看prob的符号表,找到accessID 这个 变量。 从符号名上应该能看出第二条记录是 我们需要的:(实际应该从第一条记录去找,因为我知道这个变量是个字符串,所以这个变量的值 应该是个地址,而这个地址里的内容才是真正的 字符串值。 经验证,0xcf2610这个地址的内容就是0x9ad660) * 名称 -> main.accessID.str * 内存地址 -> 0x9ad660 * size -> 17 字节 但是0x9ad660这个地址是 应用加载进内存之后,在内存中的地址,并不是在二进制文件中的地址。 找到变量在文件 中相对与文件头的偏移 readelf -S prob There are 24 section headers, starting at offset 0x1c8: Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] . Read More...

无锁编程--atomic.Value

published on
背景 多个goroutine都会读写同一个对象时,必然会有竞争。读写锁或者互斥锁就是解决这种问题的终极方法,但同时性能也是最差的,go在atomic库提供了Value这个类型,实现无锁操作。 实现 type HomeCache map[string]int var homePageInfo atomic.Value func updateHomeCache() error { data := HomeCache{} queryStr := "SELECT source,type,value,wihome FROM wihome_index" rows, _ := adb.DB.Query(queryStr) var source, typ, wihome int var value, key string for rows.Next() { rows.Scan(&source, &typ, &value, &wihome) key = fmt.Sprintf("%d__%d__%s", source, typ, value) data[key] = wihome } if rows.Err() != nil { return rows.Err() } homePageInfo.Store(data) return nil } func GetHomeIdx(source int, did string, mid int, node string) (idx int) { data := homePageInfo. Read More...

Categories

Example (1) Golang (4) Linux (1)

Tags

atomic (1) channel (2) closure (1) database (1) elf (1) markdown (1)