Created
April 1, 2024 07:31
-
-
Save jimmy947788/7e91f1ddb0f853be17012e8769e5883d to your computer and use it in GitHub Desktop.
该脚本用于在 IDA 中查找 ARM64 架构的 SVC 指令,并添加注释显示系统调用号对应的系统调用名称。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Description: 该脚本用于在 IDA 中查找 ARM64 架构的 SVC 指令,并添加注释显示系统调用号对应的系统调用名称。 | |
# environment: IDA 7.7, python 3.9 | |
# Author: jimmy947788 吉掰米 | |
# email: [email protected] | |
import idautils | |
import idc | |
# 系統調用號到名稱的映射 | |
syscall_mapping = { | |
0: "__NR_io_setup", | |
1: "__NR_io_destroy", | |
2: "__NR_io_submit", | |
3: "__NR_io_cancel", | |
4: "__NR_io_getevents", | |
5: "__NR_setxattr", | |
6: "__NR_lsetxattr", | |
7: "__NR_fsetxattr", | |
8: "__NR_getxattr", | |
9: "__NR_lgetxattr", | |
10: "__NR_fgetxattr", | |
11: "__NR_listxattr", | |
12: "__NR_llistxattr", | |
13: "__NR_flistxattr", | |
14: "__NR_removexattr", | |
15: "__NR_lremovexattr", | |
16: "__NR_fremovexattr", | |
17: "__NR_getcwd", | |
18: "__NR_lookup_dcookie", | |
19: "__NR_eventfd2", | |
20: "__NR_epoll_create1", | |
21: "__NR_epoll_ctl", | |
22: "__NR_epoll_pwait", | |
23: "__NR_dup", | |
24: "__NR_dup3", | |
25: "__NR_fcntl", | |
26: "__NR_inotify_init1", | |
27: "__NR_inotify_add_watch", | |
28: "__NR_inotify_rm_watch", | |
29: "__NR_ioctl", | |
30: "__NR_ioprio_set", | |
31: "__NR_ioprio_get", | |
32: "__NR_flock", | |
33: "__NR_mknodat", | |
34: "__NR_mkdirat", | |
35: "__NR_unlinkat", | |
36: "__NR_symlinkat", | |
37: "__NR_linkat", | |
38: "__NR_renameat", | |
39: "__NR_umount2", | |
40: "__NR_mount", | |
41: "__NR_pivot_root", | |
42: "__NR_nfsservctl", | |
43: "__NR_statfs", | |
44: "__NR_fstatfs", | |
45: "__NR_truncate", | |
46: "__NR_ftruncate", | |
47: "__NR_fallocate", | |
48: "__NR_faccessat", | |
49: "__NR_chdir", | |
50: "__NR_fchdir", | |
51: "__NR_chroot", | |
52: "__NR_fchmod", | |
53: "__NR_fchmodat", | |
54: "__NR_fchownat", | |
55: "__NR_fchown", | |
56: "__NR_openat", | |
57: "__NR_close", | |
58: "__NR_vhangup", | |
59: "__NR_pipe2", | |
60: "__NR_quotactl", | |
61: "__NR_getdents64", | |
62: "__NR_lseek", | |
63: "__NR_read", | |
64: "__NR_write", | |
65: "__NR_readv", | |
66: "__NR_writev", | |
67: "__NR_pread64", | |
68: "__NR_pwrite64", | |
69: "__NR_preadv", | |
70: "__NR_pwritev", | |
71: "__NR_sendfile", | |
72: "__NR_pselect6", | |
73: "__NR_ppoll", | |
74: "__NR_signalfd4", | |
75: "__NR_vmsplice", | |
76: "__NR_splice", | |
77: "__NR_tee", | |
78: "__NR_readlinkat", | |
79: "__NR_fstatat", | |
80: "__NR_fstat", | |
81: "__NR_sync", | |
82: "__NR_fsync", | |
83: "__NR_fdatasync", | |
84: "__NR_sync_file_range", | |
85: "__NR_timerfd_create", | |
86: "__NR_timerfd_settime", | |
87: "__NR_timerfd_gettime", | |
88: "__NR_utimensat", | |
89: "__NR_acct", | |
90: "__NR_capget", | |
91: "__NR_capset", | |
92: "__NR_personality", | |
93: "__NR_exit", | |
94: "__NR_exit_group", | |
95: "__NR_waitid", | |
96: "__NR_set_tid_address", | |
97: "__NR_unshare", | |
98: "__NR_futex", | |
99: "__NR_set_robust_list", | |
100: "__NR_get_robust_list", | |
101: "__NR_nanosleep", | |
102: "__NR_getitimer", | |
103: "__NR_setitimer", | |
104: "__NR_kexec_load", | |
105: "__NR_init_module", | |
106: "__NR_delete_module", | |
107: "__NR_timer_create", | |
108: "__NR_timer_gettime", | |
109: "__NR_timer_getoverrun", | |
110: "__NR_timer_settime", | |
111: "__NR_timer_delete", | |
112: "__NR_clock_settime", | |
113: "__NR_clock_gettime", | |
114: "__NR_clock_getres", | |
115: "__NR_clock_nanosleep", | |
116: "__NR_syslog", | |
117: "__NR_ptrace", | |
118: "__NR_sched_setparam", | |
119: "__NR_sched_setscheduler", | |
120: "__NR_sched_getscheduler", | |
121: "__NR_sched_getparam", | |
122: "__NR_sched_setaffinity", | |
123: "__NR_sched_getaffinity", | |
124: "__NR_sched_yield", | |
125: "__NR_sched_get_priority_max", | |
126: "__NR_sched_get_priority_min", | |
127: "__NR_sched_rr_get_interval", | |
128: "__NR_restart_syscall", | |
129: "__NR_kill", | |
130: "__NR_tkill", | |
131: "__NR_tgkill", | |
132: "__NR_sigaltstack", | |
133: "__NR_rt_sigsuspend", | |
134: "__NR_rt_sigaction", | |
135: "__NR_rt_sigprocmask", | |
136: "__NR_rt_sigpending", | |
137: "__NR_rt_sigtimedwait", | |
138: "__NR_rt_sigqueueinfo", | |
139: "__NR_rt_sigreturn", | |
140: "__NR_setpriority", | |
141: "__NR_getpriority", | |
142: "__NR_reboot", | |
143: "__NR_setregid", | |
144: "__NR_setgid", | |
145: "__NR_setreuid", | |
146: "__NR_setuid", | |
147: "__NR_setresuid", | |
148: "__NR_getresuid", | |
149: "__NR_setresgid", | |
150: "__NR_getresgid", | |
151: "__NR_setfsuid", | |
152: "__NR_setfsgid", | |
153: "__NR_times", | |
154: "__NR_setpgid", | |
155: "__NR_getpgid", | |
156: "__NR_getsid", | |
157: "__NR_setsid", | |
158: "__NR_getgroups", | |
159: "__NR_setgroups", | |
160: "__NR_uname", | |
161: "__NR_sethostname", | |
162: "__NR_setdomainname", | |
163: "__NR_getrlimit", | |
164: "__NR_setrlimit", | |
165: "__NR_getrusage", | |
166: "__NR_umask", | |
167: "__NR_prctl", | |
168: "__NR_getcpu", | |
169: "__NR_gettimeofday", | |
170: "__NR_settimeofday", | |
171: "__NR_adjtimex", | |
172: "__NR_getpid", | |
173: "__NR_getppid", | |
174: "__NR_getuid", | |
175: "__NR_geteuid", | |
176: "__NR_getgid", | |
177: "__NR_getegid", | |
178: "__NR_gettid", | |
179: "__NR_sysinfo", | |
180: "__NR_mq_open", | |
181: "__NR_mq_unlink", | |
182: "__NR_mq_timedsend", | |
183: "__NR_mq_timedreceive", | |
184: "__NR_mq_notify", | |
185: "__NR_mq_getsetattr", | |
186: "__NR_msgget", | |
187: "__NR_msgctl", | |
188: "__NR_msgrcv", | |
189: "__NR_msgsnd", | |
190: "__NR_semget", | |
191: "__NR_semctl", | |
192: "__NR_semtimedop", | |
193: "__NR_semop", | |
194: "__NR_shmget", | |
195: "__NR_shmctl", | |
196: "__NR_shmat", | |
197: "__NR_shmdt", | |
198: "__NR_socket", | |
199: "__NR_socketpair", | |
200: "__NR_bind", | |
201: "__NR_listen", | |
202: "__NR_accept", | |
203: "__NR_connect", | |
204: "__NR_getsockname", | |
205: "__NR_getpeername", | |
206: "__NR_sendto", | |
207: "__NR_recvfrom", | |
208: "__NR_setsockopt", | |
209: "__NR_getsockopt", | |
210: "__NR_shutdown", | |
211: "__NR_sendmsg", | |
212: "__NR_recvmsg", | |
213: "__NR_readahead", | |
214: "__NR_brk", | |
215: "__NR_munmap", | |
216: "__NR_mremap", | |
217: "__NR_add_key", | |
218: "__NR_rest_key", | |
219: "__NR_keyctl", | |
220: "__NR_clone", | |
221: "__NR_execve", | |
222: "__NR_mmap", | |
223: "__NR_fadvise64", | |
224: "__NR_swapon", | |
225: "__NR_swapoff", | |
226: "__NR_mprotect", | |
227: "__NR_msync", | |
228: "__NR_mlock", | |
229: "__NR_munlock", | |
230: "__NR_mlockall", | |
231: "__NR_munlockall", | |
232: "__NR_mincore", | |
233: "__NR_madvise", | |
234: "__NR_remap_file_pages", | |
235: "__NR_mbind", | |
236: "__NR_get_mempolicy", | |
237: "__NR_set_mempolicy", | |
238: "__NR_migrate_pages", | |
239: "__NR_move_pages", | |
240: "__NR_rt_tgsigqueueinfo", | |
241: "__NR_perf_event_open", | |
242: "__NR_accept4", | |
243: "__NR_recvmmsg", | |
244: "__NR_or1k_atomic", | |
260: "__NR_wait4", | |
261: "__NR_prlimit64", | |
262: "__NR_fanotify_init", | |
263: "__NR_fanotify_mark", | |
264: "__NR_name_to_handle_at", | |
265: "__NR_open_by_handle_at", | |
266: "__NR_clock_adjtime", | |
267: "__NR_syncfs", | |
268: "__NR_setns", | |
269: "__NR_sendmmsg", | |
270: "__NR_process_vm_readv", | |
271: "__NR_process_vm_writev", | |
272: "__NR_kcmp", | |
273: "__NR_finit_module", | |
274: "__NR_sched_setattr", | |
275: "__NR_sched_getattr", | |
276: "__NR_renameat2", | |
277: "__NR_seccomp", | |
278: "__NR_getrandom", | |
279: "__NR_memfd_create", | |
280: "__NR_bpf", | |
281: "__NR_execveat", | |
282: "__NR_userfaultfd", | |
283: "__NR_membarrier", | |
284: "__NR_mlock2", | |
285: "__NR_copy_file_range", | |
286: "__NR_preadv2", | |
287: "__NR_pwritev2" | |
} | |
# 遍历所有的函数 | |
for func in idautils.Functions(): | |
func_name = idc.get_func_name(func) | |
print(f"正在检查函数: {func_name}") | |
# 遍历函数中的所有指令 | |
for ins in idautils.FuncItems(func): | |
mnemonic = idc.print_insn_mnem(ins) | |
# 检查指令是否为 MOV W8, #imm | |
if mnemonic == "MOV": | |
opnd = idc.print_operand(ins, 0) | |
if opnd == "W8": | |
if idc.get_operand_type(ins, 1) == idc.o_imm: | |
imm_value = idc.get_operand_value(ins, 1) # 获取立即数的值 | |
syscall_name = syscall_mapping.get(imm_value, f"Unknown syscall {imm_value}") | |
# 从当前 MOV 指令位置向下搜索第一个 SVC 指令 | |
next_ins = ins | |
while True: | |
next_ins = idc.next_head(next_ins, idc.get_segm_end(next_ins)) | |
if idc.print_insn_mnem(next_ins) == "SVC": | |
# 在找到的 SVC 指令处添加注释 | |
comment = f"System call: {syscall_name}" | |
idc.set_cmt(next_ins, comment, 0) | |
print(f"在地址 {hex(next_ins)} 的 SVC 指令上添加注释:{comment}") | |
break | |
# 如果到达函数末尾还未找到 SVC,则退出循环 | |
if next_ins == idc.get_func_attr(func, idc.FUNCATTR_END): | |
print("在 MOV W8, #imm 指令之后未找到 SVC 指令。") | |
break |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment