diff --git a/README.MD b/README.MD index 9e52fe5..2439811 100644 --- a/README.MD +++ b/README.MD @@ -7,7 +7,7 @@ * **优雅的使用webstorm开发(拥有智能完美的智能提示,内置了一些调试库) ** * **支持资源嵌入,CModule嵌入 ** -![](gif/run.webp) +![](md/gif/run.webp) #### a brief introdction * **frida runtime (no python required, only a single file)** @@ -15,7 +15,7 @@ #### [预编译的二进制文件在这里下载](https://github.com/a97077088/fd/releases) -![](gif/bagbak.webp) +![](md/gif/bagbak.webp) #### 什么是frida: - **世界顶级全平台逆向动态调试框架** diff --git a/README_EN.MD b/README_EN.MD index d401113..5ac3db9 100644 --- a/README_EN.MD +++ b/README_EN.MD @@ -13,11 +13,11 @@ * ** ** * -![](gif/run.webp) +![](md/gif/run.webp) #### [Precompiled binaries can be downloaded here](https://github.com/a97077088/fd/releases) -![](gif/bagbak.webp) +![](md/gif/bagbak.webp) #### what's frida: - **The world's top full platform reverse dynamic debugging framework** diff --git a/docker-compse.yml b/docker-compse.yml deleted file mode 100644 index f2035e1..0000000 --- a/docker-compse.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: "3" -services: - test: - container_name: frida-test - image: ubuntu - ports: - - "23946:23946" - networks: - - vnet - volumes: - - ./example:/data - tty: true -networks: - vnet: - driver: bridge \ No newline at end of file diff --git a/frida-agent-example/agent/box.ts b/frida-agent-example/agent/box.ts deleted file mode 100644 index 90e87bb..0000000 --- a/frida-agent-example/agent/box.ts +++ /dev/null @@ -1,32 +0,0 @@ -export class Box{ - static MapBox = new Map(); - static Uint8Array(fpath:string):Uint8Array{ - var str=Box.Get(fpath) - var arr = []; - for (var i = 0, j = str.length; i < j; ++i) { - arr.push(str.charCodeAt(i)); - } - var tmpUint8Array = new Uint8Array(arr); - return tmpUint8Array - } - static String(fpath:string):string{ - return Box.Get(fpath) - } - static Get(fpath:string):any{ - // @ts-ignore - fpath=fpath.replaceAll("\\","/") - - if(fpath.startsWith(".")){ - fpath=fpath.replace(".","") - } - if(fpath.startsWith("/")){ - fpath=fpath.replace("/","") - } - console.log(fpath) - if(!Box.MapBox.has(fpath)){ - return "" - } - return Box.MapBox.get(fpath) - } -} - diff --git a/frida-agent-example/agent/box/test.txt b/frida-agent-example/agent/box/test.txt deleted file mode 100644 index b5754e2..0000000 --- a/frida-agent-example/agent/box/test.txt +++ /dev/null @@ -1 +0,0 @@ -ok \ No newline at end of file diff --git a/frida-agent-example/agent/index.ts b/frida-agent-example/agent/index.ts index 44a9c0b..35a38ac 100644 --- a/frida-agent-example/agent/index.ts +++ b/frida-agent-example/agent/index.ts @@ -1,5 +1,2 @@ -import { log } from "./logger"; -import {observeClass} from "./ios/objc-method-observer"; - -log("frida hello") +console.log("frida hello") diff --git a/frida-agent-example/agent/ios/app-info.ts b/frida-agent-example/agent/ios/app-info.ts deleted file mode 100644 index fe96b57..0000000 --- a/frida-agent-example/agent/ios/app-info.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Convenience functions to access app info. - * Dump key app paths and metadata: - * appInfo() - * - * Print contents of Info.plist: - * infoDictionary() - * - * Query Info.plist by key: - * infoLookup("NSAppTransportSecurity") - * - */ - -// @ts-ignore -export function dictFromNSDictionary(nsDict) { - var jsDict = {}; - var keys = nsDict.allKeys(); - var count = keys.count(); - for (var i = 0; i < count; i++) { - var key = keys.objectAtIndex_(i); - var value = nsDict.objectForKey_(key); - // @ts-ignore - jsDict[key.toString()] = value.toString(); - } - - return jsDict; -} - -// @ts-ignore -export function arrayFromNSArray(nsArray) { - var jsArray = []; - var count = nsArray.count(); - for (var i = 0; i < count; i++) { - jsArray[i] = nsArray.objectAtIndex_(i).toString(); - } - return jsArray; -} - -export function infoDictionary() { - if (ObjC.available && "NSBundle" in ObjC.classes) { - var info = ObjC.classes.NSBundle.mainBundle().infoDictionary(); - return dictFromNSDictionary(info); - } - return null; -} - -// @ts-ignore -export function infoLookup(key) { - if (ObjC.available && "NSBundle" in ObjC.classes) { - var info = ObjC.classes.NSBundle.mainBundle().infoDictionary(); - var value = info.objectForKey_(key); - if (value === null) { - return value; - } else if (value.class().toString() === "__NSCFArray") { - return arrayFromNSArray(value); - } else if (value.class().toString() === "__NSCFDictionary") { - return dictFromNSDictionary(value); - } else { - return value.toString(); - } - } - return null; -} - -export function appInfo() { - var output = {}; - // @ts-ignore - output["Name"] = infoLookup("CFBundleName"); - // @ts-ignore - output["Bundle ID"] = ObjC.classes.NSBundle.mainBundle().bundleIdentifier().toString(); - // @ts-ignore - output["Version"] = infoLookup("CFBundleVersion"); - // @ts-ignore - output["Bundle"] = ObjC.classes.NSBundle.mainBundle().bundlePath().toString(); - // @ts-ignore - output["Data"] = ObjC.classes.NSProcessInfo.processInfo().environment().objectForKey_("HOME").toString(); - // @ts-ignore - output["Binary"] = ObjC.classes.NSBundle.mainBundle().executablePath().toString(); - return output; -} \ No newline at end of file diff --git a/frida-agent-example/agent/ios/cc_md5.ts b/frida-agent-example/agent/ios/cc_md5.ts deleted file mode 100644 index 299f888..0000000 --- a/frida-agent-example/agent/ios/cc_md5.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function hook_CC_MD5(callback:(buf:NativePointer,len:number)=>void,callback1:(hash:NativePointer)=>void){ - var CC_MD5=Module.getExportByName(null,"CC_MD5") - Interceptor.attach(CC_MD5,{ - onEnter:function(args){ - callback(args[0],args[1].toInt32()) - }, - onLeave:function (r){ - callback1(r) - } - }) -} \ No newline at end of file diff --git a/frida-agent-example/agent/ios/hex.ts b/frida-agent-example/agent/ios/hex.ts deleted file mode 100644 index 6c81768..0000000 --- a/frida-agent-example/agent/ios/hex.ts +++ /dev/null @@ -1,7 +0,0 @@ - -export function PointerHexString(p:NativePointer,n:number) { - var hex = [] - for(var i=0;ivoid){ - Interceptor.attach(loadL_bufferPtr,{ - onEnter:function (args) { - // console.log(args[2].readCString(args[3].toInt32())) - var script=args[1].readCString(args[2].toInt32()) - if(args[4].toInt32()!=0x00){ - var scriptFileName=args[4].readCString() - if(scriptFileName==null){ - scriptFileName="" - } - callback(scriptFileName,args[1],args[2].toInt32()) - }else{ - callback("",args[1],args[2].toInt32()) - } - - }, - onLeave:function (r) { - - } - }) -} -export function hook_tolua_tostring(tolua_tostringPtr:NativePointer,callback:(str:string)=>void){ - Interceptor.attach(tolua_tostringPtr,{ - onLeave:function (r) { - var s=r.readCString() - if(s!=null){ - callback(s) - } - } - }) -} \ No newline at end of file diff --git a/frida-agent-example/agent/ios/objc-method-observer.ts b/frida-agent-example/agent/ios/objc-method-observer.ts deleted file mode 100644 index dfb45fe..0000000 --- a/frida-agent-example/agent/ios/objc-method-observer.ts +++ /dev/null @@ -1,107 +0,0 @@ -/* - * To observe a single class by name: - * observeClass('NSString'); - * - * To dynamically resolve methods to observe (see ApiResolver): - * observeSomething('*[* *Password:*]'); - */ - -var ISA_MASK = ptr('0x0000000ffffffff8'); -var ISA_MAGIC_MASK = ptr('0x000003f000000001'); -var ISA_MAGIC_VALUE = ptr('0x000001a000000001'); - -// @ts-ignore -export function observeSomething(pattern) { - var resolver = new ApiResolver('objc'); - // @ts-ignore - var things = resolver.enumerateMatchesSync(pattern); - // @ts-ignore - things.forEach(function (thing) { - observeMethod(thing.address, '', thing.name); - }); -} - -// @ts-ignore -export function observeClass(name) { - var k = ObjC.classes[name]; - if (!k) { - return; - } - k.$ownMethods.forEach(function (m) { - observeMethod(k[m].implementation, name, m); - }); -} - -// @ts-ignore -export function observeMethod(impl, name, m) { - console.log('Observing ' + name + ' ' + m); - Interceptor.attach(impl, { - onEnter: function (a) { - this.log = []; - this.log.push('(' + a[0] + ') ' + name + ' ' + m); - if (m.indexOf(':') !== -1) { - var params = m.split(':'); - params[0] = params[0].split(' ')[1]; - for (var i = 0; i < params.length - 1; i++) { - if (isObjC(a[2 + i])) { - const theObj = new ObjC.Object(a[2 + i]); - this.log.push(params[i] + ': ' + theObj.toString() + ' (' + theObj.$className + ')'); - } else { - this.log.push(params[i] + ': ' + a[2 + i].toString()); - } - } - } - - this.log.push(Thread.backtrace(this.context, Backtracer.ACCURATE) - .map(DebugSymbol.fromAddress).join("\n")); - }, - - onLeave: function (r) { - if (isObjC(r)) { - this.log.push('RET: ' + new ObjC.Object(r).toString()); - } else { - this.log.push('RET: ' + r.toString()); - } - - console.log(this.log.join('\n') + '\n'); - } - }); -} - -// @ts-ignore -export function isObjC(p) { - var klass = getObjCClassPtr(p); - return !klass.isNull(); -} - -// @ts-ignore -export function getObjCClassPtr(p) { - /* - * Loosely based on: - * https://blog.timac.org/2016/1124-testing-if-an-arbitrary-pointer-is-a-valid-objective-c-object/ - */ - - if (!isReadable(p)) { - return NULL; - } - var isa = p.readPointer(); - var classP = isa; - if (classP.and(ISA_MAGIC_MASK).equals(ISA_MAGIC_VALUE)) { - classP = isa.and(ISA_MASK); - } - if (isReadable(classP)) { - return classP; - } - return NULL; -} - -// @ts-ignore -export function isReadable(p) { - try { - p.readU8(); - return true; - } catch (e) { - return false; - } -} - diff --git a/frida-agent-example/agent/ios/syscall.ts b/frida-agent-example/agent/ios/syscall.ts deleted file mode 100644 index c57f3d3..0000000 --- a/frida-agent-example/agent/ios/syscall.ts +++ /dev/null @@ -1,62 +0,0 @@ -export function watchSysCall(){ - var base; - var do_dlopen:NativePointer = NULL; - var call_ctor:NativePointer = NULL; -//Module.load('/data/data/com.sbi.lotusintouch/execve_arm64.so'); - var table = {0: 'io_setup', 1: 'io_destroy', 2: 'io_submit', 3: 'io_cancel', 4: 'io_getevents', 5: 'setxattr', 6: 'lsetxattr', 7: 'fsetxattr', 8: 'getxattr', 9: 'lgetxattr', 10: 'fgetxattr', 11: 'listxattr', 12: 'llistxattr', 13: 'flistxattr', 14: 'removexattr', 15: 'lremovexattr', 16: 'fremovexattr', 17: 'getcwd', 18: 'lookup_dcookie', 19: 'eventfd2', 20: 'epoll_create1', 21: 'epoll_ctl', 22: 'epoll_pwait', 23: 'dup', 24: 'dup3', 25: 'fcntl', 26: 'inotify_init1', 27: 'inotify_add_watch', 28: 'inotify_rm_watch', 29: 'ioctl', 30: 'ioprio_set', 31: 'ioprio_get', 32: 'flock', 33: 'mknodat', 34: 'mkdirat', 35: 'unlinkat', 36: 'symlinkat', 37: 'linkat', 38: 'renameat', 39: 'umount2', 40: 'mount', 41: 'pivot_root', 42: 'nfsservctl', 43: 'statfs', 44: 'fstatfs', 45: 'truncate', 46: 'ftruncate', 47: 'fallocate', 48: 'faccessat', 49: 'chdir', 50: 'fchdir', 51: 'chroot', 52: 'fchmod', 53: 'fchmodat', 54: 'fchownat', 55: 'fchown', 56: 'openat', 57: 'close', 58: 'vhangup', 59: 'pipe2', 60: 'quotactl', 61: 'getdents64', 62: 'lseek', 63: 'read', 64: 'write', 65: 'readv', 66: 'writev', 67: 'pread64', 68: 'pwrite64', 69: 'preadv', 70: 'pwritev', 71: 'sendfile', 72: 'pselect6', 73: 'ppoll', 74: 'signalfd4', 75: 'vmsplice', 76: 'splice', 77: 'tee', 78: 'readlinkat', 79: 'fstatat', 80: 'fstat', 81: 'sync', 82: 'fsync', 83: 'fdatasync', 84: 'sync_file_range', 85: 'timerfd_create', 86: 'timerfd_settime', 87: 'timerfd_gettime', 88: 'utimensat', 89: 'acct', 90: 'capget', 91: 'capset', 92: 'personality', 93: 'exit', 94: 'exit_group', 95: 'waitid', 96: 'set_tid_address', 97: 'unshare', 98: 'futex', 99: 'set_robust_list', 100: 'get_robust_list', 101: 'nanosleep', 102: 'getitimer', 103: 'setitimer', 104: 'kexec_load', 105: 'init_module', 106: 'delete_module', 107: 'timer_create', 108: 'timer_gettime', 109: 'timer_getoverrun', 110: 'timer_settime', 111: 'timer_delete', 112: 'clock_settime', 113: 'clock_gettime', 114: 'clock_getres', 115: 'clock_nanosleep', 116: 'syslog', 117: 'ptrace', 118: 'sched_setparam', 119: 'sched_setscheduler', 120: 'sched_getscheduler', 121: 'sched_getparam', 122: 'sched_setaffinity', 123: 'sched_getaffinity', 124: 'sched_yield', 125: 'sched_get_priority_max', 126: 'sched_get_priority_min', 127: 'sched_rr_get_interval', 128: 'restart_syscall', 129: 'kill', 130: 'tkill', 131: 'tgkill', 132: 'sigaltstack', 133: 'rt_sigsuspend', 134: 'rt_sigaction', 135: 'rt_sigprocmask', 136: 'rt_sigpending', 137: 'rt_sigtimedwait', 138: 'rt_sigqueueinfo', 139: 'rt_sigreturn', 140: 'setpriority', 141: 'getpriority', 142: 'reboot', 143: 'setregid', 144: 'setgid', 145: 'setreuid', 146: 'setuid', 147: 'setresuid', 148: 'getresuid', 149: 'setresgid', 150: 'getresgid', 151: 'setfsuid', 152: 'setfsgid', 153: 'times', 154: 'setpgid', 155: 'getpgid', 156: 'getsid', 157: 'setsid', 158: 'getgroups', 159: 'setgroups', 160: 'uname', 161: 'sethostname', 162: 'setdomainname', 163: 'getrlimit', 164: 'setrlimit', 165: 'getrusage', 166: 'umask', 167: 'prctl', 168: 'getcpu', 169: 'gettimeofday', 170: 'settimeofday', 171: 'adjtimex', 172: 'getpid', 173: 'getppid', 174: 'getuid', 175: 'geteuid', 176: 'getgid', 177: 'getegid', 178: 'gettid', 179: 'sysinfo', 180: 'mq_open', 181: 'mq_unlink', 182: 'mq_timedsend', 183: 'mq_timedreceive', 184: 'mq_notify', 185: 'mq_getsetattr', 186: 'msgget', 187: 'msgctl', 188: 'msgrcv', 189: 'msgsnd', 190: 'semget', 191: 'semctl', 192: 'semtimedop', 193: 'semop', 194: 'shmget', 195: 'shmctl', 196: 'shmat', 197: 'shmdt', 198: 'socket', 199: 'socketpair', 200: 'bind', 201: 'listen', 202: 'accept', 203: 'connect', 204: 'getsockname', 205: 'getpeername', 206: 'sendto', 207: 'recvfrom', 208: 'setsockopt', 209: 'getsockopt', 210: 'shutdown', 211: 'sendmsg', 212: 'recvmsg', 213: 'readahead', 214: 'brk', 215: 'munmap', 216: 'mremap', 217: 'add_key', 218: 'request_key', 219: 'keyctl', 220: 'clone', 221: 'execve', 222: 'mmap', 223: 'fadvise64', 224: 'swapon', 225: 'swapoff', 226: 'mprotect', 227: 'msync', 228: 'mlock', 229: 'munlock', 230: 'mlockall', 231: 'munlockall', 232: 'mincore', 233: 'madvise', 234: 'remap_file_pages', 235: 'mbind', 236: 'get_mempolicy', 237: 'set_mempolicy', 238: 'migrate_pages', 239: 'move_pages', 240: 'rt_tgsigqueueinfo', 241: 'perf_event_open', 242: 'accept4', 243: 'recvmmsg', 244: 'arch_specific_syscall', 260: 'wait4', 261: 'prlimit64', 262: 'fanotify_init', 263: 'fanotify_mark', 264: 'name_to_handle_at', 265: 'open_by_handle_at', 266: 'clock_adjtime', 267: 'syncfs', 268: 'setns', 269: 'sendmmsg', 270: 'process_vm_readv', 271: 'process_vm_writev', 272: 'kcmp', 273: 'finit_module', 274: 'sched_setattr', 275: 'sched_getattr', 276: 'renameat2', 277: 'seccomp', 278: 'getrandom', 279: 'memfd_create', 280: 'bpf', 281: 'execveat', 282: 'userfaultfd', 283: 'membarrier', 284: 'mlock2', 285: 'copy_file_range', 286: 'preadv2', 287: 'pwritev2', 288: 'pkey_mprotect', 289: 'pkey_alloc', 290: 'pkey_free', 291: 'statx', 292: 'syscalls'} - - // @ts-ignore - function consoleLog(text: string) { - const dt = new Date(); - const message = `[${dt.toUTCString().replace(" GMT", "")}.${dt.getMilliseconds()}] ${text}`; - console.log(message); - } - - // @ts-ignore - Process.findModuleByName('linker64').enumerateSymbols().forEach(function(sym) { - if (sym.name.indexOf('do_dlopen') >= 0) { - do_dlopen = sym.address; - //consoleLog("dl_open : ",do_dlopen); - } else if (sym.name.indexOf('call_constructor') >= 0) { - call_ctor = sym.address; - //consoleLog("call_ctor : ",call_ctor) - } - }); - - var md = new ModuleMap(); - - Interceptor.attach(do_dlopen, function () { - // @ts-ignore - var lib = this.context['x0'].readUtf8String(); - consoleLog("do_dlopen: " + lib); - var ourlib = 'libDexHelper.so'; - - if (lib.indexOf(ourlib)>-1) { - Interceptor.attach(call_ctor, function () { - - //Interceptor.detachAll(); - //consoleLog('call_ctor'); - const mod = Process.findModuleByName(ourlib); - // @ts-ignore - mod.enumerateRanges('--x').forEach(function (range) { - Memory.scanSync(range.base, range.size, '01 00 00 d4').forEach(function (match) { - Interceptor.attach(match.address, function () { - // @ts-ignore - var sc = parseInt(this.context['x8']); - //consoleLog('syscall ',table[sc],'['+sc+']'); - if(sc == 0x38) { - // @ts-ignore - const msg = md.findName(this.returnAddress)+' : syscall openat("'+this.context['x1'].readUtf8String()+'",'+this.context['x2']+','+this.context['x3']+')'; - consoleLog(msg); - } else { - // @ts-ignore - consoleLog(md.findName(this.returnAddress)+' : syscall ',table[sc],'['+sc+']'); - } - }); - }); - }); - }); - } - }); - -} \ No newline at end of file diff --git a/frida-agent-example/agent/ios/utils.ts b/frida-agent-example/agent/ios/utils.ts deleted file mode 100644 index 7a2193a..0000000 --- a/frida-agent-example/agent/ios/utils.ts +++ /dev/null @@ -1,183 +0,0 @@ -export var NSData = ObjC.classes.NSData; -export var NSString = ObjC.classes.NSString; - -// @ts-ignore -export function NsStr(str) { - return ObjC.classes.NSString.stringWithUTF8String_(Memory.allocUtf8String(str)); -} - -/* NSString -> NSData */ - -// @ts-ignore -export function NsStr2NsData(nsstr) { - return nsstr.dataUsingEncoding_(4); -} - -/* NSData -> NSString */ - -// @ts-ignore -export function NsData2NsStr(nsdata) { - return ObjC.classes.NSString.alloc().initWithData_encoding_(nsdata, 4); -} - -/* Print Native Callstack */ -export function showCallstack() { - // @ts-ignore - console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("\n") + "\n"); -} - -export function showCallstack1() { - console.log(ObjC.classes.NSThread.callStackSymbols().toString()); -} - -export function getScreenSize() { - var UIScreen = ObjC.classes.UIScreen; - return UIScreen.mainScreen().bounds()[1]; -} - -// 获取keychain数据 -export function getKeychain() { - var NSMutableDictionary = ObjC.classes.NSMutableDictionary; - // @ts-ignore - var kCFBooleanTrue = ObjC.Object(getExportFunction("d", "kCFBooleanTrue")); - // @ts-ignore - var kSecReturnAttributes = ObjC.Object(getExportFunction("d", "kSecReturnAttributes")); - // @ts-ignore - var kSecMatchLimitAll = ObjC.Object(getExportFunction("d", "kSecMatchLimitAll")); - // @ts-ignore - var kSecMatchLimit = ObjC.Object(getExportFunction("d", "kSecMatchLimit")); - // @ts-ignore - var kSecClassGenericPassword = ObjC.Object(getExportFunction("d", "kSecClassGenericPassword")); - // @ts-ignore - var kSecClassInternetPassword = ObjC.Object(getExportFunction("d", "kSecClassInternetPassword")); - // @ts-ignore - var kSecClassCertificate = ObjC.Object(getExportFunction("d", "kSecClassCertificate")); - // @ts-ignore - var kSecClassKey = ObjC.Object(getExportFunction("d", "kSecClassKey")); - // @ts-ignore - var kSecClassIdentity = ObjC.Object(getExportFunction("d", "kSecClassIdentity")); - // @ts-ignore - var kSecClass = ObjC.Object(getExportFunction("d", "kSecClass")); - - var query = NSMutableDictionary.alloc().init(); - // @ts-ignore - var SecItemCopyMatching = getExportFunction("f", "SecItemCopyMatching", "int", ["pointer", "pointer"]); - [kSecClassGenericPassword, kSecClassInternetPassword, kSecClassCertificate, kSecClassKey, - kSecClassIdentity].forEach(function (secItemClass) { - query.setObject_forKey_(kCFBooleanTrue, kSecReturnAttributes); - query.setObject_forKey_(kSecMatchLimitAll, kSecMatchLimit); - query.setObject_forKey_(secItemClass, kSecClass); - var result = Memory.alloc(8); - result.writePointer(ptr(0)); - SecItemCopyMatching(query.handle, result); - var pt = result.readPointer(); - if (!pt.isNull()) { - console.log(new ObjC.Object(pt).toString()); - } - } - ) -} - -// @ts-ignore -export function getClassModule(classname) { - // @ts-ignore - var objc_getClass = new NativeFunction(Module.findExportByName(null, "objc_getClass"), "pointer", ["pointer"]); - // @ts-ignore - var class_getImageName = new NativeFunction(Module.findExportByName(null, "class_getImageName"), "pointer", - ["pointer"]); - var class_ = objc_getClass(Memory.allocUtf8String(classname)); - // @ts-ignore - return Memory.readUtf8String(class_getImageName(class_)); -} - -// @ts-ignore -export function getAddressModule(address) { - // @ts-ignore - var dladdr = new NativeFunction(Module.findExportByName(null, "dladdr"), "int", ["pointer", "pointer"]); - var info = Memory.alloc(Process.pointerSize * 4); - dladdr(ptr(address), info); - return { - // @ts-ignore - "fname": Memory.readUtf8String(Memory.readPointer(info)), - // @ts-ignore - "fbase": Memory.readPointer(info.add(Process.pointerSize)), - // @ts-ignore - "sname": Memory.readUtf8String(Memory.readPointer(info.add(Process.pointerSize * 2))), - // @ts-ignore - "saddr": Memory.readPointer(info.add(Process.pointerSize * 3)), - } -} - -/* Get all modules */ -function getmodule() { - // @ts-ignore - var modules = Process.enumerateModulesSync(); - // @ts-ignore - return modules.map(function (item) { - return item['path']; - }); -} - - -// 强制过证书校验 -export function forceTrustCert() { - // @ts-ignore - Interceptor.replace(Module.findExportByName(null, 'SecTrustEvaluate'), - new NativeCallback(function (trust, result) { - // @ts-ignore - Memory.writePointer(result, ptr('0x1')); - console.log('pass SecTrustEvaluate'); - return 0; - }, 'int', ['pointer', 'pointer']) - ); - /* 获取app路径下的可执行模块 hook存在以下方法的类 - - evaluateServerTrust:forDomain: - - allowInvalidCertificates - - shouldContinueWithInvalidCertificate - */ - // @ts-ignore - var apppath = Process.enumerateModulesSync()[0]['path']; - apppath = apppath.slice(0, apppath.lastIndexOf('/')); - // @ts-ignore - getmodule().forEach(function (module, i) { - if (module.indexOf(apppath) != 0) return; - // @ts-ignore - getClassModule(module).forEach(function (classname, j) { - // @ts-ignore - getClassModule(classname).forEach(function (methodinfo, k) { - var name = methodinfo['name']; - if (name == '- evaluateServerTrust:forDomain:' || - name == '- allowInvalidCertificates' || - name == '- shouldContinueWithInvalidCertificate') { - console.log("forcetrustcert " + classname + " " + name); - Interceptor.attach(methodinfo['imp'], { - onEnter: function (args) { - console.log("forcetrustcert " + classname + " " + name); - }, - onLeave: function (retval) { - retval.replace(ptr('0x1')); - } - }); - } - }); - }); - }); -} - -export function traceView() { - var UIApplication = ObjC.classes.UIApplication; - Interceptor.attach(UIApplication["- sendAction:to:from:forEvent:"].implementation, { - onEnter: function (args) { - // @ts-ignore - var action = Memory.readUtf8String(args[2]); - // @ts-ignore - var toobj = ObjC.Object(args[3]); - // @ts-ignore - var fromobj = ObjC.Object(args[4]); - // @ts-ignore - var event = ObjC.Object(args[5]); - console.log('SendAction:' + action + ' to:' + toobj.toString() + - ' from:' + fromobj.toString() + ' forEvent:' + event.toString() + ']'); - } - }); -} diff --git a/frida-agent-example/agent/ios/v8.ts b/frida-agent-example/agent/ios/v8.ts deleted file mode 100644 index a1f052c..0000000 --- a/frida-agent-example/agent/ios/v8.ts +++ /dev/null @@ -1,40 +0,0 @@ -export function dump_ScriptEngine_evalString(ScriptEngineEvalStringPtr:NativePointer){ - Interceptor.attach(ScriptEngineEvalStringPtr,{ - onEnter:function (args) { - // console.log(args[2].readCString(args[3].toInt32())) - var script=args[1].readCString(args[2].toInt32()) - if(args[4].toInt32()!=0x00){ - var scriptFileName=args[4].readCString() - console.log(scriptFileName) - send({"type":"download","path":scriptFileName,"append":false},args[1].readByteArray(args[2].toInt32())) - }else{ - console.log(script) - } - - }, - onLeave:function (r) { - - } - }) -} -export function hook_ScriptEngine_evalString(ScriptEngineEvalStringPtr:NativePointer,callback:(scriptName:String,scriptStrBuffer:NativePointer,scriptLen:number)=>void){ - Interceptor.attach(ScriptEngineEvalStringPtr,{ - onEnter:function (args) { - // console.log(args[2].readCString(args[3].toInt32())) - var script=args[1].readCString(args[2].toInt32()) - if(args[4].toInt32()!=0x00){ - var scriptFileName=args[4].readCString() - if(scriptFileName==null){ - scriptFileName="" - } - callback(scriptFileName,args[1],args[2].toInt32()) - }else{ - callback("",args[1],args[2].toInt32()) - } - - }, - onLeave:function (r) { - - } - }) -} \ No newline at end of file diff --git a/frida-agent-example/agent/logger.ts b/frida-agent-example/agent/logger.ts deleted file mode 100644 index 6849f63..0000000 --- a/frida-agent-example/agent/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function log(message: string): void { - console.log(message); -} diff --git a/frida-agent-example/package.json b/frida-agent-example/package.json index 4d2a2a9..981d8f2 100644 --- a/frida-agent-example/package.json +++ b/frida-agent-example/package.json @@ -10,8 +10,8 @@ "watch": "frida-compile agent/index.ts -o _agent.js -w" }, "devDependencies": { - "@types/frida-gum": "^16.2.0", - "@types/node": "^14.14.10", - "frida-compile": "^10.0.0" + "@types/frida-gum": "^18.0.0", + "@types/node": "^17.0.31", + "frida-compile": "^10.2.5" } } diff --git a/go.mod b/go.mod index 2ed847b..378176d 100644 --- a/go.mod +++ b/go.mod @@ -14,14 +14,14 @@ require ( require ( github.com/VividCortex/ewma v1.2.0 // indirect github.com/a97077088/dylib v0.0.0-20210726041103-cf42039dadef // indirect - github.com/a97077088/libfridabinres v0.0.0-20211129032410-90a659d091e8 // indirect + github.com/a97077088/libfridabinres v0.0.0-20220509035009-6d703145730f // indirect github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.9.0 // indirect - github.com/goccy/go-json v0.7.10 // indirect + github.com/go-playground/validator/v10 v10.11.0 // indirect + github.com/goccy/go-json v0.9.7 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect @@ -29,10 +29,10 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/ugorji/go/codec v1.2.6 // indirect - golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 // indirect - golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect + github.com/ugorji/go/codec v1.2.7 // indirect + golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 // indirect + golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect golang.org/x/text v0.3.7 // indirect - google.golang.org/protobuf v1.27.1 // indirect + google.golang.org/protobuf v1.28.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 403fe57..27f9075 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/a97077088/frida-go v0.0.0-20210730162326-5858a01c2323 h1:biL+dMSijuVR github.com/a97077088/frida-go v0.0.0-20210730162326-5858a01c2323/go.mod h1:t1Q6YshypLGY5bs/aZT7UH3Ty/HKR7Gx8UcR7B0/HNY= github.com/a97077088/libfridabinres v0.0.0-20211129032410-90a659d091e8 h1:UzhTu7BgHPoH2NwYhNCYAAKxYNYiLOunsDbNzl9LHns= github.com/a97077088/libfridabinres v0.0.0-20211129032410-90a659d091e8/go.mod h1:ooSNVs9odQ8D99rUL1SsXoYDiXzC5yGvdWG1sYeir+0= -github.com/a97077088/libfridabinres v0.0.0-20211129035148-01e45d61fdeb h1:rbK6AtbM1PjKWmDyapz0TutSdv12cUsCC1l6UxPnCiY= -github.com/a97077088/libfridabinres v0.0.0-20211129035148-01e45d61fdeb/go.mod h1:ooSNVs9odQ8D99rUL1SsXoYDiXzC5yGvdWG1sYeir+0= +github.com/a97077088/libfridabinres v0.0.0-20220509035009-6d703145730f h1:lC843YvHOtxXndVyPdUD8UmP/skdzwPR9bPxulBbGMs= +github.com/a97077088/libfridabinres v0.0.0-20220509035009-6d703145730f/go.mod h1:ooSNVs9odQ8D99rUL1SsXoYDiXzC5yGvdWG1sYeir+0= github.com/cheggaaa/pb/v3 v3.0.9-0.20211017104833-bbc97ac48688 h1:AeQGqUgkBDfGczBXHgq2OvydYhx1xRiNpbPhWZ+avsc= github.com/cheggaaa/pb/v3 v3.0.9-0.20211017104833-bbc97ac48688/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -22,8 +22,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.2-0.20211128012617-a06d546f5c2e h1:+yXWs5biTn/sxM/zqj9Y9g14Bnmg7IpjnorlKiuJ36s= @@ -34,11 +34,13 @@ github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A= github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw= +github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/goccy/go-json v0.7.10 h1:ulhbuNe1JqE68nMRXXTJRrUu0uhouf0VevLINxQq4Ec= github.com/goccy/go-json v0.7.10/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -108,10 +110,12 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= -github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/unrolled/render v1.4.1 h1:VdpMc2YkAOWzbmC/P2yoHhRDXgsaCQHcTJ1KK6SNCA4= github.com/unrolled/render v1.4.1/go.mod h1:cK4RSTTVdND5j9EYEc0LAMOvdG11JeiKjyjfyZRvV2w= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -119,10 +123,9 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSEmmlyVS4kxBNkeA9tLJiTI= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8= +golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -130,8 +133,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -154,10 +158,9 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -180,8 +183,9 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/md/api.md b/md/api.md index c90db2f..bd401f0 100644 --- a/md/api.md +++ b/md/api.md @@ -1,4 +1,4 @@ -![](../gif/api.webp) +![](gif/api.webp) #### api(导出api) 使用方法: ```` diff --git a/md/bagbak.md b/md/bagbak.md index c213703..6dc0bee 100644 --- a/md/bagbak.md +++ b/md/bagbak.md @@ -1,4 +1,4 @@ -![](../gif/bagbak.webp) +![](gif/bagbak.webp) #### bagbak(ipa脱壳) 使用方法: diff --git a/md/compile.md b/md/compile.md index 21efa01..462c003 100644 --- a/md/compile.md +++ b/md/compile.md @@ -1,4 +1,4 @@ -![](../gif/compile.webp) +![](gif/compile.webp) #### compile(显示进程列表) 使用方法: ```` diff --git a/md/create.md b/md/create.md index ea299a4..9608393 100644 --- a/md/create.md +++ b/md/create.md @@ -1,4 +1,4 @@ -![](../gif/create.webp) +![](gif/create.webp) #### create(创建工程) 使用方法: ```` diff --git a/gif/api.webp b/md/gif/api.webp similarity index 100% rename from gif/api.webp rename to md/gif/api.webp diff --git a/gif/bagbak.webp b/md/gif/bagbak.webp similarity index 100% rename from gif/bagbak.webp rename to md/gif/bagbak.webp diff --git a/gif/compile.webp b/md/gif/compile.webp similarity index 100% rename from gif/compile.webp rename to md/gif/compile.webp diff --git a/gif/create.webp b/md/gif/create.webp similarity index 100% rename from gif/create.webp rename to md/gif/create.webp diff --git a/gif/lsapp.webp b/md/gif/lsapp.webp similarity index 100% rename from gif/lsapp.webp rename to md/gif/lsapp.webp diff --git a/gif/lsdev.webp b/md/gif/lsdev.webp similarity index 100% rename from gif/lsdev.webp rename to md/gif/lsdev.webp diff --git a/gif/lsps.webp b/md/gif/lsps.webp similarity index 100% rename from gif/lsps.webp rename to md/gif/lsps.webp diff --git a/gif/run.webp b/md/gif/run.webp similarity index 100% rename from gif/run.webp rename to md/gif/run.webp diff --git a/md/lsapp.md b/md/lsapp.md index 5db08ba..ffac8a7 100644 --- a/md/lsapp.md +++ b/md/lsapp.md @@ -1,4 +1,4 @@ -![](../gif/lsapp.webp) +![](gif/lsapp.webp) #### lsapp(显示app列表) 使用方法: ```` diff --git a/md/lsdev.md b/md/lsdev.md index b8f5e86..66ac2f1 100644 --- a/md/lsdev.md +++ b/md/lsdev.md @@ -1,4 +1,4 @@ -![](../gif/lsdev.webp) +![](gif/lsdev.webp) #### lsdev(显示所有设备列表) 使用方法: ```` diff --git a/md/lsps.md b/md/lsps.md index 38bc978..ccc0d22 100644 --- a/md/lsps.md +++ b/md/lsps.md @@ -1,4 +1,4 @@ -![](../gif/lsps.webp) +![](gif/lsps.webp) #### lsps(显示进程列表) 使用方法: ```` diff --git a/md/run.md b/md/run.md index 0ef4782..e604fc8 100644 --- a/md/run.md +++ b/md/run.md @@ -1,4 +1,4 @@ -![](../gif/run.webp) +![](gif/run.webp) #### 如果进程不存在,并且是Applicatoin,那么将以spawn模式启动