如何查找native服务的接口实现

news2024/9/20 22:39:58

以Netd为例:

首先adb看一下服务的接口:

接口文件是INetd,去源码找一下INetd.aidl

已经确定了接口API,对于native服务端的实现,一般的继承顺序为:

根据继承关系,对于BnXxx/XxxService 对象,含有三张虚表

虚表1

虚表1(来自IXxx)

01destructor
02destructor
03android::BnInterface::onAsBinder(void)
04getInterfaceDescriptor()
05 ~ (04+n)n个接口 ... ...
05+ngetInterfaceVersion(void)
06+nqueryLocalInterface(const String16& _descriptor)
07+nonTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)

虚表2

虚表2(来自BBinder)

01queryLocalInterface(const String16& _descriptor)
02getInterfaceDescriptor()
03android::BBinder::isBinderAlive(void)
04android::BBinder::pingBinder(void)
05android::BBinder::dump(int,android::Vector<android::String16> const&)
06android::BBinder::transact(uint,android::Parcel const&,android::Parcel*,uint)
07android::BBinder::linkToDeath(android::sp<android::IBinder::DeathRecipient> const&,void *,uint)
08android::BBinder::unlinkToDeath(android::wp<android::IBinder::DeathRecipient> const&,void ,uint,android::wp<android::IBinder::DeathRecipient>)
09android::IBinder::checkSubclass(void const*)
10android::BBinder::attachObject(void const*,void ,void ,void ()(void const,void *,void *))
11android::BBinder::findObject(void const*)
12android::BBinder::detachObject(void const*)
13android::BBinder::localBinder(void)
14android::IBinder::remoteBinder(void)

虚表3

虚表3(来自RefBase)

01destructor
02destructor
03android::RefBase::onFirstRef(void)
04android::RefBase::onLastStrongRef(void const*)
05android::RefBase::onIncStrongAttempted(uint,void const*)
06android::RefBase::onLastWeakRef(void const*)

下面在IDA中查找其具体API地址。先从手机中CP出system目录,在/system/bin 下面找到netd可执行程序,IDA打开。搜索BnNetd虚表中的函数,直接搜“BnNetd::onTransact”

查找引用定位虚表,一般虚表位于.data.rel.ro节中

定位到.data.rel.ro中的这一项,当虚表顺序满足Bn对象的虚表顺序时,这就是Bn对象的虚表(第二张虚表几乎全为导入函数,辨识度很高)

虚表一:

虚表二:

虚表三:

虚表一中getInterfaceVersion函数上面就是接口函数列表,IDA没有识别为函数,且还需要对该列表进行重命名,写一个IDA脚本来完成:


import idc
import ida_funcs
import ida_bytes
import ida_idaapi



