Resume

201807的个人简历

Posted by kunnan on August 25, 2018

联系方式(更新时间:2018-11-7)

  • 手机:188 (长沙号码)

  • Email:zhang_kn@icloud.com

  • 微信号:

个人信息

  • 张/男/1992
  • 怀化学院 本科 信息与计算科学 2010.09-2014.06
  • 工作年限:5年
  • 技术博客:https://zhangkn.github.io/tags/ 、https://kunnan.github.io/tags/#security
  • Github:https://github.com/zhangkn
  • 户籍:泉州

求职意向

  • 求职状态:在职,寻新工作
  • 工作性质:全职
  • 期望城市:泉州、厦门
  • 期望职业:iOS&macOS应用逆向与安全工程师,高级iOS工程师
  • 期望薪资:税前月薪20k~40k,特别喜欢的公司可例外

工作经验

2017年07月-至今

湖南微流网络科技有限公司

2013年09月-2017年07月

湖南高阳通联信息技术有限公司

IOS开发工程师、Java程序员

  • 负责iOS的app包括:和包商户版、和包客户端、和聚宝、和包刷卡、商户接入和包支付能力项目 以及为和飞信app 提供安全支付组件
    • 对iOS商户和包支付插件项目进行代码重构,进行底层的网络框架进行封装。独立设计iOS应用架构。
  • java 服务端开发
    • 对高阳ICS 金融平台有较深刻的理解,能熟练开发与第三方系统的接入接出接口
  • 主要职责:完成app的设计、开发、测试、修改bug等工作,包括业务需求的沟通,功能模块详细设计,业务功能实现与单元测试。
    • 除了担任iOS工程师角色外,还担任过项目经理,以及维护支付平台的UI后台管理系统。UI对Portal、IPOS、SMS、Wap、CAS、IVR一共6个渠道提供了规则的配置。

项目经验

2017年07月-至今

ASO(机刷)
  • 项目描述 : AppStore Search optimize ,更多具体细节信息可参考@houshuai0816在GitHub开源的项目knaso

    • 下载流程:清理进程和数据(包括修改设备信息)、切换IP、登录appID、打开App Store、在App Store搜索应用、下载并安装app(打码)、注销app ID、关闭App Store、卸载app
    • 评论流程:在下载流程的基础上进行评论
  • 使用的技术( 举个其中一点,这些在GitHub上都有开源的code,这里只是点到为止)

  • 职责描述 :
    • 负责开发、维护、运维;其中包括适配最新的操作系统版本iOS11
  • 项目业绩 :
    • 下载任务的成功率由40%提升到60%;
    • 优化打码流程,节约成本;
    • 优化进程间的通信;
    • 更换 cydia repo 的方式进行部署,降低运维成本;
    • 优化VPN的切换IP方式;
    • 新增网络异常自动处理流程。

2017年10月-至今

