如何从反汇编中提取某些单词"文件

时间:2013-04-05 00:43:44

标签: regex perl

我正是这样做的:

#!/usr/bin/env/perl

open FILE1, "<Exed.exe";
open FILE2, ">Fileinhexadecimal.txt";

binmode FILE1;

while (<FILE1>) {
$lines = $_;
$lines = unpack("H*", $lines);
chomp $lines;
print FILE2 "$lines\n";
}

close (FILE1);
close (FILE2)
print "Finish\n";
<>;

之后,我创建了其他程序来读取这个“.txt”文件来搜索一些信息。

使用这个脚本,我正在创建一个包含.exe文件的十六进制数据的文本文件。 我的问题是:

1-我想用regexp提取行:/8B55-(.*)-8B55/(使用第二个脚本,这里没有发布)

2 - 问题在于:

我的file.txt是这样的:

8B55-646464-8B558B55-636363-8B55
8B55-656565-8B558B55-666666-8B55

当我运行脚本时,脚本只是弹出这些数据:

"646464", "656565".

你仍然不理解我的问题。 我想提取:646464, 636363, 656565, 666666。但是剧本,当它找到第一场比赛时,他跳到下一行,不读其余的。

你能帮我怎样才能抓住所有的比赛? 其他例子:

8B55-646464-8B55987941651968798779878B55-686868-8B55
8B55-ILOVEYOU-8B55

此处,脚本只会捕获646464ILOVEYOU。 (缺少686868):/

我正在搜索某些数据的真实文件非常大并且有一些行,比这个例子大。

我尝试使用“g”:if($ lines =〜/(.*)/g) {

但不起作用。

我的第二个剧本:

我正在尝试运行此脚本:

#!/usr/bin/perl


open FILE, "<Fileinhexadecimal.txt";

while (<FILE>) {
$lines = $_;
if ($lines =~ /8B55-(.*)-8B55/g) {
print "-$1\n";
}
}
close (FILE)

<>;

没有任何反应。我正在尝试从一个巨大的文件中提取某些顺序字,并且正在发生这种情况,我只是以8B55为例。但问题是一样的。新想法?我怎么能用你的代码?

@match = /8B55-(.*?)-8B55/g; 打印“@match \ n”;

???感谢resp,对不起的英语感到抱歉

真正的问题

该行是:

8BCEE84EC4FFFF6A016A2B6A2B686C0100008BCEE83CC4FFFF6A016A2B6A2B686C0100008BCEE82AC4FFFF6A016A0E6A0E686D0100008BCEE818C4FFFF6A016A146A1468F20100008BCEE806C4FFFF6A006A0E6A0E68700100008BCEE8F4C3FFFF6A016A1E6A1E6871010000

在这一行中,我有6个要提取的数据。

我用这个正则表达式来提取:

8BCEE8 .... FFFF6A(..)6A(..)6A(..)68(..)(..)0000

在第一行,我们有3个匹配,在第二行我们有2个匹配,最后一行我们有1个匹配(8BCEE8F4C3FFFF6A016A1E6A1E6871010000)

我想提取实际上\ 1 \ 2 \ 3 \ 4和\ 5。我尝试使用if:

if($ lines =〜/ 8BCEE8....FFFF6A(..)6A(..)6A(..)68(..)(..)0000/g) { 打印“$ 5 $ 4 $ 1 $ 2 $ 3” }

但是使用这段代码,我每行只能进行一场比赛。而不是所有的比赛。明白了吗? :/ 我想在这里提取一下:

8BCEE84EC4FFFF6A016A2B6A2B686C010000

我想在6A之后,6A之后,6A之后和68之后的4个字母之后提取单词。:/ \ o /感谢您的建议,iluv u!

在此文件中,有1000行具有相同的正则表达式。我想提取这1000行。

1 个答案:

答案 0 :(得分:1)

这有帮助吗?

while (<DATA>) {
  print $1, "\n" while /(?<=8B55-)(\w+)(?=-8B55)/g;
}

__DATA__
8B55-646464-8B558B55-636363-8B55
8B55-656565-8B558B55-666666-8B55
8B55-646464-8B55987941651968798779878B55-686868-8B55
8B55-ILOVEYOU-8B55

<强>输出

646464
636363
656565
666666
646464
686868
ILOVEYOU

<强>更新

这就是我认为你需要完整的问题。

while (<DATA>) {

  while (/8BCEE8....FFFF6A(..)6A(..)6A(..)68(..)(..)0000/g) {
    print join(' ', $1, $2, $3, $4, $5), "\n";
  }
}

__DATA__
8BCEE84EC4FFFF6A016A2B6A2B686C0100008BCEE83CC4FFFF6A016A2B6A2B686C0100008BCEE82AC4FFFF6A016A0E6A0E686D0100008BCEE818C4FFFF6A016A146A1468F20100008BCEE806C4FFFF6A006A0E6A0E68700100008BCEE8F4C3FFFF6A016A1E6A1E6871010000

<强>输出

01 2B 2B 6C 01
01 2B 2B 6C 01
01 0E 0E 6D 01
01 14 14 F2 01
00 0E 0E 70 01
01 1E 1E 71 01