frida的rpc远程调用

  1. # -*- coding: UTF-8 -*-
  2. import frida
  3. import sys
  4. jsCode = """
  5. Java.perform(function(){
  6. var RequestUtil = Java.use('com.dodonew.online.http.RequestUtil');
  7. RequestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation
  8. = function(a, b, c){
  9. console.log('data: ', a);
  10. console.log('desKey: ', b);
  11. console.log('desIV: ', c);
  12. var retval = this.encodeDesMap(a, b, c);
  13. send( retval);
  14. return retval;
  15. }
  16. var Utils = Java.use('com.dodonew.online.util.Utils');
  17. Utils.md5.implementation = function(a){
  18. console.log('MD5 string: ', a);
  19. var retval = this.md5(a);
  20. send( retval);
  21. recv(function(obj){retval =obj.data}).wait();
  22. return retval;
  23. }
  24. function test(data){
  25. var result = "";
  26. Java.perform(function(){
  27. result = Java.use('com.dodonew.online.util.Utils').md5(data);
  28. });
  29. return result;
  30. }
  31. rpc.exports = {
  32. rpcfunc: test
  33. };
  34. });
  35. """
  36. def message_1(message, data):
  37. print(message)
  38. if message["type"] == 'send':
  39. print(u"[*] {0}".format(message['payload']))
  40. script.post({'data': message['payload']})
  41. else:
  42. print(message)
  43. process = frida.get_usb_device().attach('com.dodonew.online')
  44. script = process.create_script(jsCode)
  45. script.load()
  46. script.on('message', message_1)
  47. print("开始运行")
  48. result = script.exports.rpcFUnc('equtype=ANDROID&loginImei=Androidnull&timeStamp=1626790668'
  49. +'522&userPwd=a12345678&username=15968079477&key=sdlkjsdljf0j2fsjk')
  50. print("result -> ",result)
  51. sys.stdin.read()
  • js代码处:rpc.exports = {rpcfunc: xxx}python代码处:script.exports.rpcfunc()/script.exports.RPCFUNC()
  • js代码处:rpc.exports = {rpcFUnc: xxx}python代码处:script.exports.rpc_f_unc()
  • python代码处不管rpcfunc还是RPCFUNC,都代表js中的rpcfunc。要表示大写,python代码处需要在字母前面加下划线,比如_f代表js代码中的F

    算法转发-get

  1. 本地服务部署
  • pip install fastapi
  • pip install uvicorn ```python

    -- coding: UTF-8 --

    import frida import sys import uvicorn from fastapi import FastAPI

jsCode = “”” function aa(cc){ var result; Java.perform(function () { result = Java.use(‘com.dodonew.online.util.Utils’).md5(cc); }) return result; } rpc.exports = { bb: aa }; “””

process = frida.get_device_manager().add_remote_device(‘IP:8888’).attach(“com.dodonew.online”) script = process.create_script(jsCode) script.load()

app = FastAPI() @app.get(“/get”) async def getEchoApi(cc): data = script.exports.bb(cc) return {“plaintext”: cc, “result”: data}

if name == ‘main‘: uvicorn.run(app, port = 12345)

  1. 疑问点,开一个接口供别人调用这种方式,不知道为啥只能用“frida.get_device_manager().add_remote_device”这种方式;原因待挖掘!!!
  2. <a name="bjnbB"></a>
  3. #### 算法转发-post
  4. ```python
  5. # -*- coding: UTF-8 -*-
  6. import frida
  7. import sys
  8. import uvicorn
  9. from pydantic import BaseModel
  10. from fastapi import FastAPI
  11. jsCode = """
  12. function aa(cc){
  13. var result;
  14. Java.perform(function () {
  15. result = Java.use('com.dodonew.online.util.Utils').md5(cc);
  16. })
  17. return result;
  18. }
  19. rpc.exports = {
  20. bb: aa
  21. };
  22. """
  23. process = frida.get_device_manager().add_remote_device('IP:8877').attach("com.dodonew.online")
  24. script = process.create_script(jsCode)
  25. script.load()
  26. class plainojb(BaseModel):
  27. 参数: str = None
  28. app = FastAPI()
  29. @app.post("/post")
  30. async def getEchoApi(postData: plainojb):
  31. result = script.exports.bb(postData.参数)
  32. return {"plaintxt": postData.参数, "encryptdata": result}
  33. if __name__ == '__main__':
  34. uvicorn.run(app, port = 12345)

image.png

外网服务部署

待补充