MCPcopy Create free account
hub / github.com/MJx0/KittyMemoryEx / _callSyscall

Method _callSyscall

KittyMemoryEx/KittyTrace.cpp:663–875  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

661 if (_autoRestoreRegs)
662 setRegs(&backup_regs);
663
664 KITTY_LOGD("callFunction: Calling function %p returned %p.", (void *)functionAddress, (void *)result.result.ptr);
665
666 return result;
667}
668
669kitty_rp_call_t KittyTraceMgr::_callSyscall(long sysnr, int nargs, ...)
670{
671 if (!_attached || _pid <= 0)
672 return {KT_RP_CALL_FAILED, {0}};
673
674 user_regs_struct backup_regs, return_regs, tmp_regs;
675 memset(&backup_regs, 0, sizeof(backup_regs));
676 memset(&return_regs, 0, sizeof(return_regs));
677 memset(&tmp_regs, 0, sizeof(tmp_regs));
678
679 // backup current regs
680 if (!getRegs(&backup_regs))
681 {
682 KITTY_LOGE("callSyscall(%d): Failed, couldn't get regs.", int(sysnr));
683 return {KT_RP_CALL_REGS_FAILED, {0}};
684 }
685
686 memcpy(&tmp_regs, &backup_regs, sizeof(backup_regs));
687
688 KT_REGS_ALIGN_STACK(backup_regs);
689 KT_REGS_ALIGN_STACK(tmp_regs);
690 KT_REGS_ALIGN_STACK(return_regs);
691
692 std::vector<uintptr_t> vargs(6, 0);
693 if (nargs > 0)
694 {
695 va_list vl;
696 va_start(vl, nargs);
697 for (int i = 0; i < nargs; i++)
698 {
699 vargs[i] = va_arg(vl, uintptr_t);
700 }
701 va_end(vl);
702 }
703
704 KITTY_LOGD("callSyscall(%d, 0x%zx, 0x%zx, 0x%zx, 0x%zx, 0x%zx, 0x%zx)",
705 int(sysnr),
706 vargs[0],
707 vargs[1],
708 vargs[2],
709 vargs[3],
710 vargs[4],
711 vargs[5]);
712
713 uintptr_t target_pc_mem = tmp_regs.KT_REG_PC;
714 std::vector<uint8_t> syscall_code;
715 std::vector<uint8_t> backup_code;
716 if (_syscallGadget != 0)
717 {
718 KITTY_LOGD("callSyscall(%d) using syscall gadget at %p", int(sysnr), (void *)_syscallGadget);
719 tmp_regs.KT_REG_PC = _syscallGadget;
720 }

Callers

nothing calls this directly

Calls 3

getAddressMapFunction · 0.85
toStringMethod · 0.80
isValidMethod · 0.45

Tested by

no test coverage detected