如果有效地使用 hopper disassembler 讀取 swift 開發的 app ?


#1

在 Obj-c 開發的情況下,讀出來的數據大約是:
r11 = @selector(navigationController);
r5 = [objc_msgSend(r10, r11) retain];
r6 = @selector(view);
r0 = objc_msgSend(r5, r6);

但在 swift 開發的app,讀出來的是:
*((sp - 0x8) + 0xfffffffffffffffc) = r10;
sub_177624(arg2, arg2);
r0 = *(0x177604 + “”);
(r0)(self, self, r0);
return;

大大們,如果 app 是用 swift 寫的話,有什麼方法可以增加逆向的可閱性?(像 obj-c 的樣子也好)
還是因為它沒有 .h.m文件,所以逆向的程序要轉一下了?


#2

反汇编研究得不多,但是swift写的app打包上传时函数符号大多被strip掉了,剩余的一小部分也要做demangle处理才能恢复原来的函数名,外加swift作为一个静态语言使得纯swift写的函数和class几乎没法hook,真的要直接逆向swift开发的app还是很难的。
但是用swift开发的app由于cocoapods的流行或多或少会引入一些开源的第三方库,你可以从它们下手。我曾经研究过一个app的加密算法,发现其使用了CryptoSwift——一个用纯swift实现的开源加密函数库。于是我直接修改其源代码把被调用的加密函数的明文之类的信息写到控制台,然后重新编译并替换掉原framework。
魔改源码可比打断点下hook轻松多了:grinning:


#3

swift跟cpp的逆向难度差不多


#4

开源和逆向的区别


#5

對呀,即使用了 https://github.com/keith/hopper-swift-demangle demangle 處理後,也只是讓表文件名回復
https://github.com/Maximus-/class-dump-swift 可能我的功力不足,好像沒有反應 :skull:
如果沒有其他可行的工具下,可能簡單地注入dylib 文件,在 applicationDidFinishLunch 的時候插入 FLEX / dotzu 庫就算了…


#6

那,如果我不想讓別人讀取 class 的內部運作,例如我有一個 ios 項目:

  • (NSString *) AESEncrpyt:(NSString *)key value:(NSString *)value
    我應該用那種語言去編譯? c++ / swift?還是把function 用 framework 封包再調用?

#7

那个demangle插件不好用,我一般用xcrun swift-demangle看几个可能的关键函数,但是说实话感觉意义不大,毕竟大多数情况下函数符号都被strip掉变成subxxx了。如果你只是想注入dylib然后在 applicationDidFinishLunch时插几个库的话可以研究一下MonkeyDev,应该能满足你的需求,直接hook applicationDidFinishLunch方法就ok。