ApiLists = '''
android::net::INetdDefault::isAlive(bool *)	.text	00000000000158D8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::firewallReplaceUidChain(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,bool,std::__1::vector<int,std::__1::allocator<int>> const&,bool *)	.text	00000000000158E0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::bandwidthEnableDataSaver(bool,bool *)	.text	00000000000158E8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkCreatePhysical(int,int)	.text	00000000000158F0	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkCreateVpn(int,bool)	.text	00000000000158F8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkDestroy(int)	.text	0000000000015900	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkAddInterface(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015908	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkRemoveInterface(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015910	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkAddUidRanges(int,std::__1::vector<android::net::UidRangeParcel,std::__1::allocator<android::net::UidRangeParcel>> const&)	.text	0000000000015918	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkRemoveUidRanges(int,std::__1::vector<android::net::UidRangeParcel,std::__1::allocator<android::net::UidRangeParcel>> const&)	.text	0000000000015920	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkRejectNonSecureVpn(bool,std::__1::vector<android::net::UidRangeParcel,std::__1::allocator<android::net::UidRangeParcel>> const&)	.text	0000000000015928	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::socketDestroy(std::__1::vector<android::net::UidRangeParcel,std::__1::allocator<android::net::UidRangeParcel>> const&,std::__1::vector<int,std::__1::allocator<int>> const&)	.text	0000000000015930	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherApplyDnsInterfaces(bool *)	.text	0000000000015938	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::tetherGetStats(std::__1::vector<android::net::TetherStatsParcel,std::__1::allocator<android::net::TetherStatsParcel>> *)	.text	0000000000015940	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceAddAddress(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015948	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceDelAddress(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015950	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::getProcSysNet(int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>*)	.text	0000000000015958	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::setProcSysNet(int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015960	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecSetEncapSocketOwner(android::os::ParcelFileDescriptor const&,int)	.text	0000000000015968	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::ipSecAllocateSpi(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int *)	.text	0000000000015970	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecAddSecurityAssociation(int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int,int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::vector<uchar,std::__1::allocator<uchar>> const&,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::vector<uchar,std::__1::allocator<uchar>> const&,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::vector<uchar,std::__1::allocator<uchar>> const&,int,int,int,int,int)	.text	0000000000015978	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecDeleteSecurityAssociation(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int,int,int)	.text	0000000000015980	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecApplyTransportModeTransform(android::os::ParcelFileDescriptor const&,int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015988	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecRemoveTransportModeTransform(android::os::ParcelFileDescriptor const&)	.text	0000000000015990	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::ipSecAddSecurityPolicy(int,int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int,int,int)	.text	0000000000015998	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecUpdateSecurityPolicy(int,int,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int,int,int)	.text	00000000000159A0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecDeleteSecurityPolicy(int,int,int,int,int,int)	.text	00000000000159A8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::ipSecAddTunnelInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int,int)	.text	00000000000159B0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecUpdateTunnelInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int,int)	.text	00000000000159B8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipSecRemoveTunnelInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	00000000000159C0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::wakeupAddInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int)	.text	00000000000159C8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::wakeupDelInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,int)	.text	00000000000159D0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::setIPv6AddrGenMode(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	00000000000159D8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::idletimerAddInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	00000000000159E0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::idletimerRemoveInterface(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	00000000000159E8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::strictUidCleartextPenalty(int,int)	.text	00000000000159F0	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::clatdStart(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>*)	.text	00000000000159F8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::clatdStop(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A00	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipfwdEnabled(bool *)	.text	0000000000015A08	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::ipfwdGetRequesterList(std::__1::vector<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>,std::__1::allocator<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>>> *)	.text	0000000000015A10	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipfwdEnableForwarding(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A18	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipfwdDisableForwarding(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A20	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipfwdAddInterfaceForward(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A28	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::ipfwdRemoveInterfaceForward(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A30	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::bandwidthSetInterfaceQuota(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,long)	.text	0000000000015A38	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::bandwidthRemoveInterfaceQuota(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A40	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::bandwidthSetInterfaceAlert(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,long)	.text	0000000000015A48	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::bandwidthRemoveInterfaceAlert(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A50	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::bandwidthSetGlobalAlert(long)	.text	0000000000015A58	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::bandwidthAddNaughtyApp(int)	.text	0000000000015A60	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::bandwidthRemoveNaughtyApp(int)	.text	0000000000015A68	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::bandwidthAddNiceApp(int)	.text	0000000000015A70	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::bandwidthRemoveNiceApp(int)	.text	0000000000015A78	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::tetherStart(std::__1::vector<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>,std::__1::allocator<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>>> const&)	.text	0000000000015A80	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherStop(void)	.text	0000000000015A88	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::tetherIsEnabled(bool *)	.text	0000000000015A90	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::tetherInterfaceAdd(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015A98	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherInterfaceRemove(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015AA0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherInterfaceList(std::__1::vector<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>,std::__1::allocator<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>>> *)	.text	0000000000015AA8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherDnsSet(int,std::__1::vector<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>,std::__1::allocator<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>>> const&)	.text	0000000000015AB0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherDnsList(std::__1::vector<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>,std::__1::allocator<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>>> *)	.text	0000000000015AB8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkAddRoute(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015AC0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkRemoveRoute(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015AC8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkAddLegacyRoute(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015AD0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkRemoveLegacyRoute(int,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015AD8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkGetDefault(int *)	.text	0000000000015AE0	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkSetDefault(int)	.text	0000000000015AE8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkClearDefault(void)	.text	0000000000015AF0	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkSetPermissionForNetwork(int,int)	.text	0000000000015AF8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkSetPermissionForUser(int,std::__1::vector<int,std::__1::allocator<int>> const&)	.text	0000000000015B00	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkClearPermissionForUser(std::__1::vector<int,std::__1::allocator<int>> const&)	.text	0000000000015B08	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::trafficSetNetPermForUids(int,std::__1::vector<int,std::__1::allocator<int>> const&)	.text	0000000000015B10	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::networkSetProtectAllow(int)	.text	0000000000015B18	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkSetProtectDeny(int)	.text	0000000000015B20	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::networkCanProtect(int,bool *)	.text	0000000000015B28	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::firewallSetFirewallType(int)	.text	0000000000015B30	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::firewallSetInterfaceRule(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015B38	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::firewallSetUidRule(int,int,int)	.text	0000000000015B40	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::firewallEnableChildChain(int,bool)	.text	0000000000015B48	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::interfaceGetList(std::__1::vector<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>,std::__1::allocator<std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>>> *)	.text	0000000000015B50	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceGetCfg(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,android::net::InterfaceConfigurationParcel *)	.text	0000000000015B58	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceSetCfg(android::net::InterfaceConfigurationParcel const&)	.text	0000000000015B60	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceSetIPv6PrivacyExtensions(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,bool)	.text	0000000000015B68	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceClearAddrs(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015B70	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceSetEnableIPv6(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,bool)	.text	0000000000015B78	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::interfaceSetMtu(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,int)	.text	0000000000015B80	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherAddForward(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015B88	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::tetherRemoveForward(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015B90	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::setTcpRWmemorySize(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&)	.text	0000000000015B98	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::registerUnsolicitedEventListener(android::sp<android::net::INetdUnsolicitedEventListener> const&)	.text	0000000000015BA0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::firewallAddUidInterfaceRules(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,std::__1::vector<int,std::__1::allocator<int>> const&)	.text	0000000000015BA8	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::firewallRemoveUidInterfaceRules(std::__1::vector<int,std::__1::allocator<int>> const&)	.text	0000000000015BB0	00000008			R	.	.	.	.	.	.
android::net::INetdDefault::trafficSwapActiveStatsMap(void)	.text	0000000000015BB8	00000008			R	.	.	.	.	T	.
android::net::INetdDefault::getOemNetd(android::sp<android::IBinder> *)	.text	0000000000015BC0	00000008			R	.	.	.	.	.	.
'''

reals = []

def getName():
    apis = ApiLists.split("\n")
    for name in apis:
        for func in name.split("::"):
            if func.find("(") != -1:
                reals.append(func.split("(")[0])
    for i, name in enumerate(reals):
        print(str(i + 1) + " -> " + name)


def changeName(start_addr, end_addr):
    '''
    :param start_addr: 接口在虚表中的起始地址
    :param end_addr:   接口在虚表中的终点位置
    :return: None
    '''
    addrs = []
    for addr in range(start_addr, end_addr, 8):
        addrs.append(addr)

    for i,addr in enumerate(addrs):
        # 读取接口函数地址
        funcaddr = idc.get_qword(addr)

        # 将地址转化为函数
        ida_funcs.add_func(funcaddr)

        # 修改函数名称
        bsuccess = idc.set_name(funcaddr, reals[i])
        print("0x%X  -> %s  %s" % (funcaddr, reals[i], str(bsuccess)))

        # 设置虚表中的项为函数偏移
        bsuccess = idc.op_plain_offset(addr,0,0)
        print("op_plain_offset -> " + str(bsuccess))


if __name__ == '__main__':
    getName()
    changeName(0x8E768, 0x8EA58)

跑一下脚本:

函数名都改好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO类day02

JAVA IO java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作. java将IO按照方向划分为输入与输出,参照点是我们写的程序. 输入:用来读取数据的,是从外界到程序的方向,用于获取数据. 输出:用来写出数据的,是从程序到外界的方向,用于发送数据. java将IO比喻为…

15个等轴视图设计的电动车汽车无人机等PR剪辑素材视频制作元素

包含15个等轴视图、等距视角电动车、汽车、无人机、沙漏、飞机等PR剪辑素材视频制作元素mogrt动画模板。 特征&#xff1a; 等距设计&#xff1b; 可以更改颜色&#xff1b; 分辨率&#xff1a;全高清&#xff08;19201080&#xff09;&#xff1b; 持续时间&#xff1a;15秒&a…

第四站:C/C++基础-指针

目录 为什么使用指针 函数的值传递&#xff0c;无法通过调用函数&#xff0c;来修改函数的实参 被调用函数需要提供更多的“返回值”给调用函数 减少值传递时带来的额外开销&#xff0c;提高代码执行效率 使用指针前: 使用指针后: 指针的定义: 指针的含义(进阶): 空指针…

【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

一、关联式容器 vector/list/deque… 这些容器统称为序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是<key, value>结构的键值对 在数据检索时…

ARCGIS PRO SDK 设置UI控件状态:启用/禁用

举例&#xff1a; 第一步&#xff1a;添加两个 Button 分别命名为Connect、Disconnect 第二步&#xff1a;nfig.daml添加状态和条件&#xff1a;在 DAML 中定义条件。请记住&#xff0c;条件存在于模块标记<modules>之外&#xff0c;下代码定义&#xff1a;Disconnected_…

【K8S 云原生】Kurbernets集群的调度策略

目录 一、Kubernetes的list-watch机制 1、List-watch 2、创建pod的过程&#xff1a; 二、scheduler调度的过程和策略&#xff1a; 1、简介 2、预算策略&#xff1a;predicate 3、优先策略&#xff1a; 3.1、leastrequestedpriority&#xff1a; 3.2、balanceresourceal…

计操进程同步(信号量pv灵魂三问法狂练版)

文章目录 解题秘诀-灵魂三问法一 同步问题1.1 围棋问题1.2 数据采集问题1.3 三进程文件打印问题1.4 司机售票员问题 二 同步互斥问题2.1 果盘问题 三 同步资源管控问题3.1 兔子问题3.2 数据写入和读取问题3.3 图书馆问题3.4 超市问题3.4.1 解法一3.4.2 解法二 解题秘诀-灵魂三问…

基于ODBC的数据库应用(MFC)

文章目录 1.预备知识1.数据库概述1.数据库和DBMS2.结构化查询语言SQL(Structured Query Language)3.数据库方式种类1.ODBC(Open DataBase Connectivity)开放数据库连接2.DAO(Data Access Objects)数据访问对象3.OLE DB(OLE数据库) 2.MFC ODBC1.CRecordset类构造记录集属性记录集…

c++学习:容器stack栈+queue+map(简易输入法)+deque

目录 stack 模板原型 头文件 模板的成员类型和成员对象和成员函数 栈类模板的容器对象 实例 queue 模板原型 头文件 模板的成员类型和成员对象和成员函数 队列类模板的容器对象 实例 map 模板原型 头文件 模板的成员类型和成员对象和成员函数 关联类模板的容器…

天锐绿盾|绿盾加密软件|电脑文件防泄密|文件加密|图纸加密软件|源代码加密|源代码防泄密系统|公司办公终端核心文件数据\资料防止外泄管理软件系统!

