0

アセンブリ コード ファイルがあります。ローカル サブルーチンとライブラリ関数に対して行われたすべての呼び出しを調べたい。以下は、ファイルからのコードの一部です。

sub_401014 proc near
call sub_401035
mov esi, ebp
add esi, offset dword_4013FC
push esi
sub ecx, 18h
add ecx, ss:dword_4015B2[ebp]
call loc_402014
xor eax, ebx
push ecx
call FindNextFileA
retn
sub_401014 endp

ここでは、キューに関数名が 2 つしかないキューを作成します --> (sub_401035,FindNextFileA)。つまり、 loc_ への呼び出しを追加しないでください。

私はこのJava正規表現を試しましたが、空のキューを取得しています:

String entry_regex = "call " + "/^((?!loc).)*$/s";
Pattern function_pattern = Pattern.compile(entry_regex); 
Matcher function_matcher = function_pattern.matcher(currentLine1); /*--> currentLine1 is current line read*/

if(function_matcher.find()){
String [] array = function_matcher.group().split(" ");
queue.insert(array[1]);
}
4

1 に答える 1

0

私があなたの質問を正しく理解していれば、'call' で始まるすべての行を取得し、呼び出しが loc_ で始まらないようにする必要があります。Java 8 を使用している場合は、次のソリューションを提供します。

public List<String> functions(final String code){
    return Arrays.asList(code.split("\n")).stream().filter(this::valid).map(s -> s.split(" ")[1]).collect(Collectors.toList());
}

private boolean valid(final String code){
    return code.startsWith("call") && !code.split(" ")[1].startsWith("loc_");
}

Java 8 を使用していない場合は、上記のコードを変更して、お使いのバージョンの JDK でコンパイルできるようにすることができます。

于 2013-09-09T01:19:30.813 に答える