大型app的逆向开发(非越狱App集成、tweak)
  • 项目描述: ios weChat、moon; macOS weChat;逆向系统框架,逆向系统应用;实现一些特殊的功能

  • 职责描述:基于特殊app的现有功能,进行功能的优化延展。

  • 项目业绩:快速按时实现需求功能,集成tweak的App支持非越狱环境以及越狱环境,支持多架构(arm_v7、arm64; 采用lipo -create 解决 dumpdecrypted 之后的架构不匹配的问题)。以及支持系统版本范围:V8-V12

  • 使用的技术

    • 动态库的注入原理:
      • 一个是基于修改Mach-O 的Load Commands,即通过修改可执行文件的Load Commands来实现的. 在Load Commands中增加一个LC_LOAD_DYLIB , 写入dylib路径。Usage: insert_dylib dylib_path binary_path [new_binary_path]
      • 一个是利用环境变量DYLD_INSERT_LIBRARIES,例如使用它进行dumpdecrypted(补充:Clutch 通过posix_spawnp生成一个新的进程,然后暂停进程并dump内存)
      • 另一个是在挂载的进程上创建一个挂起的线程, 然后在这个线程里申请一片用于加载动态库的内存,然后恢复线程,动态库就被注入(通过 taskfor_pid函数获取目标进程句柄,然后通过在进程内创建新线程并执行自己的代码。) cycript 就是以这种方式执行脚本代码。
    • hook 的方式: 一个是通过修改内存中懒加载和非懒加载符号表指针所指向的地址来达到修改方法的目的,作用于主模块懒加载和非懒加载表的符号,在越狱和非越狱环境都可以使用,例如fishhook(符号表替换)。一个是 cydia substrate: 通过inline hook的方式修改目标函数内存中的汇编指令,使其调转到自己的代码块,以达到修改程序的目的;主要是针对c,c++ 函数。同时支持针对oc的method swizzle(替换imp)

      • hooking-swift-methods 利用MSHookFunction、MSFindSymbol进行实现。
        • Using nm , we can dump the Swift symbols

        • Using MSFindSymbol we can find the function pointer to the Swift method, and call it

      • hook MGCopyAnswer 使用了 libcapstone + dlopen+ MSHookFunction
      • facebook/fishhook符号表替换:: struct rebinding { const char *name; void *replacement; void **replaced;};
        • rebind_symbols((struct rebinding[1])\\{\\{"ptrace", my_ptrace, (void*)&orig_ptrace}},1); 第一个参数为需要替换的符号,第二个参数为自己实现的函数名称,第三个参数为原函数地址,因为他是基于地址进行替换的)+ __attribute__((constructor))实现注入
      • ` void MSHookMessageEx(Class _class, SEL sel, IMP imp, IMP *result);`

        • MSHookMessageEx(_logos_class$wxHook$CMessageMgr, @selector(UpdateVoiceMessage:MsgWrap:), (IMP)&_logos_method$wxHook$CMessageMgr$UpdateVoiceMessage$MsgWrap$, (IMP*)&_logos_orig$wxHook$CMessageMgr$UpdateVoiceMessage$MsgWrap$);
      • ` void MSHookFunction(void *symbol, void *replace, void **result);` 注入方式和fishhook 一样,都是基于地址进行hook的

        • MSHookFunction(&CNCopyCurrentNetworkInfo, &newCNCopyCurrentNetworkInfo, &oldCNCopyCurrentNetworkInfo);
        • MSHookFunction((void *)MSFindSymbol(NULL,"_ptrace"), (void *)newptrace, (void **)&oldptrace);
    • object-c 的运行时API: 动态新增属性(objc_setAssociatedObject、objc_getAssociatedObject);修改和获取属性(class_getInstanceVariable、object_setIvar、object_getIvar);swizzling交换替换方法的实现(class_getInstanceMethod、class_addMethod、class_replaceMethod、method_exchangeImplementations,想要执行原来的方法就直接调用replaceMethod,因为方法的实现IMP已经被换了)
    • LLDB+chisel
      • 给/usr/bin/debugserver添加task_for_pid权限, 并开启 debugserver host:port --attach=<process_name>(有五种启动方式:auto、posix、fork、backboard 、frontboard),常用backboard 从头开始调试,例如进行anti ptrace
      • 使用symbolic breakpoint 进行条件断点。
    • 开发的ide和分析工具: theos、monkeydev、lipocycripthopper 进行查看交叉引用,修改汇编、frida-ios-dumpmach-oViewKNtoggle-pie:changes the MH_PIE flag of the MACH-O header on iOS applications to disable ASLR on applications,只支持app,不支持动态库,因为动态库需要ASLR特性的来保证模块基地址不冲突AntiAntiDebug.m

2017年07月-2017年10月

vpn类 iOS app、导购类iOS app、微信小程序等项目

2016年02月-2017年07月

和飞信(iOS APP)
  • 项目描述: 和飞信是中国移动提供的基于4G网络和2G、3G、WLAN、4G四网协同环境下的基础通信服务,是语音、消息和通讯录等基础通信业务在4G下的升级,是力求满足客户基础通信升级和社交需求的新产品。产品形态包括Native终端、手机APP客户端、PC客户端三种
  • 职责描述 :
    • 担任iOS工程师角色:负责和飞信中的扫码付、支付密码管理、绑卡、充流量、发红包功能,以静态库的形式提供
    • 负责书写接入文档,维护技术方案文档,解决联调问题
  • 技术
    • 支付插件中截图反馈功能的实现 pod 'KNPodlib'
    • 设备信息的获取
    • 除了使用UIDevice, 还可以使用sysctl 获取cpu、macaddress信息,以及使用sysctlbyname获取设备型号等信息、 使用CNCopyCurrentNetworkInfo获取ssid、bssid
    • 关于设备ID的心得:
      • 逆向研究一些app的设备ID都是基于CFUUIDCreate、CFUUIDCreateString 进行创建,包括其中的开源的OpenUDID 也是采用CFUUIDCreate、CFUUIDCreateString 进行创建。
      • ` _idfa = [ASIdentifierManager sharedManager].advertisingIdentifier.UUIDString; `
      • ` _idfv = [UIDevice currentDevice].identifierForVendor.UUIDString; `

2015年05月-2015年07月

搭建一个提高开发效率的iOS静态库工程

2015年03月-至今

和包支付能力SDK(iOS CocoaTouchStaticLibrary)
  • 项目描述 :主要用来向其它的应用程序提供便捷、安全以及可靠的支付服务。
  • 职责描述
    • 担任iOS工程师角色。负责整个静态库工程的搭建,以及demo工程的创建
    • 负责和包商户接入支付能力组件的问题解决。
    • 维护接入文档,以及技术方案文档
  • 技术心得体会
    • 体会了采用xcworkspace 进行对xcodeproj的管理的方便。
    • 使用pod lib进行静态库的开发和打包

