-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathForceThumbDecompile.java
More file actions
77 lines (61 loc) · 3.43 KB
/
Copy pathForceThumbDecompile.java
File metadata and controls
77 lines (61 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import ghidra.app.script.GhidraScript;
import ghidra.app.decompiler.DecompInterface;
import ghidra.app.decompiler.DecompileResults;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSet;
import ghidra.program.model.lang.Register;
import ghidra.program.model.listing.Function;
import ghidra.util.task.ConsoleTaskMonitor;
import java.math.BigInteger;
public class ForceThumbDecompile extends GhidraScript {
// ближайшие кандидаты снизу к нашему адресу (0x84034156), по возрастанию удалённости
long[] CANDIDATES = {
0x84033fecL,
0x84033fdcL,
0x84033fb0L
};
long BLOCK_LEN = 0x400; // с запасом, чтобы захватить всю функцию
@Override
public void run() throws Exception {
Register tmode = currentProgram.getProgramContext().getRegister("TMode");
DecompInterface decompiler = new DecompInterface();
decompiler.openProgram(currentProgram);
for (long candidateAddr : CANDIDATES) {
Address start = toAddr(candidateAddr);
Address end = start.add(BLOCK_LEN);
println("\n\n########## Кандидат @ " + start + " ##########");
try {
// 1. Чистим предыдущий (неверный ARM) анализ в этом диапазоне
// ВАЖНО: делать это ДО смены контекстного регистра,
// иначе Ghidra ругается на конфликт с существующими инструкциями
clearListing(start, end);
// 2. Помечаем регион как Thumb в контексте процессора
currentProgram.getProgramContext().setValue(tmode, start, end, BigInteger.ONE);
// 3. Дизассемблируем заново, уже в Thumb-режиме
disassemble(start);
// 4. Пытаемся создать функцию с этой точки
Function func = createFunction(start, null);
if (func == null) {
println("Не удалось создать функцию по этому адресу, пропускаем");
continue;
}
println("Функция создана: " + func.getName() + " @ " + func.getEntryPoint());
// 5. Декомпилируем
DecompileResults result = decompiler.decompileFunction(func, 30, new ConsoleTaskMonitor());
if (result.decompileCompleted()) {
String code = result.getDecompiledFunction().getC();
println(code);
if (code.contains("valid") || code.contains("macho") || code.contains("Mach")) {
println(">>> ЭТА ФУНКЦИЯ СОДЕРЖИТ ИНТЕРЕСУЮЩИЕ КЛЮЧЕВЫЕ СЛОВА! <<<");
}
} else {
println("Декомпиляция не удалась: " + result.getErrorMessage());
}
} catch (Exception e) {
println("Ошибка при обработке кандидата " + start + ": " + e.getMessage());
}
}
decompiler.dispose();
println("\n=== ГОТОВО ===");
}
}