轉(zhuǎn)載于:https://www.cnblogs.com/LiLihongqiang/p/6941463.html
一個編譯成功的可執(zhí)行程序,其中已初始化的字符串都是完整可見的。 針對于iOS的Mach-O二進制通橙忌伲可獲得以下幾種字符串信息:
- 資源文件名
- 可見的函數(shù)符號名
- SQL語句
- format
- 通知名
- 對稱加密算法的key
攻擊者如何利用字符串
資源文件名通常用來快速定位逆向分析的入口點恬吕。 想要知道判斷購買金幣成功與否的代碼位置?只要確定購買成功時播放的音頻文件名字或者背景圖名字就可以順藤摸瓜了遥诉。
kLoginSuccessNotification類似這種通知名稱格外炸眼拇泣,利用Cycript發(fā)個此通知試試,也許會有什么意外收獲矮锈。 拿到對稱加密算法的key是件很幸福的事情霉翔。
字符串異或加解密
是的,字符串需要加密處理苞笨,但只需要對高度敏感字符數(shù)據(jù)做加密债朵,比如對稱加密算法的key。 其他的猫缭,需要提高編程安全意識來彌補葱弟。
常規(guī)辦法是通過異或來加解密,來寫個sample code:
static unsigned char XOR_KEY = 0xBB; void xorString(unsigned char *str, unsigned char key) { unsigned char *p = str; while( ((*p) ^= key) != '\0') p++; } - (void)testFunction { unsigned char str[] = {(XOR_KEY ^ 'h'), (XOR_KEY ^ 'e'), (XOR_KEY ^ 'l'), (XOR_KEY ^ 'l'), (XOR_KEY ^ 'o'), (XOR_KEY ^ '\0')}; xorString(str, XOR_KEY); static unsigned char result[6]; memcpy(result, str, 6); NSLog(@"%s",result); //output: hello }
這樣就無法從二進制中直接分析得到字符串“hello”了 扔進IDA里分析一下猜丹,發(fā)現(xiàn)效果不好芝加,連續(xù)存儲的’h’、’e’等字符還是暴露了可讀的”hello”
改進一下射窒,取消XOR_KEY
獨立變量的身份藏杖,改為宏,作為數(shù)據(jù)直接插入
#define XOR_KEY 0xBB void xorString(unsigned char *str, unsigned char key) { unsigned char *p = str; while( ((*p) ^= key) != '\0') p++; } - (void)testFunction { unsigned char str[] = {(XOR_KEY ^ 'h'), (XOR_KEY ^ 'e'), (XOR_KEY ^ 'l'), (XOR_KEY ^ 'l'), (XOR_KEY ^ 'o'), (XOR_KEY ^ '\0')}; xorString(str, XOR_KEY); static unsigned char result[6]; memcpy(result, str, 6); NSLog(@"%s",result); //output: hello }
嗯這下好多了