def isEndOfArticle(self,article,articles): p = utils.convertToInt(utils.getDictValue(article, 'page')) nextPage=p+1 for a in articles: page=utils.getDictValue(a, 'page') page = utils.convertToInt(page) if page == nextPage: return True return False
def getArticle(self, articles, filename): item=None articles = self.getArticles(articles, filename) filePage=0 closest=0 close=0 nearestMatchItem=0 try: if "." in filename: filePage = self.extractPageNumberFromFilename(filename) #in case of a problem if filePage == 0: return item for a in articles: page=utils.convertToInt(utils.getDictValue(a, 'page')) close = filePage - int(page) if close >= 0: if closest > close or nearestMatchItem == 0: item = a nearestMatchItem=page closest=close except Exception as e: print("Error happened!!!!!!!!!!!!!!! "+filename) print(e) return item
def mem_dump(debugger, command, exe_ctx, result, internal_dict): command_args = shlex.split(command, posix=False) _ = exe_ctx.target _ = exe_ctx.thread if len(command_args) != 3: utils.ELOG("[usage] mem_dump outFile addr size") return outfile = command_args[0] start_addr = utils.convertToInt(command_args[1]) size = eval(command_args[2]) if not start_addr: utils.ELOG("params format error") return utils.ILOG("default address will plus main image slide") slide = utils.get_image_slide(debugger, 0) start_addr = start_addr + slide cmd = "memory read --binary --outfile {} --count {} {}".format( outfile, size, start_addr) utils.ILOG("mem dump:{}".format(cmd)) ret = utils.exe_cmd(debugger, cmd) result.AppendMessage(str(ret)) return
def mr(debugger, command, exe_ctx, result, internal_dict): command_args = shlex.split(command, posix=False) _ = exe_ctx.target _ = exe_ctx.thread if len(command_args) != 2: utils.ELOG("[usage] mr addr count") return start_addr = utils.convertToInt(command_args[0]) size = eval(command_args[1]) if not start_addr: utils.ELOG("params format error") return # utils.ILOG("default address will plus main image slide") # slide = utils.get_image_slide(debugger, 0) # start_addr = start_addr + slide cmd = "memory read {} --count {}".format(start_addr, size) utils.ILOG("mem read:{}".format(cmd)) ret = utils.exe_cmd(debugger, cmd) result.AppendMessage(str(ret)) return
def objc_dump_ivars(debugger, obj_addr): command_script = '@import Foundation;NSObject* obj = (NSObject*)' + obj_addr + ';' command_script += r''' NSMutableString* retStr = [NSMutableString string]; typedef struct objc_ivar *Ivar; Class clz = [obj class]; unsigned int count = 0; Ivar *vars = (Ivar *)class_copyIvarList(clz, &count); for (int i=0; i<count; i++) { Ivar var = vars[i]; long offset = (long)ivar_getOffset(var); NSString* varName = [NSString stringWithUTF8String:(const char *)ivar_getName(var)]; NSString* varTypeStr = [NSString stringWithUTF8String:(const char *)ivar_getTypeEncoding(var)]; //NSString* dumpStr = [NSString stringWithFormat:@"-> %@ %@; // %p -> %p", ParseTypeString(varTypeStr)[0], varName, varAddr, *varAddr]; void** varAddr = (void**)((unsigned char *)(__bridge void *)obj + offset); [retStr appendString:varName]; [retStr appendString:@","]; [retStr appendString:varTypeStr]; [retStr appendString:@","]; [retStr appendString:(id)[@((long)varAddr) stringValue]]; [retStr appendString:@"||"]; } retStr ''' retStr = utils.exe_script(debugger, command_script) arr = retStr.strip().split("||") retArr = [] for item in arr: if len(item) <= 0: continue info = item.split(",") if len(info) != 3: continue retArr.append([info[0], info[1], hex(utils.convertToInt(info[2]))]) return retArr
def xmethods(debugger, command, exe_ctx, result, internal_dict): def generate_option_parser(): usage = "usage: xmethods" parser = optparse.OptionParser(usage=usage, prog="lookup") parser.add_option("-a", "--address", action="store", default=None, dest="address", help="set a breakpoint at absolute address") return parser command_args = shlex.split(command, posix=False) parser = generate_option_parser() try: (options, args) = parser.parse_args(command_args) except: result.SetError(parser.usage) return _ = exe_ctx.target _ = exe_ctx.thread def is_address(args): if len(args) == 0: return False arg = args[0] if len(arg) == 0: return False ret = re.match('^0x[0-9a-fA-F]+$', arg) if not ret: return False return True clz = args[0] obj = clz if is_address(args): clz = objc_obj_name(debugger, args[0]) ret = objc_dump_methods(debugger, clz) utils.ILOG("Dump methods for {}({})".format(obj, clz)) # print(ret) for method in ret: if len(method) < 4: utils.ELOG("Error method!") break addr = hex(utils.convertToInt(method[2])) retType = method[3] retTypeList = objc_parse_typesign(method[3]) if retTypeList and len(retTypeList) > 0: retType = retTypeList[0] selname = method[1] argCount = len(method) - 4 if argCount > 0: global methodArgIdx arr = method[4:] methodArgIdx = 0 def handler(reobj): global methodArgIdx r = reobj.group(0) argType = arr[methodArgIdx] argTypeList = objc_parse_typesign(argType) if argTypeList and len(argTypeList) > 0: argType = argTypeList[0] r = r + "(" + argType + ")" + "a" + str(methodArgIdx) + " " methodArgIdx = methodArgIdx + 1 return r selname = re.sub(":", handler, selname, flags=0) line = "\t{} ({}){};// {}".format(method[0], retType, selname, addr) print(line) # result.AppendMessage("command is still developing. please wait...\n") return parser
import readline except ImportError: pass import socket import sys from SimpleFTPClientInterpreter import SimpleFTPClientInterpreter from utils import checkNumArgs, convertToInt, debugPrint from utils import recvAll, recvFile, recvLine, sendStr, sendFile if __name__ == "__main__": checkNumArgs(3) hostName = sys.argv[1] port = convertToInt(sys.argv[2]) try: hostIP = socket.gethostbyname(hostName) ctrlSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ctrlSock.connect((hostIP, port)) except socket.gaierror: print("CLIENT: Cannot resolve hostname \"{host}\"".format(host=hostName)) except socket.error: print("CLIENT: Cannot connect to {host}:{port}".format(host=hostName, port=port)) else: print("CLIENT: Connected to {host}:{port}.".format(host=hostName, port=port)) print("Welcome to Peter's Simple File Transfer Client. Enter commands below, or HELP.") shell = SimpleFTPClientInterpreter(ctrlSock, (hostIP, port)) while not shell.isFinished():
# copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. ################################################################################ """This module (serv.py) provides the threading server. It can be invoked with a desired port number as follows: $ ./threadserv.py <port>""" import sys from libserver import threadingServer_listenForever from utils import checkNumArgs, convertToInt from SimpleFTPServerConnection import SimpleFTPServerConnectionHandler if __name__ == "__main__": checkNumArgs(2) servPort = convertToInt(sys.argv[1]) threadingServer_listenForever(servPort, SimpleFTPServerConnectionHandler)
def pblock(debugger, command, exe_ctx, result, internal_dict): command_args = shlex.split(command, posix=False) _ = exe_ctx.target _ = exe_ctx.thread block_addr_raw = command_args[0] block_addr = utils.convertToInt(block_addr_raw) if block_addr: utils.ILOG("block addr:{}".format(hex(block_addr))) else: utils.ELOG("block addr format err:{}".format(block_addr_raw)) return header = ''' enum { BLOCK_HAS_COPY_DISPOSE = (1 << 25), BLOCK_HAS_CTOR = (1 << 26), // helpers have C++ code BLOCK_IS_GLOBAL = (1 << 28), BLOCK_HAS_STRET = (1 << 29), // IFF BLOCK_HAS_SIGNATURE BLOCK_HAS_SIGNATURE = (1 << 30), }; struct Block_literal_1 { void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor_1 { unsigned long int reserved; // NULL unsigned long int size; // sizeof(struct Block_literal_1) // optional helper functions void (*copy_helper)(void *dst, void *src); // IFF (1<<25) void (*dispose_helper)(void *src); // IFF (1<<25) // required ABI.2010.3.16 const char *signature; // IFF (1<<30) } *descriptor; // imported variables }; ''' code = header code += 'struct Block_literal_1 real = *((struct Block_literal_1 *)(void*){});'.format( block_addr) code += ''' NSString* ret = @""; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:[NSNumber numberWithLong:(long)real.invoke] forKey:@"invoke"]; #if 0 if (real.flags & BLOCK_HAS_SIGNATURE) { char *signature; if (real.flags & BLOCK_HAS_COPY_DISPOSE) { signature = (char *)(real.descriptor)->signature; } else { signature = (char *)(real.descriptor)->copy_helper; } NSMethodSignature *sig = [NSMethodSignature signatureWithObjCTypes:signature]; NSMutableArray *types = [NSMutableArray array]; [types addObject:[NSString stringWithUTF8String:(char *)[sig methodReturnType]]]; for (NSUInteger i = 0; i < sig.numberOfArguments; i++) { char *type = (char *)[sig getArgumentTypeAtIndex:i]; [types addObject:[NSString stringWithUTF8String:type]]; } [dict setObject:types forKey:@"signature"]; } NSMutableArray* sigArr = dict[@"signature"]; if(!sigArr){ ret = [NSString stringWithFormat:@"Imp: 0x%lx", [dict[@"invoke"] longValue]]; }else{ NSMutableString* sig = [NSMutableString stringWithFormat:@"%@ ^(", decode(sigArr[0])]; for (int i = 2; i < sigArr.count; i++) { if(i == sigArr.count - 1){ [sig appendFormat:@"%@", decode(sigArr[i])]; }else{ [sig appendFormat:@"%@ ,", decode(sigArr[i])]; } } [sig appendString:@");"]; ret = [NSString stringWithFormat:@"Imp: 0x%lx Signature: %s", [dict[@"invoke"] longValue], [sig UTF8String]]; } ret #else dict #endif ''' ret = utils.exe_script(debugger, code) print(ret)