当前位置: 首页 > 工具软件 > GNU poke > 使用案例 >

【GNU poke】关于GNU Poke使用说明

太叔经赋
2023-12-01

GNU poke背景

我们常常需要从一个二进制文件中读取某个偏移部位的数据,然后对读取数据做一个运算处理,最后把结果写回到二进制文件中去,为达到此目的常常需要编写shell脚本或者编写像C语言程序,基本都是decode-compute-encode三步来完成,此过程通常都比较无聊,而且不管是shell脚本还是其他语言程序,常常都不是很通用,二进制细微的变动都会导致解析工具运行出错。

由此GNU poke就诞生了,它可以描述你的数据,根据你的数据描述去自动的解析或修改你的二进制文件。poke里对数据的描述就是Poke Language。

比如:
定义一个Packet类型,读2个字节的magic,如果值为0xef就是合法的Packet类型
再读4个字节的size,
继续size个字节的data,

type Packet = 
struct
{
  uint<16> magic == 0xef;
  uint<32> size;
  byte[size] data @ 8#B;
};

poke命令文件

一条poke命令以点作为命令前缀
#开头的行为注释
poke命令文件包含的是poke命令不是poke代码,这里意思是poke读取命令文件是一行一行的读取的
解析不了断行的命令
poke启动时可指定加载的命令文件。
例如:

~/poke/poke-3.0 took 11s
❯ poke -s ~/.pokerc
     _____
 ---'   __\_______
            ______)  GNU poke 3.0
            __)
           __)
 ---._______)

Copyright (C) 2023 The poke authors.
License GPLv3+: GNU GPL version 3 or later.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Powered by Jitter 0.9.294.
Perpetrated by Jose E. Marchesi.

For help, type ".help".
Type ".exit" to leave the program.
(poke) 0x1 + 0x0E
0x0000000f
(poke) .exit

~/poke/poke-3.0 took 14s
❯ cat ~/.pokerc
.set obase 16

poke脚本

~/poke/pokes
❯ cat 1.pk
#!/usr/local/bin/poke -L
!#

print "Hello world!\n";

for (arg in argv)
        printf("arg %s\n", arg);

如果想加附加参数,用如下形式:

#!/usr/bin/env sh
exec poke -L "$0" "$@"
!#
 类似资料: