JEB2 script 中调用 api 重命名所有关联函数
来源:互联网 发布:seo伪原创在线生成器 编辑:程序博客网 时间:2024/04/28 06:46
先将光标输入点放到源码文件中的函数名称处~然后使用F2快捷键运行此脚本(JEB 中 F2快捷键的功能是运行最近使用的脚本)
因为此脚本会取光标处的函数,然后查找与其具有相同同重载源的所有函数。。。
PS: JEB2 的脚本,让人写得真是费劲。。。
# -*- coding: utf-8 -*-"""Sample client script for PNF Software's JEB2.More samples are available on our website and within the scripts/ folder.Refer to SCRIPTS.TXT for more information."""import stringimport re,collectionsfrom com.pnfsoftware.jeb.client.api import IScriptfrom com.pnfsoftware.jeb.client.api import IScript, IGraphicalClientContextfrom com.pnfsoftware.jeb.core import RuntimeProjectUtilfrom com.pnfsoftware.jeb.core.actions import Actions, ActionContext, ActionXrefsDatafrom com.pnfsoftware.jeb.core.events import JebEvent, Jfrom com.pnfsoftware.jeb.core.output import AbstractUnitRepresentation, UnitRepresentationAdapterfrom com.pnfsoftware.jeb.core.units.code import ICodeUnit, ICodeItemfrom com.pnfsoftware.jeb.core.units.code.java import IJavaSourceUnit, IJavaStaticField, IJavaNewArray, IJavaConstant, IJavaCall, IJavaField, IJavaMethod, IJavaClassfrom com.pnfsoftware.jeb.core.actions import ActionTypeHierarchyDatafrom com.pnfsoftware.jeb.core.actions import ActionRenameDatafrom com.pnfsoftware.jeb.core.util import DecompilerHelperfrom com.pnfsoftware.jeb.core.output.text import ITextDocumentfrom com.pnfsoftware.jeb.core.units.code.android import IDexUnitfrom com.pnfsoftware.jeb.core.actions import ActionOverridesDatafrom com.pnfsoftware.jeb.core.units import UnitUtilfrom com.pnfsoftware.jeb.core.units import UnitAddressclass JEB2_AutoRenameOverrideMethod(IScript): def run(self, ctx): engctx = ctx.getEnginesContext() if not engctx: print('Back-end engines not initialized') return projects = engctx.getProjects() if not projects: print('There is no opened project') return # 逻辑开始 self.debug = 0 #0=False, 1=True self.ctx = ctx self.prj = projects[0] errMsg1 = u'请移动鼠标,将光标输入点放到源码文件中的函数名称处~然后使用F2快捷键运行此脚本(JEB 中 F2快捷键的功能是运行最近使用的脚本)' errMsg2 = u'未输入新函数名称,脚本已退出' self.focusView = ctx.getFocusedView() if not self.focusView: print(errMsg1) return self.focusFragment = self.focusView.getActiveFragment() if not self.focusFragment: print(errMsg1) return self.focusUnit = self.focusFragment.getUnit() if not self.focusUnit: print(errMsg1) return self.activeAddress = self.focusFragment.getActiveAddress() self.activeItem = self.focusFragment.getActiveItem() itemStr = self.activeItem.toString() if(itemStr.find('cid=METHOD_NAME') < 0): print(errMsg1) return self.focusUnit2 = RuntimeProjectUtil.findUnitsByType(self.prj, ICodeUnit, False)[0]## print(self.focusUnit)## print(self.focusUnit2)## return # 弹出输入框用以输入新函数名 newMethodName = self.ctx.displayQuestionBox('input new function name', 'input new function name\n\n', '') if newMethodName == None: print(errMsg2) return actCntx = ActionContext(self.focusUnit, Actions.QUERY_OVERRIDES, self.activeItem.getItemId(), self.activeAddress) actData = ActionOverridesData() # 获取所有重载了此方法的函数清单,然后逐个重命名 self.nTotal = 0 self.nSucc = 0 self.nFail = 0 if(self.focusUnit.prepareExecution(actCntx, actData)): try: bRlt = self.focusUnit.executeAction(actCntx, actData) if(not bRlt): print('executeAction fail!') else: overrideAddrList = actData.getAddresses() self.nTotal = len(overrideAddrList) for addr in overrideAddrList: #print('renaming %s' % addr) if(self.RenameMeghod(addr, newMethodName)): self.nSucc += 1 else: self.nFail += 1 if(self.debug): break; except Exception,e: print Exception,":",e print('total:%d succ:%d fail:%d' %(self.nTotal, self.nSucc, self.nFail)) print('Done.') ## end of run # 对指定函数进行重命名 def RenameMeghod(self, methodAddr, newMethodName): m = self.GetMethodByAddress(methodAddr) if(not m): print(u'失败 %s' % methodAddr) return False actCntx = ActionContext(self.focusUnit, Actions.RENAME, m.getItemId(), methodAddr) actData = ActionRenameData() actData.setNewName(newMethodName) if(self.focusUnit.prepareExecution(actCntx, actData)): # 执行重命名动作 try: bRlt = self.focusUnit.executeAction(actCntx, actData) if(not bRlt): print(u'失败 %s' % methodAddr) else: print('%s => %s' %(methodAddr, newMethodName)) return True except Exception,e: print Exception,":",e return False ## end of RenameMeghod def GetUnitByAddress(self, addr): decomp = DecompilerHelper.getDecompiler(self.focusUnit2) if not decomp: print('There is no decompiler available for code unit %s' % self.focusUnit2) return tmpUnit = decomp.decompile(addr) self.ctx.openView(tmpUnit) if(self.ctx.getFocusedView().getActiveFragment().setActiveAddress(methodAddr)): print('setActiveAddress succ') return tmpUnit ## end of GetUnitByAddress def GetMethodByAddress(self, addr): found = 0 self.codeUnit = RuntimeProjectUtil.findUnitsByType(self.prj, ICodeUnit, False) if(not self.codeUnit): return None for unit in self.codeUnit: classes = unit.getClasses() if(not classes): continue for c in classes: cAddr = c.getAddress() if(not cAddr): continue if(addr.find(cAddr) == 0): mlist = c.getMethods() if(not mlist): continue for m in mlist: mAddr = m.getAddress() if(addr == mAddr): #print(mAddr) return m return None ## end of GetMethodByAddress
就这,半玩半写的花了一整天,哈哈~~~
0 0
- JEB2 script 中调用 api 重命名所有关联函数
- JEB2 script 中调用 api 重命名所有派生类
- JEB2 script 中通过api获取指定类的TypeHierarchy以遍历其所有派生类
- eclipse中查找函数的所有调用
- eclipse中查找函数的所有调用
- eclipse中查找函数的所有调用
- 在C#中调用windows API函数
- 在C#中调用windows API函数
- ASP中怎么调用API函数
- VB中调用MSN 6.2 API函数
- C#中动态调用API函数
- C++多线程中调用python api函数
- J2ME中调用系统API C函数
- 在C#中调用windows API函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- 在C#中调用windows API函数
- CSS布局十八般武艺都在这里了
- Nginx 模块配置
- mvn help:system下载包失败错误解决!
- 1013. 数素数 (20)-PAT乙级
- UIButton的相关属性
- JEB2 script 中调用 api 重命名所有关联函数
- Mysql命令行练习(1)
- mac下redis 安装与调用
- 一个数字N通过数个固定操作变换为另一个数字M的问题
- IOS如何移除git管理
- ReLu(Rectified Linear Units)激活函数
- TOMCAT8安装环境配置与检验(win8.1,64位)
- 递归算法深入浅出三:递归求Fibonacci斐波那契数列
- PAT1003