2015年01月-2017年07月

和包商户版(iOS app)
  • 项目描述 :中国移动面向手机用户及合作商户提供的一项综合性移动支付管理服务.
  • 职责描述 :负责整体app开发和维护
    • 主要功能有消息中心,订单查询,订单消息推送功能、收款。
  • 业务上的收获
    • 商户收款的流程:主要有扫码付、动态密码支付、客户端支付方式进行收款。 此项目嵌入的“我要开店”、“商户资料维护”功能模块 使用H5 实现,方便以后的功能更新;
  • 技术心得
    • 使用coreData 实现消息中心的功能
    • 使用了谓词技术,实现按照日期分组订单列表
    • 使用PushMeBaby工具调试消息推送
    • 采用Charles工具进行问题分析,进行报文分析,修改报文进行开发以及单元测试
    • 总结出app嵌入H5页面的通用模版
      • pod 'KNBaseWebViewController',主要适配webView使用相册的功能。

2014年01月-2017年-07月

和包支付(和包官方iOS客户端)
  • 项目描述 :和包客户端是中国移动和包业务针对手机推出的综合性生活服务平台.和包已发展成为融合了支付、生活服务、购物等多个场景的开放性平台。用户可通过和包客户端在手机上不仅能使用中国移动提供的移动支付服务,如缴话费、收付款、生活缴费、订单支付等,还能在电子券商城购买商品和服务,在带给用户随时随地随身的移动支付体验的同时,还可确保用户交易的安全性和便捷性。 主要功能包括:
    • 1、话费缴纳、流量充值;
    • 2、生活缴费(水费/电费/燃气费);
    • 3、收付款、订单支付、账户充值、提现、账户及交易明细查询、注册和更新;
    • 4、在电子券商城购买商品
  • 职责描述: 担任iOS工程师角色,并担任V3.6-3.9 的项目经理。负责整个项目的进度、风险包括,协调厂商以及技术设计
  • 业务收获
    • 收获了支付产品的业务知识:支付方式主要有有账户和无账户体系。这两个体系下有借记卡和贷记卡支付,以及快捷和无磁有密支付方式。
  • 技术
    • 采用静态库的形式提供安全支付组件给主端集成。优化静态库工程的网络框架的代码,解决了由于更换第三方开源框架导致业务逻辑代码大范围修改的问题。
    • 总结出一套,集成方唤起支付插件,以及支付插件自己退出界面的方法。

2013年11月-2014年01月

UI后台管理系统
  • UI对Portal、IPOS、SMS、Wap、CAS、IVR一共6个渠道提供了规则的配置。包括商户的接入流程审核,用户的身份证审核,清结算、风控、银行入账规则的维护等等。
  • 职责描述 :
    • 负责基础(用户和商户)模块的规则维护
    • 包括以下需求的开发:
      • 平台的报文验签
      • 商户结算打款成功短信通知优化
      • UI系统银行入账配置
      • UI增加商户信用级别商户清单查询
      • UI商户清单信息查询
      • 2014现场商户线上签约协议优化
      • UI系统客户端侧的CCA接口权限配置的快照改造
      • 安卓3.9客户端启动页面配置
      • 客户端公众服务号管理
      • 公众服务消息推送列表查询。
  • 业务收获
    • 熟悉并掌握了支付平台的支付流程、基础模块以及客户端模块的业务
  • 技术收获
    • 对JS、JSP、SQL、Linux技术的进一步巩固.

2013年09月-2014年02月

和包支付平台 (ICS)
  • 项目描述 : 中国移动面向个人和企业客户提供的一项综合性移动支付业务
  • 职责描述 : 担任java工程师。
    • 在无线渠道部门,设计和开发移动客户端的接口,来满足app需求的开发。
    • 通过此角色,能熟练使用高阳的ICS金融平台,对职责链模式有更深刻的理解。掌握了支付密码、登陆密码的加密、转加密流程。

技能清单

1、逆向开发技能

1.1 熟悉的领域
  • iOS 逆向开发,熟悉iphone/tweakiphone/toolcydia的repo 制作cocoapods的Specs repo制作(using-pod-lib-create、private-cocoapods)、使用capstone 对二进制文件进行反汇编来定位方法的地址,以便于MSHookFunction 。
    • 结合lldb、Cycript、hopper、KNHook、以及AFLEXLoader进行分析快速找到入口。

    • 利用lldb、hopper、theos、MonkeyDev、运行时常用的API 进行开发。

    • 具体的通用技能

      Theosiphone/tooliphone/tweak)、socatclass dump
      CycriptluaAFlexLoaderHopperusbMuxd
      CocoaAsyncSockettcpdumpWireshark(rvictl)nm
      symbolicatecrashhost cydia repo jshookdebugserver
      Making CocoaPodsOC底层原理:RuntimeRunloopMach-O
          
      