天锐绿盾是一款专业的数据加密和管理软件&#xff0c;旨在保护企业的重要数据不被泄露或损坏。该软件采用了先进的加密技术&#xff0c;确保数据在存储、传输和使用过程中的安全性。同时&#xff0c;天锐绿盾还提供了完善的管理功能&#xff0c;方便企业对加密数据进行统一管理…

分布式系统架构设计之分布式消息队列架构解析

分布式消息队列架构是构建在分布式系统之上的消息队列架构&#xff0c;旨在提高高性能、高可用性和可伸缩性。它包括以下架构相关部分&#xff1a; 1、架构优势 分布式消息队列架构的优势主要体现在以下几个方面&#xff1a; 01 高可用性 在分布式消息队列架构中&#xff0…

Unity组件开发--相机跟随角色和旋转

1.相机跟随组件&#xff0c;节点&#xff1a; 2.相机跟随组件脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using Unity.Burst.Intrinsics; using UnityEngine; using UnityEngine.UI;public class CameraFollow : Singleton&…

【经验分享】如何看论文的分区、SCI检索号、EI检索号等信息

0 前言 一般而言&#xff0c;被SCI检索的论文&#xff0c;都会同时被EI检索。我们以论文《Learning Disentangled Representation for Multimodal Cross-Domain Sentiment Analysis》为例&#xff0c;讲解一下如何查询论文的各项信息。 我们首先百度这个论文 可以看到它是发表…

python 基础语法 异常 模块 包

异常捕获 try:f open("./abc.txt","r",encoding"UTF-8") except:print("")f open("./abc.txt","w",encoding"UTF-8")#指定异常 try:print(xxx_test) except NameError as e:print(f"error{e}&q…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第22套

少儿编程 蓝桥杯青少组科技素养题真题及解析第22套 1、植物的叶子多为绿色,这主要是因为它们含有 A、绿色色素 B、叶绿素 C、花青素 D、细胞 答案:B 考点分析:主要考查小朋友们生物知识的储备;叶绿素是植物叶子中的一种色素,它可以吸收太阳光中的能量并转化为植物所…

【代码复现系列】paper:CycleGAN and pix2pix in PyTorch

或许有冗余步骤、之后再优化。 1.桌面右键-git bash-输入命令如下【git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix】 2.打开anaconda的prompt&#xff0c;cd到pytorch-CycleGAN-and-pix2pix路径 3.在prompt里输入【conda env create -f environment.y…

数据结构-测试4

一、判断题 1.队列结构的顺序存储会产生假溢出现象。 &#xff08;T&#xff09; 2.度为二的树就是二叉树。(F) 二叉树的度可以小于等于2 3. 栈是插入和删除只能在一端进行的线性表&#xff1b;队列是插入在一端进行&#xff0c;删除在另一端进行的线性表。&#xff08;T&…

使用GraphQL实现简单的增删改查

使用GraphQL实现简单的增删改查 GraphQL官网&#xff1a;https://graphql.cn/ Altair Graphql 调试工具&#xff1a;https://saltair.sirmuel.design/#download 或者添加扩展使用网页版&#xff1a;https://chrome.google.com/webstore/detail/altair-graphql-client/flnheeel…

Ubuntu上安装VMware+win11系统手册

Ubuntu安装vmware 下载&#xff1a; Linux 版下载地址&#xff1a;https://www.vmware.com/go/getworkstation-linux 安装&#xff1a; sudo chmod x VMware-Workstation-Full-17.5.0-22583795.x86_64.bundle 执行安装命令&#xff1a; sudo ./VMware-Workstation-Full-17.5.0…

4.1 Importance of Memory Access Efficiency

到目前为止&#xff0c;我们已经学会了如何编写CUDA内核函数&#xff0c;以及如何通过大量线程配置和协调其执行。在本章中&#xff0c;我们将研究如何组织和定位数据&#xff0c;以便通过大量线程进行高效访问。我们在第2章中讨论了数据并行计算&#xff0c;即数据首先从主机内…