查找二进制操作码序列

逆向工程 艾达 拆卸 二元分析 静态分析
2021-06-18 09:05:07

我已经分解了二进制文件并想检查它是否包含特定的操作码序列(从其他参考二进制文件中获得)。怎么做 。我知道普通字节级比较不会工作,因为内存地址等可能不同。

example :
0000001806991C0                 push    rdi
.text:00000001806991C1                 sub     rsp, 30h
.text:00000001806991C5                 mov     [rsp+38h+var_18], 0FFFFFFFFFFFFFFFEh
.text:00000001806991CE                 mov     [rsp+38h+arg_0], rbx
.text:00000001806991D3                 mov     rdi, rcx
.text:00000001806991D6                 lea     rbx, [rcx+60h]
.text:00000001806991DA                 lea     rax, off_180B6BED0
.text:00000001806991E1                 mov     [rbx], rax
.text:00000001806991E4                 xor     r8d, r8d
.text:00000001806991E7                 lea     rdx, nullsub_1
.text:00000001806991EE                 mov     rcx, rbx
.text:00000001806991F1                 call    sub_1800A4160
.text:00000001806991F6                 mov     rcx, rbx
.text:00000001806991F9                 call    sub_1800A4148
.text:00000001806991FE                 xchg    ax, ax
.text:0000000180699200                 lea     rdx, sub_180259E24
.text:0000000180699207                 lea     rcx, [rdi+50h]
.text:000000018069920B                 call    sub_180079CEC
.text:0000000180699210                 lea     rcx, [rdi+50h]
.text:0000000180699214                 call    sub_1800A74C4
.text:0000000180699219                 lea     rax, off_180BE6328
4个回答

根据特定的指令集编码,对二进制本身进行操作的正则表达式可能足够灵活,可以忽略会根据地址变化的部分。

通过简单的反汇编程序来处理代码并在文本输出上运行正则表达式引擎可能比在二进制文件上这样做更可取,因为在它们被拆分时连接忽略特定操作数的规则要容易得多(尽管您现在正在进行多线匹配)

有时候这是不值得担心的正确作业工具,只是掀起了你最喜欢的语言-的-方便(今天,大概Python)的一些代码来解决一次性需要。

也很可能您可以使用文本编辑器来查找 模式的一部分,然后手动检查候选是否完整匹配。/

反汇编,拆分指令列,然后比较,然后使用并排文本编辑器(每个的反汇编输出)手动比较是否足够快速和简单以供一次性使用。

否则你需要一个聪明的比较,知道寄存器和内存位置可以相互交换,只要它们始终一致;导致相同的输出 - 因此每个代码段都具有相同的功能,这些段将是彼此的副本。

这取决于您必须检查多少代码以及您打算多久检查一次。

所谓的智能比较的一个优点是它可以遍历代码,移位一个地址,并找到所有可能的匹配方式;导致一些需要手动识别的误报。

依赖反汇编器的一个缺点是它可能会遗漏(或不同步)并且无法反汇编几段代码;留下一些可能的匹配(或接近匹配)未找到 - 导致版权声明。

一个能够进行详尽比较的程序可能比只发现低垂的果实的程序更有用。这是一个预期的最终用途和对预期结果所必需的项目投资的问题。

听起来您只想在二进制文件中搜索一些二进制值序列。也许我误读了,它比那更复杂。

我会从好的旧 grep 开始。

cat binary.exe |  xxd -p | tr -d '\n' | grep -o -e '774b'

发送您的二进制文件xxd -p以将其转换为十六进制字符串。

删除新行 tr -d '\n'

把它grep -o -e '774b'交给搜索十六进制值774b

-o标志将 grep 限制为仅显示匹配项,而不是整行(或在这种情况下的文件,因为它已转换为单个十六进制字符串行。

如果您想查看匹配前后的某些字符(字节).,例如添加点 ( )grep -o -e '....774b....'以查看匹配前后 2 个字节和 2 个字节。

如果您不需要使用 IDA,您可以使用radare2,然后执行以下操作:

radare2 <your_file>

然后做:

/x <youropcodes>

.

例子:

/x 900a0b0c90

.

要获取有关如何在radare2 上使用此命令的示例,您可以使用:

/x?

.

如果您需要使用 IDA pro 来获取知识,可以跳过我的回答。