1.2 例子
1.3 熟悉的iOS模块
  • <Foundation/NSTask.h>: task launch

  • iOS PrivateFrameworks(iPhone:~ root# ls -lrt /System/Library/PrivateFrameworks)

    • 1) MobileWiFi.framework: 启动处理Wi-Fi的连接断开
    • 2) SpringBoardServices.framework
    • 3)/System/Library/PrivateFrameworks/AppStoreDaemon.framework/appstored.bundle/appstored
    • 4)PrivateFrameworks/StoreServices.framework/ SSAccountStore
  • <mach-o/dyld.h>

    • _dyld_get_image_name
    • https://kunnan.github.io/tags/#dyld
  • <SystemConfiguration/CaptiveNetwork.h>

    • CNCopySupportedInterfaces
    • CNCopyCurrentNetworkInfo
  • <sys/sysctl.h>

    • sysctlbyname
  • ios CoreServices

    • /System/Library/CoreServices/SpringBoard.app/SpringBoard
  • MacOSX.sdk/usr/include: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

    • 1) spawn.h:
    • 2)stdio.h: popen(const char *, const char *)
  • jailbreak toolkit

2、 正向技能

  • 个人技术主页

  • 熟悉Swift/C/C++/Objective C/Java,cocoapods的Specs repo制作(using-pod-lib-create、private-cocoapods)

  • 深入理解MRC和ARC内存管理机制;

  • 熟悉iOS中多线程和GCD的使用

    • 0)queue: dispatch_get_global_queue、dispatch_get_main_queue、dispatch_queue_create

    • 1)dispatch:dispatch_after、dispatch_async、dispatch_sync、dispatch_barrier_async( 场景:在写的过程中不能被读:要等到当前所有并发的block都执行完毕,才会单独执行这个barrier block代码块,等到这个barrier block执行完毕,再继续正常处理其他并发bloc)

    • 2)dispatch_group:dispatch_group_t、dispatch_group_async、dispatch_group_wait、dispatch_group_notify、dispatch_group_enter、dispatch_group_leave– 简单的场景:请求多个接口,再进行View的渲染

    • 3) dispatch信号量(dispatch semaphore):

      //    dispatch_semaphore_t  semaphore = dispatch_semaphore_create(0);
      //    dispatch_semaphore_wait(semaphore,dispatch_time(DISPATCH_TIME_NOW, (int64_t)( 16 * NSEC_PER_SEC)));//保证是同步的
      dispatch_semaphore_signal(semaphore);//在特定的条件激活信号,往下执行code;有些场景使用递归实现更好
          
      
  • 熟练使用AFNetworking, MBProgressHUD, MJRefresh, Masonry, SDWebImage等第三方库;熟悉Making CocoaPods;熟练使用git和svn等版本管理工具。

    • 尤其喜欢git_subtree进行以子目录的形式引用外部项目进行管理依赖关系
  • 具有良好的编码习惯, 掌握常用的数据结构和算法;

    • 良好的英文开发文档阅读能力、面向对象编程、链式编程以及常用的设计模式:MVVM、职责链模式
  • unix

    • 1) unix(文件目录结构、df、dm、sort、find、grep、cat、vi、ssh、scp)
    • 2) 自己写的shell工具:https://github.com/zhangkn/KNBin
  • 对前端后台开发技术也有一定的了解;

    • jQuery、JSP、css、html、数据库(sql基本操作)、j2ee(Spring + Struts +Hibernate)、tomcat

技术文章

培训经历

2013.07-2014.01 中信软件教育中心 培训课程: java高级工程师

语言能力

  • 英语 : 听说\读写能力
  • 闽南语

自我评价

  • 充满激情的iOS逆向与安全工程师、高级iOS工程师

    • 1、熟悉Object-C、Swift、lua、iOS&macOS逆向与安全、java、js开发。 常逛的技术论坛是http://iosre.com/。

    • 2、有前后端开发经验者(包括微信小程序开发);

      • 1 年的java开发经验,3年的iOS app 开发经验,2年的iOS&macOS 逆向开发经验
    • 3、对待工作主动积极,责任心强,对代码规范有轻微强迫症,能良好处理人际关系。 爱好游泳、羽毛球、篮球。

    • 4、近期的学习计划:x86和arm的指令集转换,参考Xcode的模拟器的系统库。

    • 更多具体信息

      • https://github.com/zhangkn

      • 实时更新的简历: https://kunnan.github.io/2018/08/25/Resume/

      • 整体的附件简历: https://kunnan.github.io/resume/2018-08-25-Resume.pdf

致谢

感谢您花时间阅读我的简历,期待能有机会和您共事。

转载请注明: > Resume