@@ -39,6 +39,7 @@ typedef struct x64_sigaction_s x64_sigaction_t;
39
39
typedef struct x64_stack_s x64_stack_t ;
40
40
41
41
extern int mkdir (const char * path , mode_t mode );
42
+ extern int mknod (const char * path , mode_t mode , dev_t dev );
42
43
extern int fchmodat (int __fd , const char * __file , mode_t __mode , int __flag );
43
44
44
45
//int32_t my_getrandom(x64emu_t* emu, void* buf, uint32_t buflen, uint32_t flags);
@@ -73,7 +74,7 @@ int32_t my_execve(x64emu_t* emu, const char* path, char* const argv[], char* con
73
74
#undef fcntl
74
75
int fcntl (int fd , int cmd , ... /* arg */ );
75
76
76
- // Syscall table for x86_64 can be found
77
+ // Syscall table for x86_64 can be found
77
78
typedef struct scwrap_s {
78
79
int nats ;
79
80
int nbpars ;
@@ -186,6 +187,9 @@ static const scwrap_t syscallwrap[] = {
186
187
[127 ] = {__NR_rt_sigpending , 2 },
187
188
[128 ] = {__NR_rt_sigtimedwait , 4 },
188
189
//[131] = {__NR_sigaltstack, 2}, // wrapped to use my_sigaltstack*
190
+ #ifdef __NR_mknod
191
+ [133 ] = {__NR_mknod , 3 },
192
+ #endif
189
193
[140 ] = {__NR_getpriority , 2 },
190
194
[145 ] = {__NR_sched_getscheduler , 1 },
191
195
[148 ] = {__NR_sched_rr_get_interval , 2 },
@@ -240,7 +244,7 @@ static const scwrap_t syscallwrap[] = {
240
244
#endif
241
245
[258 ] = {__NR_mkdirat , 3 },
242
246
[260 ] = {__NR_fchownat , 5 },
243
- //[262] = {__NR_fstatat, 4},
247
+ //[262] = {__NR_fstatat, 4},
244
248
[263 ] = {__NR_unlinkat , 3 },
245
249
#ifdef __NR_renameat
246
250
[264 ] = {__NR_renameat , 4 },
@@ -401,7 +405,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
401
405
buffret = cycle_log ?my_context -> log_ret [my_context -> current_line ]:t_buffret ;
402
406
if (cycle_log )
403
407
my_context -> current_line = (my_context -> current_line + 1 )%cycle_log ;
404
- snprintf (buff , 255 , "%04d|%p: Calling syscall 0x%02X (%d) %p %p %p %p %p %p" , GetTID (), (void * )R_RIP , s , s , (void * )R_RDI , (void * )R_RSI , (void * )R_RDX , (void * )R_R10 , (void * )R_R8 , (void * )R_R9 );
408
+ snprintf (buff , 255 , "%04d|%p: Calling syscall 0x%02X (%d) %p %p %p %p %p %p" , GetTID (), (void * )R_RIP , s , s , (void * )R_RDI , (void * )R_RSI , (void * )R_RDX , (void * )R_R10 , (void * )R_R8 , (void * )R_R9 );
405
409
if (!cycle_log )
406
410
printf_log (LOG_NONE , "%s" , buff );
407
411
}
@@ -418,7 +422,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
418
422
case 5 : S_RAX = syscall (sc , R_RDI , R_RSI , R_RDX , R_R10 , R_R8 ); break ;
419
423
case 6 : S_RAX = syscall (sc , R_RDI , R_RSI , R_RDX , R_R10 , R_R8 , R_R9 ); break ;
420
424
default :
421
- printf_log (LOG_NONE , "ERROR, Unimplemented syscall wrapper (%d, %d)\n" , s , syscallwrap [s ].nbpars );
425
+ printf_log (LOG_NONE , "ERROR, Unimplemented syscall wrapper (%d, %d)\n" , s , syscallwrap [s ].nbpars );
422
426
emu -> quit = 1 ;
423
427
return ;
424
428
}
@@ -440,7 +444,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
440
444
S_RAX = - errno ;
441
445
break ;
442
446
case 2 : // sys_open
443
- if (s == 5 ) {if (log ) snprintf (buff2 , 63 , " [sys_open(\"%s\", %d, %d)]" , (char * )R_RDI , of_convert (R_ESI ), R_EDX );};
447
+ if (s == 5 ) {if (log ) snprintf (buff2 , 63 , " [sys_open(\"%s\", %d, %d)]" , (char * )R_RDI , of_convert (R_ESI ), R_EDX );};
444
448
//S_RAX = open((void*)R_EDI, of_convert(R_ESI), R_EDX);
445
449
S_RAX = my_open (emu , (void * )R_RDI , of_convert (R_ESI ), R_EDX );
446
450
if (S_RAX == -1 )
@@ -598,7 +602,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
598
602
}
599
603
break ;
600
604
#ifndef __NR_fork
601
- case 57 :
605
+ case 57 :
602
606
S_RAX = fork ();
603
607
if (S_RAX == -1 )
604
608
S_RAX = - errno ;
@@ -681,6 +685,13 @@ void EXPORT x64Syscall(x64emu_t *emu)
681
685
if (S_RAX == -1 )
682
686
S_RAX = - errno ;
683
687
break ;
688
+ #ifndef __NR_mknod
689
+ case 133 : // sys_mknod
690
+ S_RAX = mknod ((void * )R_RDI , R_ESI , R_RDX );
691
+ if (S_RAX == -1 )
692
+ S_RAX = - errno ;
693
+ break ;
694
+ #endif
684
695
case 158 : // sys_arch_prctl
685
696
S_RAX = my_arch_prctl (emu , S_EDI , (void * )R_RSI );
686
697
if (S_RAX == -1 )
@@ -809,7 +820,7 @@ long EXPORT my_syscall(x64emu_t *emu)
809
820
{
810
821
static uint32_t warned = 0 ;
811
822
uint32_t s = R_EDI ;
812
- printf_dump (LOG_DEBUG , "%04d| %p: Calling libc syscall 0x%02X (%d) %p %p %p %p %p\n" , GetTID (), (void * )R_RIP , s , s , (void * )R_RSI , (void * )R_RDX , (void * )R_RCX , (void * )R_R8 , (void * )R_R9 );
823
+ printf_dump (LOG_DEBUG , "%04d| %p: Calling libc syscall 0x%02X (%d) %p %p %p %p %p\n" , GetTID (), (void * )R_RIP , s , s , (void * )R_RSI , (void * )R_RDX , (void * )R_RCX , (void * )R_R8 , (void * )R_R9 );
813
824
// check wrapper first
814
825
uint32_t cnt = sizeof (syscallwrap ) / sizeof (scwrap_t );
815
826
if (s < cnt && syscallwrap [s ].nats ) {
@@ -823,7 +834,7 @@ long EXPORT my_syscall(x64emu_t *emu)
823
834
case 5 : return syscall (sc , R_RSI , R_RDX , R_RCX , R_R8 , R_R9 );
824
835
case 6 : return syscall (sc , R_RSI , R_RDX , R_RCX , R_R8 , R_R9 , u64 (0 ));
825
836
default :
826
- printf_log (LOG_NONE , "ERROR, Unimplemented syscall wrapper (%d, %d)\n" , s , syscallwrap [s ].nbpars );
837
+ printf_log (LOG_NONE , "ERROR, Unimplemented syscall wrapper (%d, %d)\n" , s , syscallwrap [s ].nbpars );
827
838
emu -> quit = 1 ;
828
839
return 0 ;
829
840
}
@@ -945,7 +956,7 @@ long EXPORT my_syscall(x64emu_t *emu)
945
956
return dup2 (S_ESI , S_EDX );
946
957
#endif
947
958
#ifndef __NR_fork
948
- case 57 :
959
+ case 57 :
949
960
return fork ();
950
961
#endif
951
962
case 58 : // vfork
@@ -990,6 +1001,10 @@ long EXPORT my_syscall(x64emu_t *emu)
990
1001
#endif
991
1002
case 131 : // sys_sigaltstack
992
1003
return my_sigaltstack (emu , (void * )R_RSI , (void * )R_RDX );
1004
+ #ifndef __NR_mknod
1005
+ case 133 : // sys_mknod
1006
+ return mknod ((void * )R_RSI , R_EDX , R_RCX );
1007
+ #endif
993
1008
case 158 : // sys_arch_prctl
994
1009
return my_arch_prctl (emu , S_ESI , (void * )R_RDX );
995
1010
#ifndef __NR_setrlimit
0 commit comments