求指教,关于打断点的问题
使用usbmuxd 连接SSH 报错ssh_exchange_identification: Connection closed by remote host连接不上
@Alan_xz wrote:
使用usbsbmuxd连接SSH
终端输入:
AlandeiMac:USBSSH Alanpython tcprelay.py 22:2222
Forwarding local port 2222 to remote port 22
Incoming connection to 2222
Waiting for devices...
Connecting to device <MuxDevice: ID 1 ProdID 0x12a8 Serial '57fe8578a65bc8faee5babd864b0bd3c2505aead' Location 0x14200000>
Connection established, relaying data
Connection closed
新建终端输入报错:AlandeiMac:~ Alan$ ssh root@localhost -p 2222
ssh_exchange_identification: Connection closed by remote host
AlandeiMac:~ Alan$操作步骤好像没问题 之前10.2版本是可以的 现在用的是iOS9.2
Posts: 4
Participants: 2
正确获取struct结构体的内容
@yoursmile wrote:
需求:获取struct里的信息
struct cTopicInfo {
basic_string_a490aa4c _field1;
basic_string_a490aa4c _field2;
int _field3;
_Bool _field4;
_Bool _field5;
_Bool _field6;
_Bool _field7;
_Bool _field8;
int _field9;
int _field10;
int _field11;
int _field12;
struct cClueInfo *_field13;
int _field14;
int _field15;
int _field16;
int _field17;
int _field18;
int _field19;
basic_string_a490aa4c _field20;
basic_string_a490aa4c _field21;
basic_string_a490aa4c _field22;
basic_string_a490aa4c _field23;
...然后 basic_string_a490aa4c 这是
typedef struct basic_string<char, std::1::char_traits, std::1::allocator> {
struct compressed_pair<std::1::basic_string<char, std::1::char_traits, std::1::allocator>::rep, std::1::allocator> {
struct __rep {
union {
struct __long {
char *_data;
unsigned long long _size;
unsigned long long _cap;
} __l;
struct __short {
char _data[23];
struct {
unsigned char _size;
} ;
} __s;
struct __raw {
unsigned long long __words[3];
} __r;
} ;
} _first;
} _r;
} basic_string_a490aa4c;是 std::string
应该是24位
但是debug下看到的是
8位很奇怪,然后就导致了tweak里面结构体里面的变量位置偏移不正确需求2:要能正常获取到字符串
先不管需求1的结构体我写了这样一个结构体struct cTopicInfo {
std::string _field1;
std::string _field2;
std::string _field3;
std::string _field4;
std::string _field5;
std::string _field6;
std::string _field7;
std::string _field8;
std::string _field9;
std::string _field10;
std::string _field11;
std::string _field12;
std::string _field13;
std::string _field14;
std::string _field15;
std::string _field16;
std::string _field17;
std::string _field18;
std::string _field19;
std::string _field20;
std::string _field21;
std::string _field22;
};
按照上面说的
现在能拿到这个结构体的地址,能利用地址 po (char*)(0x000xxxxxxxxx+ 0x70)....获取到具体信息
但是这样却不行
abc是这个结构体,_field17偏移是0x70然后我又发现了
_field18 偏移为 0x88
这样在内存存在的字符串,_field18能正常获取到。
问题就是怎么才能正常获取到字符串呢还有需求3:
如果1,2都解决了,需求3就可以不用管了
Posts: 1
Participants: 1
关于在tweak.xm中通过偏移获取值的问题
@yoursmile wrote:
需求:通过一个void 的变量然后能像终端一样 po (char)(0x0000xxxx + 0x 10)这样获取到0x10这个偏移的具体值,怎么在tweak.xm中实现呢
Posts: 1
Participants: 1
一个拥有ROOT权限的APP 在iOS 9上运行闪退
@Alan_xz wrote:
崩溃信息如下:
Dyld Message: Library not loaded: @rpath/AFNetworking.framework/AFNetworking
Referenced from: /Applications/ReverseTest.app/ReverseTest_
Reason: image not found
Dyld Version: 370.6
操作步骤
1、dylib与.app打了一个拥有root权限的 deb包 ,安装后闪退 。怀疑是postinst问题
代码如下!/bin/bash
cd "/Applications/ReverseTest.app/"
process origin binary
mv ReverseTest ReverseTest_
chown root.wheel ReverseTest_
chmod +s ReverseTest_cont=`cat <<"EOF"
!/bin/bash
dir=$(dirname "$0")
exec "${dir}"/ReverseTest_ "$@"
EOF
`create new fake binary
echo -e "$cont" > ReverseTest
chown root.wheel ReverseTest
chmod +x ReverseTestThe RESPRING script after Install
declare -a cydia
cydia=($CYDIA)if [[ $1 == install || $1 == upgrade ]]; then
if [[ ${CYDIA+@} ]]; then
eval "echo 'finish:restart' >&${cydia[0]}"
fi
fiexit
注:好像在10.0以上不会出现闪退,真机运行是正常,去掉root 代码和postinst 与插件同时打包也是正常 ,加上postinst 就会闪退。
Posts: 2
Participants: 1
[威锋网国际战队] 全球移动应用&游戏平台,诚邀iOS/Android逆向加入
@eyerwang wrote:
职位名称:iOS/Android逆向工程师(国际战队)
工作性质:全职 工作地点:深圳南山业务介绍:
威锋网国际战队—兔兔助手(tutuapp.com )是全球化的移动应用&游戏分发平台,在全球拥有近2亿用户,支持iOS与Android双平台,支持十多国语言。从2013年开始帮助国内及海外的应用&游戏做全球发布及变现推广。兔兔助手团队高能智勇,全明星阵容期待您的加入。简历接收邮箱:hedy.huo@office.feng.com、eyer.wang@office.feng.com
岗位描述:
1、负责iOS或Android已有游戏、应用逆向破解工作;
2、有较强的逆向后辅助插件开发能力,完成插件功能开发工作。岗位要求:
1、熟练阅读汇编代码和C/C++代码,熟悉逆向工程,尤其熟悉动态分析,有较强的逆向分析能力和软件破解经验;
2、熟练使用IDA、Hopper Disassembler、lldb、APKTOOL、Jeb等逆向分析调试工具;
3、熟悉ARM、ARM64指令集、熟悉常见公开加密算法;
4、熟练常见Hook技术;
5、熟悉iOS/Android常用反混淆手段;
6、做过iOS/Android游戏或应用逆向分析 ;
7、会写Tweak和Python辅助分析脚本(iOS逆向);
8、能够逆向分析出游戏、应用中的api接口调用、加密等,满足插件功能开发 ;
9、技术视野广阔,有主导iOS/Android逆向技术方案设计的能力和经验,能够独立承担iOS/Android逆向项目开发工作;
10、有逆向的iOS/Android游戏、应用产品开发经验者优先。
Posts: 1
Participants: 1
Theos hook 报错 error: redefinition of '_logos_meta_orig
@voidwu wrote:
菜鸟练习逆向,theos hook 报如下错,不知道是什么原因,求大牛指点,谢谢!
Tweak.xm:23:593: error: redefinition of 'logosmeta_orig$_ungrouped$MJHTTPRequest$calculateReuqestHashBaseStringWithHTTPRequest$'
...Class LOGOSSELF_CONST, SEL, id); static id (*logosmeta_orig$ungrouped$MJHTTPRequest$calculateReuqestHashBaseStringWithHTTPRequest$)(LOGOS_SEL...
^
Tweak.xm:23:256: note: previous definition is here
...SEL, id); static id logosmeta_method$ungrouped$TuneUtils$hashSha256$(LOGOS_SELF_TYPE_NORMAL Class LOGOSSELF_CONST, SEL, id); static id (*logosmeta_...
Posts: 2
Participants: 2
针对Macho文件如何通过_dyld_get_image_header及其偏移量定位到对应的方法
@SpringMorning wrote:
需求:
本人在学习逆向的过程中阅读到如下代码,由于知识储备不够,因此想请教一二。
代码:void *targetMethod = NULL; void init() { const char *path = "XXXUI"; uint32_t i; for (i = 0; i < _dyld_image_count(); i++) { if (strstr(_dyld_get_image_name(i), path) != 0) break; } const struct mach_header *targetHeader = _dyld_get_image_header(i); targetMethod = (char *)targetHeader + 0x1234c5;
}
static void attribute((noinline)) attribute((naked)) exec_target_method(void *f, char *ret)
{
asm volatile("stp x29, x30, [sp, -0x10]!");
asm volatile("mov x2, x0");
asm volatile("mov x0, x1");
asm volatile("blr x2");
asm volatile("ldp x29, x30, [sp], 0x10");
asm volatile("ret");
}void doExec()
{
char value[128];
memset(szr, 0, sizeof(value));
exec_target_method(targetMethod, (char *)value);
int *pv = (int *)value;
NSLog(@"return value is %0x----%0x----%0x", pv[0], pv[1], pv[2]);
}操作步骤:
本人对该代码的认识如下:
(1)init方法先遍历内存中加载的模块,并通过对比模块的名称来获取到目标模块。然后通过_dyld_get_image_header方法来获取内存中目标模块的头部指针targetHeader。最后通过在头部指针targetHeader上加一个偏移量0x1234c5来获取到目标方法的地址。
** 任何其他描述: (描述问题的现象,等等)
(2)exec_target_method方法通过裸函数( attribute((naked)) )的方式直接通过汇编语言来调用init方法中获取到的方法地址(blr x2)。并将结果ret返回。
(3)doExec是最终的执行方法,向exec_target_method中传递目标方法地址和目标入参,并在方法执行完毕后打印返回结果。
问题归纳:
(1)请问上述对代码的认识是否正确?因为本人现在的逆向知识仅限于书中,现在阅读这样的代码还是有点吃力,有些理解是通过网上搜索获得。
(2)关于init方法中通过_dyld_get_image_header获取的目标模块头部指针和通过偏移量获取到的目标方法指针,如何通过这两个指针在IDA或者Hopper中定位到目标方法?
(3)偏移值0x1234c5当初是如何计算出来的?
(4)可以熟练阅读并编写上述代码需要的深入了解学习的知识点有哪些?本人在逆向学习的过程中深感学得越多,自己尚未了解和需要掌握的知识点越多,因此,对于需要深入学习哪些知识有些迷茫,还望不吝赐教,谢谢!
Posts: 1
Participants: 1
调试自己的写的代码无法进入汇编状态
@iceiPhone wrote:
想研究下block(arr,YES)这个传值在汇编下是怎么调用的,自己写了个代码
- (void)press {
void(^block)(NSArray *arr,BOOL flag) = ^(NSArray *arr,BOOL flag){
NSLog(@"arr = %@,flag = %d",arr,flag);
};NSArray *arr = @[@"1",@"2",@"3"]; block(arr,YES);
}
xcode编译完安装到设备上,lldb进行调试,下完断点,总是显示如下
- thread #1: tid = 0x5e9aa, 0x000b7382 Debug
-[ViewController press](self=0x1563d1a0, _cmd="press") at ViewController.m:27, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
-[ViewController press](self=0x1563d1a0, _cmd="press") at ViewController.m:27 [opt]
frame #0: 0x000b7382 Debug
24 }
25
26
-> 27 - (void)press {
28 void(^block)(NSArray *arr,BOOL flag) = ^(NSArray *arr,BOOL flag){
29 NSLog(@"arr = %@,flag = %d",arr,flag);
30 };
(lldb)明明只想看汇编,怎么直接符号化了,尝试去掉符号表,也是不行,这个是什么情况,求解。要是第三方能这样,我都会笑出来,但是现在我只想调试汇编,囧。
Posts: 2
Participants: 1
漏洞扫描+iOS,这两者是否可行?
@cris wrote:
https://tech.meituan.com/Android-Code-Arbiter.html
漏洞扫描目前在安卓机上的应用较多,在iOS比较少?
原因是什么呢?是否有必要也为iOS开发漏洞扫描工具呢?
Posts: 1
Participants: 1
添加反注入方法后模拟器崩溃
@guany wrote:
看了论坛之前的帖子,发现可以通过添加
-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
来进行反注入。但是在自己的APP中的Other Linker Flags添加该字段后,模拟器运行程序后会崩溃。信息如下:
在真机下运行则没有问题,请问各位大佬,这个问题有办法解决吗?
或者还有什么别的方法可以反注入吗?
谢谢!
Posts: 5
Participants: 3
Lldb调试时怎么打印出一个结构体的内容
卸載App在theos導入private framework MobileInstallation無法成功
@wangdu wrote:
各位大大下午好,小弟在實作這位大神給的demo code。
自己研究大約三天了,主要卡在以下問題:
第一個問題,在theos make package的時候出現ld: framework not found MobileInstallation錯誤:
按照書本上的指導得知,若要引用私用框架需要寫上MyProject_PRIVATE_FRAMEWORKS = MobileInstallation
但是在mack package的時候始終顯示not found。
我去過/opt/theos底下找的到~/opt/theos/include/PrivateFrameworks/MobileInstallation: CDStructures.h MobileInstallerDelegateProtocol-Protocol.h MIInstallerClient.h MobileInstallerProtocol-Protocol.h
我去過iphone 8.1.2手機上用openssh看過也有:
/System/Library/PrivateFrameworks/MobileInstallation.framework /System/Library/PrivateFrameworks/MobileInstallation.framework/Info.plist /System/Library/PrivateFrameworks/MobileInstallation.framework/_CodeSignature /System/Library/PrivateFrameworks/MobileInstallation.framework/_CodeSignature/CodeResources /private/var/mobile/Library/Logs/MobileInstallation /private/var/mobile/Library/Logs/MobileInstallation/mobile_installation.log.0 /private/var/mobile/Library/Logs/MobileInstallation/mobile_installation.log.1 /private/var/mobile/Library/MobileInstallation /private/var/mobile/Library/MobileInstallation/AppMigratorLastSystemVersion.plist /private/var/mobile/Library/MobileInstallation/DiskImagesInfo.plist /private/var/mobile/Library/MobileInstallation/LastBuildInfo.plist /private/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist /private/var/mobile/Library/MobileInstallation/UninstalledApplications.plist
我也去過電腦上的xcode底下也找得到~/Library/Developer/Xcode/iOS DeviceSupport/8.1.2 (12B440)/Symbols/System/Library/PrivateFrameworks/MobileInstallation.framework
所以我可以斷定這個框架他是存在的,但書上第33頁也有提到該如何導入私用框架,因此想請問大大,哪個地方我做錯了?該怎麼修正錯誤?
第二個問題就是以下這段程式碼是我參考原文作者和網上其他資料的,執行上始終死在 if (mobileInstallationUninstallForLaunchServices)這邊,所以我判定是私用框架沒有成功導入,無法呼叫MobileInstallationUninstall這個方法,或者另一個可能是iOS8.1.2已經沒有這個方法?我在想第一個問題解決了,或許第二個問題也會有頭緒。因為這兩個問題是連貫的所以放在一起,如不符合發帖規則,此無視第二問題,專注第一問題。
typedef void (*MobileInstallationCallback)(CFDictionaryRef information); typedef int (* MobileInstallationUninstallForLaunchServices)(CFStringRef bundleIdentifier, CFDictionaryRef parameters, MobileInstallationCallback callback, void *unknown); - (void)unInstallTap:(id)sender { NSLog(@"uninstalling..."); void *lib = dlopen("/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation", RTLD_LAZY); if (lib) { MobileInstallationUninstallForLaunchServices mobileInstallationUninstallForLaunchServices = (MobileInstallationUninstallForLaunchServices)dlsym(lib, "MobileInstallationUninstall"); if (mobileInstallationUninstallForLaunchServices) { CFStringRef identifier = CFStringCreateWithCString(kCFAllocatorDefault, [BundleID UTF8String], kCFStringEncodingUTF8); int ret = mobileInstallationUninstallForLaunchServices(identifier, NULL, NULL, NULL); CFRelease(identifier); // return ret; NSLog(@"iOSRE Uninstall: %d", ret); } else { NSLog(@"iOSRE mobileInstallationUninstallForLaunchServices nil"); } } else { NSLog(@"iOSRE lib nil"); } }
感謝大大們撥空解答!
Posts: 1
Participants: 1
Make package install安装是否可以通过usb将包安装到手机,而不是通过THEOS_DEVICE_IP
@xiaoleiwei wrote:
设备:iPhone 6s
版本:10.2
问题描述:之前通过ip连接ssh一直连接不上,所以采用了usb的连接方式。如今make package install的时候再次碰到通过IP无法连接不上的问题,所以想知道有没有Makefile文件中的THEOS_DEVICE_IP = x.x.x.x是否可以通过usb来代替,如果能代替的话,应该怎么设置?卡在这里不动了
C9F03AF8-7805-4FB3-B97A-9F23F36B3480.png
Posts: 4
Participants: 3
山寨论坛真好玩
AppleTrace 简易App性能分析工具
@everettjf wrote:
背景
一般情况下使用Instruments(主要是Time Profiler)进行iOS App的性能分析就足够了,但是Time Profiler 把调用方法都合并了起来,失去了时序的表现。直到有一天看到Android开发的同事使用 systrace 分析性能,systrace生成一个html文件,把函数(方法)的调用耗时按照先后顺序表现出来。心里想:要是iOS也有这样的工具就好了。了解到这个html文件是 catapult 生成的。
一天看到iosre论坛一篇hook objc_msgSend的帖子。突然想到,可以结合catapult来生成Objective C方法的性能分析图(暂且这么叫吧)。(虽然一直也有hook objc_msgSend的方法,但这次煮好的佳肴终于仍不住下手了)。
说搞就开始搞,暂停几天开发MOEX。近期一直利用少之又少的业余时间蜗牛般开发MOEX,但现在看来
生成性能分析图
更是重要,回想过去的一些苦力加班,如果能生成这个性能分析图,当时岂不是很快就解决问题了。目标
hook 所有的objc_msgSend,也就是把每个Objective C方法的耗时计算出来,并按照先后顺序生成
性能分析图
。要解决的问题
如何生成最终的html
从这里可以了解到catapult是如何生成html的。其中一种方式可以是:Chrome's trace_event format。简单来说,
trace_event format
就是个json格式,按照这个约定的json格式填充数据后,就可以使用trace2html命令(python脚本)转换为最终的html文件了。$CATAPULT/tracing/bin/trace2html my_trace.json --output=my_trace.html && open my_trace.html
如何Hook objc_msgSend
见文章使用HookZz快速逆向(Hack objc_msgSend) 理清逻辑
HookZz是jmpnews开发的微型hook框架,使用起来十分灵活。详见 https://jmpews.github.io/zzpp/
如何生成trace_event format的json文件
参考文档 Chrome's trace_event format 可以了解到,最简单的json文件,可以是这样:
[ {"name": "Asub", "cat": "PERF", "ph": "B", "pid": 22630, "tid": 22630, "ts": 829}, {"name": "Asub", "cat": "PERF", "ph": "E", "pid": 22630, "tid": 22630, "ts": 833} ]
每一行表示一个Event,
{ "name": "myName", "cat": "category,list", "ph": "B", "ts": 12345, "pid": 123, "tid": 456, "args": { "someArg": 1, "anotherArg": { "value": "my value" } } }
每个字段的含义如下:
- name: The name of the event, as displayed in Trace Viewer - cat: The event categories. This is a comma separated list of categories for the event. The categories can be used to hide events in the Trace Viewer UI. - ph: The event type. This is a single character which changes depending on the type of event being output. The valid values are listed in the table below. We will discuss each phase type below. - ts: The tracing clock timestamp of the event. The timestamps are provided at microsecond granularity. - tts: Optional. The thread clock timestamp of the event. The timestamps are provided at microsecond granularity. - pid: The process ID for the process that output this event. - tid: The thread ID for the thread that output this event. - args: Any arguments provided for the event. Some of the event types have required argument fields, otherwise, you can put any information you wish in here. The arguments are displayed in Trace Viewer when you view an event in the analysis section.
其中ph(event type)是需要关心的:
| Duration Events | B(begin), E(end) |
也就是说一个方法的调用,至少有两行,ph=B和ph=E。
格式弄清楚后,就需要生成json文件了。生成这个json文件本质上就是个日志功能,为了尽最大可能不影响App的性能,使用内存映射mmap方法来写文件。同时为了简单的处理多线程问题,使用了串行queue。代码见这里
最终trace文件会生成在App沙盒中的
tmp/appletracedata
目录。由于日志量可能很大,又结合mmap的特性,日志文件会以下面的逻辑生成:trace.appletrace trace_1.appletrace trace_2.appletrace trace_3.appletrace ... trace_N.appletrace
每个appletrace文件16MB,由于mmap的特性(只能映射固定大小文件),文件末尾一般会有
\0
来填充。生成这些appletrace文件后,需要从App的沙盒中复制出来。使用
merge.py
把appletrace文件转换为trace_event format
的json文件。python merge.py -d <appletracedata directory>
最终执行catapult的trace2html脚本,生成最终的html文件。
python catapult/tracing/bin/trace2html appletracedata/trace.json --output=appletracedata/trace.html
源码
使用方法
采集数据
目前有两种采集数据的方式。
手动 APTBeginSection 和 APTEndSection
这种场景是:我不想hook所有的Objective C方法,我只想在分析性能时,一点一点手动添加
开始点和结束点
。(这点Android的systrace也是支持)虽然麻烦,但在定位到大体方向后,这样更加精细和准确,避免了hook对App本身性能的影响。(1)只需要把
appletrace.h
和appletrace.mm
文件拖入自己的功能即可。(当然这里可以做成CocoaPods,有时间可以做下)。(2)然后在函数(方法)的开头和结尾(或者自己感兴趣的区间),调用
APTBeginSection
和APTEndSection
即可。对于ObjectiveC方法可以使用宏APTBegin
和APTEnd
。// Objective C class method #define APTBegin APTBeginSection([NSString stringWithFormat:@"[%@]%@",self,NSStringFromSelector(_cmd)].UTF8String) #define APTEnd APTEndSection([NSString stringWithFormat:@"[%@]%@",self,NSStringFromSelector(_cmd)].UTF8String)
参考例子
sample/ManualSectionDemo
。
Hook objc_msgSend
这种场景是:我想初步定为哪里有耗时的操作,可以整体上Hook objc_msgSend一次,对整个App的流程有个大致了解。
(1)把动态库的工程
appletrace.xcodeproj
拖拽到目标工程。
(2)并配置动态库的依赖Target Dependencies
和Copy Files
。参考
sample/TraceAllMsgDemo
。注意:
- 需要关闭BitCode。
- 仅支持arm64。
处理数据,生成html
从App的沙盒中复制出
tmp/appletracedata
目录。(例如:Xcode可以直接Dump出整个沙盒)然后,
// 处理mmap的日志文件 python merge.py -d <appletracedata directory> // 生成html python catapult/tracing/bin/trace2html appletracedata/trace.json --output=appletracedata/trace.html // 打开 open trace.html
就可以看到
性能影响
目前对App性能的影响主要是:
- Hook objc_msgSend :这个是主要的影响,因此生成的最终结果仅用于分析、对比,而不能认为就是耗费了这些数值。
- 日志文件:为了写日志,mmap了文件,还创建了队列。对App本身的性能也有影响。
局限
由于HookZz对objc_msgSend的hook仅实现了
arm64
架构,因此只能在真机上分析。(当然这也足够了,主流设备就是arm64)计划
计划1:dtrace
对于数据的产生来源,目前有两种:
- 手动 APTBeginSection 和 APTEndSection
- Hook objc_msgSend
最近一段时间对
dtrace
也学习了一段时间了,完全可以针对模拟器使用dtrace
来生成数据。dtrace由于是内核层,对App本身的性能影响很小,而且dtrace不仅仅可以hook(trace)ObjectiveC方法,还可以trace C方法、swift方法。这是下一步的计划。计划2:白名单类/黑名单类
Hook objc_msgSend的方法,有的类可能并不关心。可以采用白名单或者黑名单的方式,缩小分析范围。
总结
这个工具本身的代码不多(写日志),主要是组合了catapult和HookZz,再次感谢catapult和HookZz。
有任何问题欢迎随时 issue,或者联系我的微信 everettjf。
招聘
广告来咯。
北京 蚂蚁金服 支付宝基础架构部 招聘iOS开发/专家 P6+或P7,亿级App的架构、性能、稳定性工作,绝对有挑战。如果有兴趣加入我们,欢迎随时加我微信 everettjf 交流,或者先发简历到我的个人邮箱 :everettjf@live.com 。
(文章同步发布于我的博客 http://everettjf.com/2017/09/21/appletrace-released-performance-analysis-tool/ )
Posts: 1
Participants: 1
Ios11相机扫描支付宝收款码直接打开支付宝app的原理是什么?
@liuxucau wrote:
ios11支付相机扫描二维码,如果二维码是一个schema,则打开注册了schema的app,如果是一个http url,则打开 safri。
但支付宝的收款码是一个https的url,如https://qr.alipay.com/fkxxxxxxxx,使用ios11的相机扫描时能够直接打开支付宝app,不是safri,为什么会这样?是ios11的相机对支付宝收款码进行了特殊处理吗?
Posts: 3
Participants: 2
关于定位,感兴趣的进来看一下
@wylf wrote:
CLLocationManager这个类是系统用来返回所在地址的,
而这个类里的方法 - (void)onClientEventLocation:(id)arg1;
里面的参数arg1就有我们所要的位置信息,这个arg1参数是个字典,字典里“Locations”这个字段对应的值就是我们想要的位置信息,却打印为空,是解析方法错了吗,大神给看一下。[$r2 objectForKey:@"Locations"] 这个值很明显不是空呀 为什么解析不出来
Posts: 4
Participants: 2
请教如何hook来自字符串的Selector
@gemo wrote:
例如,想在tweak中hook并修改如下函数调用的返回结果,不知怎么写,求指点:
NSArray *Arr = [theClass performSelector:NSSelectorFromString(@"something")];
Posts: 2
Participants: 2
威锋网诚招iOS/Android逆向攻城狮
@eyerwang wrote:
职位名称:iOS/Android逆向工程师
工作性质:全职 工作地点:深圳南山业务介绍:
威锋网国际战队—兔兔助手(tutuapp.com )是全球化的移动应用&游戏分发平台,在全球拥有近2亿用户,支持iOS与Android双平台,支持十多国语言。从2013年开始帮助国内及海外的应用&游戏做全球发布及变现推广。兔兔助手团队高能智勇,全明星阵容期待您的加入。简历接收邮箱:hedy.huo@office.feng.com、eyer.wang@office.feng.com
岗位描述:
1、负责iOS或Android已有游戏、应用逆向破解工作;
2、有较强的逆向后辅助插件开发能力,完成插件功能开发工作。岗位要求:
1、熟练阅读汇编代码和C/C++代码,熟悉逆向工程,尤其熟悉动态分析,有较强的逆向分析能力和软件破解经验;
2、熟练使用IDA、Hopper Disassembler、lldb、APKTOOL、Jeb等逆向分析调试工具;
3、熟悉ARM、ARM64指令集、熟悉常见公开加密算法;
4、熟练常见Hook技术;
5、熟悉iOS/Android常用反混淆手段;
6、做过iOS/Android游戏或应用逆向分析 ;
7、会写Tweak和Python辅助分析脚本(iOS逆向);
8、能够逆向分析出游戏、应用中的api接口调用、加密等,满足插件功能开发 ;
9、技术视野广阔,有主导iOS/Android逆向技术方案设计的能力和经验,能够独立承担iOS/Android逆向项目开发工作;
10、有逆向的iOS/Android游戏、应用产品开发经验者优先。
Posts: 1
Participants: 1