1.pythononlinecompiler
2.[Dev] Xcode的码阅记录
3.代码混淆不再愁:一篇掌握核心技巧
4.IDA F5 增强插件,还我源代码(一)
5.LLVM IR简介
6.逆向入门cocos2d游戏逆向分析
pythononlinecompiler
Pythonè¯è¨ç¨åºè®¾è®¡ä¹ç¨åºè®¾è®¡åºæ¬æ¹æ³
计ç®æºçæ¦å¿µï¼è®¡ç®æºæ¯æ ¹æ®æ令æä½æ°æ®ç设å¤ã
计ç®æºå ·æåè½æ§åå¯ç¼ç¨æ§ã
åè½æ§ï¼æ对æ°æ®çæä½ï¼è¡¨ç°ä¸ºæ°æ®è®¡ç®ãè¾å ¥è¾åºå¤çåç»æåå¨çã
å¯å¤§äº®æèªç¼ç¨æ§ï¼ææ ¹æ®ä¸ç³»åæ令èªå¨å°ãå¯é¢æµå°ãåç¡®å°å®ææä½è çæå¾ã
计ç®æºçåå±åç §æ©å°å®å¾ï¼è¡¨ç°ä¸ºææ°æ¹å¼ã
计ç®æºç¡¬ä»¶æä¾èµçéæçµè·¯è§æ¨¡åç §æ©å°å®å¾åå±ï¼è®¡ç®æºè¿è¡é度å æ¤ä¹æ¥è¿å ä½çº§æ°å¿«éå¢é¿ï¼è®¡ç®æºé«ææ¯æçåç±»è¿ç®åè½ä¸æ丰å¯åå±ã
æ©å°å®å¾MooreâsLawââ计ç®æºåå±åå²ä¸æéè¦çé¢æµæ³å
Intelå ¬å¸åå§äººä¹ä¸æç»Â·æ©å°å¨å¹´æåºåä½é¢ç§¯éæçµè·¯ä¸å¯å®¹çº³æ¶ä½ç®¡çæ°é约æ¯ä¸¤å¹´ç¿»ä¸çªï¼CPU/GPUãå åã硬çãçµå产åä»·æ ¼çé½éµå¾ªæ©å°å®å¾ã计ç®æºæ¯å½ä»ä¸çï¼å¯ä¸é¿è¾¾å¹´ææä¸æç §ææ°åå±çææ¯é¢åï¼è®¡ç®æºæ·±å»æ¹å人类社ä¼ï¼çè³å¯è½æ¹å人类æ¬èº«ï¼å¯é¢è§çæªæ¥å¹´ï¼æ©å°å®å¾è¿å°æç»ææã
ç¨åºè®¾è®¡
ç¨åºè®¾è®¡æ¯è®¡ç®æºå¯ç¼ç¨æ§çä½ç°ã
ç¨åºè®¾è®¡ï¼äº¦ç§°ç¼ç¨ï¼æ¯æ·±åº¦åºç¨è®¡ç®æºç主è¦æ段ï¼ç¨åºè®¾è®¡å·²ç»æ为å½ä»ç¤¾ä¼éæ±éæ大çèä¸æè½ä¹ä¸ï¼å¾å¤å²ä½é½å°è¢«è®¡ç®æºç¨åºæ¥ç®¡ï¼ç¨åºè®¾è®¡å°æ¯çåæè½ã
ç¨åºè®¾è®¡è¯è¨
ç¨åºè®¾è®¡è¯è¨æ¯ä¸ç§ç¨äºäº¤äº(交æµ)ç人é è¯è¨ã
ç¨åºè®¾è®¡è¯è¨ï¼äº¦ç§°ç¼ç¨è¯è¨ï¼æ¯ç¨åºè®¾è®¡çå ·ä½å®ç°æ¹å¼ï¼ç¼ç¨è¯è¨ç¸æ¯èªç¶è¯è¨æ´ç®åãæ´ä¸¥è°¨ãæ´ç²¾ç¡®ï¼ç¼ç¨è¯è¨ç¸æ¯èªç¶è¯è¨æ´ç®åãæ´ä¸¥è°¨ãæ´ç²¾ç¡®ã
ç¼ç¨è¯è¨ç§ç±»å¾å¤ï¼ä½çå½å强å²çå´ä¸å¤ãç¼ç¨è¯è¨æè¶ è¿ç§ï¼ç»å¤§é¨åé½ä¸å被使ç¨ãCè¯è¨è¯çäºå¹´ï¼å®æ¯ç¬¬ä¸ä¸ªè¢«å¹¿æ³ä½¿ç¨çç¼ç¨è¯è¨ï¼Pythonè¯è¨è¯çäºå¹´ï¼å®æ¯ææµè¡æ好ç¨çç¼ç¨è¯è¨ã
ç¼ç¨è¯è¨çæ§è¡æ¹å¼
计ç®æºæ§è¡æºç¨åºç两ç§æ¹å¼ï¼ç¼è¯å解éã
æºä»£ç ï¼éç¨æç§ç¼ç¨è¯è¨ç¼åç计ç®æºç¨åºï¼äººç±»å¯è¯»ã
ä¾å¦ï¼result=2+3
ç®æ 代ç ï¼è®¡ç®æºå¯ç´æ¥æ§è¡ï¼äººç±»ä¸å¯è¯»(ä¸å®¶é¤å¤)ã
ä¾å¦ï¼
ç¼è¯
å°æºä»£ç ä¸æ¬¡æ§è½¬æ¢æç®æ 代ç çè¿ç¨ã
æ§è¡ç¼è¯è¿ç¨çç¨åºå«ä½ç¼è¯å¨ï¼compilerï¼ã
解é
å°æºä»£ç éæ¡è½¬æ¢æç®æ 代ç åæ¶éæ¡è¿è¡çè¿ç¨
æ§è¡è§£éè¿ç¨çç¨åºå«å解éå¨ï¼interpreterï¼ã
ç¼è¯å解é
ç¼è¯ï¼ä¸æ¬¡æ§ç¿»è¯ï¼ä¹åä¸åéè¦æºä»£ç ï¼ç±»æ»æ¼å®½ä¼¼è±æç¿»è¯ï¼ã
解éï¼æ¯æ¬¡ç¨åºè¿è¡æ¶éç¿»è¯éæ§è¡ï¼ç±»ä¼¼å®æ¶çåå£°ä¼ è¯ï¼ã
éæè¯è¨åèæ¬è¯è¨
æ ¹æ®æ§è¡æ¹å¼ä¸åï¼ç¼ç¨è¯è¨å为两类ã
éæè¯è¨ï¼ä½¿ç¨ç¼è¯æ§è¡çç¼ç¨è¯è¨ï¼å¦C/C++è¯è¨ãJavaè¯è¨ã
èæ¬è¯è¨ï¼ä½¿ç¨è§£éæ§è¡çç¼ç¨è¯è¨ï¼å¦Pythonè¯è¨ãJavaScriptè¯è¨ãPHPè¯è¨ã
æ§è¡æ¹å¼ä¸åï¼ä¼å¿ä¹åæä¸åã
éæè¯è¨ï¼ç¼è¯å¨ä¸æ¬¡æ§çæç®æ 代ç ï¼ä¼åæ´å åï¼ç¨åºè¿è¡é度æ´å¿«ã
èæ¬è¯è¨ï¼æ§è¡ç¨åºæ¶éè¦æºä»£ç ï¼ç»´æ¤æ´çµæ´»ï¼æºä»£ç å¨ç»´æ¤çµæ´»ãè·¨å¤ä¸ªæä½ç³»ç»å¹³å°ã
IPO
ç¨åºçåºæ¬ç¼åæ¹æ³ã
Iï¼Inputè¾å ¥ï¼ç¨åºçè¾å ¥ã
Pï¼Processå¤çï¼æ¯ç¨åºç主è¦é»è¾ã
Oï¼Outputè¾åºï¼ç¨åºçè¾åºã
ç解IPO
è¾å ¥ï¼ç¨åºçè¾å ¥æ件è¾å ¥ãç½ç»è¾å ¥ãæ§å¶å°è¾å ¥ã交äºçé¢è¾å ¥ãå é¨åæ°è¾å ¥çï¼è¾å ¥æ¯ä¸ä¸ªç¨åºçå¼å§ã
è¾åºï¼ç¨åºçè¾åºï¼æ§å¶å°è¾åºãå¾å½¢è¾åºãæ件è¾åºãç½ç»è¾åºãæä½ç³»ç»å é¨åéè¾åºçï¼è¾åºæ¯ç¨åºå±ç¤ºè¿ç®ç»æçæ¹å¼ã
å¤çï¼å¤çæ¯ç¨åºå¯¹è¾å ¥æ°æ®è¿è¡è®¡ç®äº§çè¾åºç»æçè¿ç¨ï¼å¤çæ¹æ³ç»ç§°ä¸ºç®æ³ï¼å®æ¯ç¨åºæéè¦çé¨åï¼ç®æ³æ¯ä¸ä¸ªç¨åºççµéã
é®é¢ç计ç®é¨å
ä¸ä¸ªå¾ 解å³çé®é¢ä¸ï¼å¯ä»¥ç¨ç¨åºè¾ å©å®æçé¨åã
计ç®æºåªè½è§£å³è®¡ç®é®é¢ï¼å³é®é¢ç计ç®é¨åï¼ä¸ä¸ªé®é¢å¯è½æå¤ç§è§åº¦ç解ï¼äº§çä¸åç计ç®é¨åï¼é®é¢ç计ç®é¨åä¸è¬é½æè¾å ¥ãå¤çåè¾åºè¿ç¨ã
ç¼ç¨è§£å³é®é¢çæ¥éª¤
6个æ¥éª¤(1-6)
åæé®é¢ï¼åæé®é¢ç计ç®é¨åï¼æ³æ¸ æ¥ã
ååè¾¹çï¼ååé®é¢çåè½è¾¹çï¼è§åIPOã
ç¼åç¨åºï¼ç¼åé®é¢ç计ç®æºç¨åºï¼ç¼ç¨åºã
è°è¯æµè¯ï¼è°è¯ç¨åºæ¯æ£ç¡®è¿è¡çï¼è¿è¡è°è¯ã
å级维æ¤ï¼éåºé®é¢çå级维æ¤ï¼æ´æ°å®åã
æ±è§£è®¡ç®é®é¢çç²¾ç®æ¥éª¤
3个精ç®æ¥éª¤
ç¡®å®IPOï¼æ确计ç®é¨åååè½è¾¹çã
ç¼åç¨åºï¼å°è®¡ç®æ±è§£ç设计åæç°å®ã
è°è¯ç¨åºï¼ç¡®ä¿ç¨åºæç §æ£ç¡®é»è¾è½å¤æ£ç¡®è¿è¡ã
ç¼ç¨è½å¤è®ç»æç»´
ç¼ç¨ä½ç°äºä¸ç§æ½è±¡äº¤äºå ³ç³»ãèªå¨åæ§è¡çæ维模å¼ã计ç®æç»´ï¼åºå«é»è¾æç»´åå®è¯æç»´ç第ä¸ç§æ维模å¼ãè½å¤ä¿è¿äººç±»æèï¼å¢è¿è§å¯ååæ·±å对交äºå ³ç³»çç解ã
ç¼ç¨è½å¤å¢è¿è®¤è¯
ç¼ç¨ä¸å纯æ¯æ±è§£è®¡ç®é®é¢ãä¸ä» è¦æè解å³æ¹æ³ï¼è¿è¦æèç¨æ·ä½éªãæ§è¡æççæ¹é¢ãè½å¤å¸®å©ç¨åºåå 深对ç¨æ·è¡ä¸ºä»¥å社ä¼åæåç认è¯ã
ç¼ç¨è½å¤å¸¦æ¥ä¹è¶£
ç¼ç¨è½å¤æä¾å±ç¤ºèªèº«ææ³åè½åçèå°ã让ä¸çå¢å æ°çé¢è²ã让èªå·±åå¾æ´é ·ãæåå¿ç满足æãå¨ä¿¡æ¯ç©ºé´éæèåæ°ãå°åæ°å为ç°å®ã
ç¼ç¨è½å¤æé«æç
è½å¤æ´å¥½å°å©ç¨è®¡ç®æºè§£å³é®é¢ãæ¾èæé«å·¥ä½ãçæ´»åå¦ä¹ æçã为个人çæ³å®ç°æä¾ä¸ç§åå©è®¡ç®æºçé«ææ段ã
ç¼ç¨å¸¦æ¥å°±ä¸æºä¼
ç¨åºåæ¯ä¿¡æ¯æ¶ä»£æéè¦çå·¥ä½å²ä½ä¹ä¸ãå½å å¤å¯¹ç¨åºåå²ä½ç缺å£é½å¨ç¾ä¸ä»¥ä¸è§æ¨¡ã计ç®æºå·²ç»æ¸éäºå个è¡ä¸ï¼å°±ä¸åæ¯é常广éã
å¦ä¹ ç¼ç¨ç误åº
Qï¼ç¼ç¨å¾é¾å¦åï¼Aï¼ææ¡æ¹æ³å°±å¾å®¹æï¼
é¦å ï¼ææ¡ç¼ç¨è¯è¨çè¯æ³ï¼çæåºæ¬æ¦å¿µåé»è¾ãå ¶æ¬¡ï¼ç»å计ç®é®é¢æèç¨åºç»æï¼ä¼ä½¿ç¨ç¼ç¨å¥è·¯ãæåï¼åç §æ¡ä¾å¤ç»ä¹ å¤å®è·µï¼å¦ä¼ä¸¾ä¸åä¸æ¬¡ã
pythononlineæä¹è¿è¡
ä½ å好代ç åï¼å¨ä»£ç æ¡ç顶端æä¸ä¸ªExecute,码阅ç¹ä¸ä¸ï¼åºç«¯å°±æ¾ç¤ºä»£ç å¨è¿è¡ä¸äº
帮å¿ççè¿ä¸ªpythonç¨åºåªé没对ï¼ï¼è°¢è°¢ï¼#å 为?ä½ ç¨äºç¶å¢ä¸¤ä¸ªå¾ªç¯ï¼åå¦ä¸ä¸ªæ°è½è¢«3å5æ´é¤ï¼é£ä¹è¿ä¸ªæ°è®¡ç®ä¸¤æ¬¡ï¼æ¯å¦
#-*-?coding:utf-8?-*-
def?getsum(num):
total?=?0
for?i?in?range(1,?num):
if?i?%?3?==?0?or?i?%?5?==?0:
è¿è¾©ç¼total?+=?i
return?total
if?__name__?==?'__main__':
num?=?int(raw_input())
ç 模?print?getsum(num)å¦ä¹ Python建议ç¨ä»ä¹ç¼è¯å¨?LLVMå端败å·åçnumbaåæ¯æ大é¨åC++ç¼è¯å¨ä½ä¸ºå端çnuitkaã
Pythonç±è·å °æ°å¦å计ç®æºç§å¦ç 究å¦ä¼çGuidovanRossumäºå¹´ä»£å设计ï¼ä½ä¸ºä¸é¨å«åABCè¯è¨çæ¿ä»£åã
Pythonæä¾äºé«æçé«çº§æ°æ®ç»æï¼è¿è½ç®åææå°é¢å对象ç¼ç¨ãPythonè¯æ³åå¨æç±»åï¼ä»¥å解éåè¯è¨çæ¬è´¨ï¼ä½¿å®æ为å¤æ°å¹³å°ä¸åèæ¬åå¿«éå¼ååºç¨çç¼ç¨è¯è¨ï¼éççæ¬çä¸ææ´æ°åè¯è¨æ°åè½çæ·»å ï¼éæ¸è¢«ç¨äºç¬ç«çã大å项ç®çå¼åã
Python解éå¨æäºæ©å±ï¼å¯ä»¥ä½¿ç¨CæC++ï¼æè å ¶ä»å¯ä»¥éè¿Cè°ç¨çè¯è¨ï¼æ©å±è¿¹ä¸æ°çåè½åæ°æ®ç±»å¯çº¯åãPythonä¹å¯ç¨äºå¯å®å¶å软件ä¸çæ©å±ç¨åºè¯è¨ãPython丰å¯çæ ååºï¼æä¾äºéç¨äºå个主è¦ç³»ç»å¹³å°çæºç ææºå¨ç ã
Pythonæ¯ä¸é¨è·¨å¹³å°çèæ¬è¯è¨ï¼Pythonè§å®äºä¸ä¸ªPythonè¯æ³è§åï¼å®ç°äºPythonè¯æ³ç解éç¨åºå°±æ为äºPythonç解éå¨ã
ç®å讲ï¼ç¼è¯å¨å°±æ¯å°âä¸ç§è¯è¨ï¼é常为é«çº§è¯è¨ï¼âç¿»è¯ä¸ºâå¦ä¸ç§è¯è¨ï¼é常为ä½çº§è¯è¨ï¼âçç¨åºã
ä¸ä¸ªç°ä»£ç¼è¯å¨ç主è¦å·¥ä½æµç¨ï¼æºä»£ç (sourcecode)â?é¢å¤çå¨?(preprocessor)âç¼è¯å¨(compiler)â?ç®æ 代ç ?(objectcode)â?é¾æ¥å¨?(Linker)âå¯æ§è¡ç¨åº?(executables)ã
é«çº§è®¡ç®æºè¯è¨ä¾¿äºäººç¼åï¼é 读交æµï¼ç»´æ¤ãæºå¨è¯è¨æ¯è®¡ç®æºè½ç´æ¥è§£è¯»ãè¿è¡çãç¼è¯å¨å°æ±ç¼æé«çº§è®¡ç®æºè¯è¨æºç¨åºï¼Sourceprogramï¼ä½ä¸ºè¾å ¥ï¼ç¿»è¯æç®æ è¯è¨ï¼Targetlanguageï¼æºå¨ä»£ç ççä»·ç¨åºã
æºä»£ç ä¸è¬ä¸ºé«çº§è¯è¨(High-levellanguage)ï¼å¦PascalãCãC++ãJavaãæ±è¯ç¼ç¨çææ±ç¼è¯è¨ï¼èç®æ åæ¯æºå¨è¯è¨çç®æ 代ç ï¼Objectcodeï¼ï¼ææ¶ä¹ç§°ä½æºå¨ä»£ç ï¼Machinecodeï¼ã
对äºC#ãVBçé«çº§è¯è¨èè¨ï¼æ¤æ¶ç¼è¯å¨å®æçåè½æ¯ææºç ï¼SourceCodeï¼ç¼è¯æéç¨ä¸é´è¯è¨ï¼MSIL/CILï¼çåèç ï¼ByteCodeï¼ãæåè¿è¡çæ¶åéè¿éç¨è¯è¨è¿è¡åºç转æ¢ï¼ç¼ç¨æç»å¯ä»¥è¢«CPUç´æ¥è®¡ç®çæºå¨ç ï¼NativeCodeï¼ã
ipadè½å¤ç¼ç¨åï¼iPadä¸æ¯è½å¤è¿è¡ç¼ç¨çï¼å 为å¨å¹´6ææ¥ï¼è¹æå¬å¼WWDCå¼åè 大ä¼ä¸ï¼å´ç»å¼åè 主é¢æ¨åºäºä¸æ¬¾iPadå¹³å°çåºç¨å¼åå·¥å ·SwiftPlaygroundsï¼ç°å¨å¼åè å¯ä»¥ç´æ¥å¨iPadè¿çæå è¡ç¼ç¨äºã
Swift?Playgroundsè¿æ¬¾appæ¯ä¸æ¬¾éç¨äºç¼ç¨åå¦è çiPadappï¼å®è®©ç¨æ·å¯ä»¥ä¸è¾¹å代ç ï¼ä¸è¾¹çå°ä»£ç é å°±çææãå¨å·¦ä¾§è¾å ¥ä»£ç ï¼å¨å³ä¾§ç«å³å°±è½åç°ææã
åæ¶ï¼Swiftæ¯ä¸ç§æ°çç¼ç¨è¯è¨ï¼å¯ç¨äºç¼åiOSåmacOSåºç¨ï¼å®ç»åäºCåObjective-Cçä¼ç¹å¹¶ä¸ä¸åCå ¼å®¹æ§çéå¶ã
æ©å±èµæï¼
Swiftä½ä¸ºä¸ç§å¿«éèé«æçè¯è¨ï¼æçå®èªå·±çç¬ç¹ä¼å¿ï¼Swiftå°ç°ä»£ç¼ç¨è¯è¨çç²¾ååè¹æå·¥ç¨å¸æåçæºæ §ç»åäºèµ·æ¥ãç¼è¯å¨å¯¹æ§è½è¿è¡äºä¼åï¼ç¼ç¨è¯è¨å¯¹å¼åè¿è¡äºä¼åï¼ä¸¤è äºä¸å¹²æ°ãSwiftæ¢å¯ä»¥ç¨äºå¼åâhello,worldâè¿æ ·çå°ç¨åºï¼ä¹å¯ä»¥ç¨äºå¼åä¸å¥å®æ´çæä½ç³»ç»ã
æ©å¨å¹´æ4æ¥ï¼è¹æå ¬å¸å°±å·²ç»å®£å¸å ¶Swiftç¼å¯å«ç¨è¯è¨ç°å¨å¼æ¾æºä»£ç ï¼é¿è¾¾å¤é¡µçTheSwiftProgrammingLanguageå¯ä»¥å¨çº¿å è´¹ä¸è½½ï¼åæ¶ä¹å¯ä»¥å¨è¹æå®æ¹Githubä¸è½½ã磨é
åèèµææ¥æºï¼ç¾åº¦ç¾ç§-SWIFTï¼è®¡ç®æºç¼ç¨è¯è¨ï¼
æä¹è§£å³.dll没æ被æå®å¨windowsä¸è¿è¡.dll没æ被æå®å¨windowsä¸è¿è¡çåå æ¯ç³»ç»é误导è´çï¼èè£¤è ¢å ·ä½è§£å³æ¹æ³æ¥éª¤å¦ä¸ï¼
1ãé¦å æå¼è®¡ç®æºï¼å¨è®¡ç®æºå åå»å¼å§ï¼å¨å¼¹åºçé项æ å æ¾å°âè¿è¡âé项并ç¹å»ã
2ãç¶åå¨å¼¹åºççé¢å è¾å ¥CMD并æ²å»é®çä¸çå车é®ã
3ãç¶åå¨å¼¹åºççé¢å æ¾å°âç²è´´âé项è¾å ¥ä»¥ä¸ä»£ç for%1in(%windir%\system\*.dll)doregsvr.exe/s%1ã
4ãç¶ååå¨çé¢å è¾å ¥ä»¥ä¸ä»£ç ï¼for%1in(%windir%\system\*.dll)doregsvr.exe/s%1ã
5ãç¶åæ²å»é®çä¸çå车é®ï¼çé¢ä¼æç»æ»å¨ï¼çå°çé¢åæ¢æ»å¨æ¶éåºæ¤çé¢å³å¯è§£å³.dll没æ被æå®å¨windowsä¸è¿è¡ç纯è¡é®æ¨±éªé¢äºã
[Dev] Xcode的记录
构建过程可以分为预处理(preprocess) -- 编译(build) -- 汇编(assemble) -- 连接(link)这几个大的过程。
LLVM(Low Level Virtual Machine)是码阅强大的编译器开发工具套件,其核心思想是码阅通过生成中间代码IR,分离前后端(前端编译器,码阅后端目标机器码)。码阅新闻评价系统源码这样做的码阅好处是,前端新增编译器,码阅不用再单独去适配目标机器码,码阅只需要生成中间代码,码阅LLVM就可以生成对应的码阅目标机器码。下面就是码阅LLVM的架构。
预处理:头文件引入、码阅宏替换、码阅注释处理、码阅条件编译等操作;
词法分析:读入源文件字符流,组成有意义的词素(lexeme)序列,生成词法单元(token)输出;
语法分析:Token流解析成一颗抽象语法树(AST);
CodeGen:遍历语法树,生成LLVM IR代码,这是前端的输出文件;
汇编:LLVM对IR进行优化,针对不同架构生成不同目标代码,以汇编代码格式输出;
汇编器生成.o文件:将汇编代码转换为机器代码,输出目标文件(object file);
连接器:将目标文件和(.dylib、.a、.tbd、.framework)进行连接,生成可执行mach-o文件。
dwarf:debugging with attribute record formats,一种源码调试信息的记录格式,用于源码级调试;
dSym:debug Symboles,调试符号,即符号表文件。符号对应着类、函数、变量等,是内存与符号如函数名、文件名、行号等的映射,崩溃日志解析非常重要。可以用dwarfdump 命令来查看dwarf调试信息。机构吃肉指标源码
DW_AT_low_pc表示函数的起始地址 DW_AT_high_pc表示函数的结束地址 DW_AT_frame_base表示函数的栈帧基址 DW_AT_object_pointer表示对象指针地址 DW_AT_name表示函数的名字 DW_AT_decl_file表示函数所在的文件 DW_AT_decl_line表示函数所在的文件中的行数 DW_AT_prototyped为一个 Bool 值, 为 true 时代表这是一个子程序/函数(subroutine) DW_AT_type表示函数的返回值类型 DW_AT_artificial为一个Bool值,为true时代表这是一个由编译器生成而不是源程序显式声明
使用symbolicatecrash命令行
使用dwarfdump和atos工具
xcode-project-file-format这里对xcodeproj文件格式进行了说明。
xcodeproj文件包含以下元素
总体说明
结合上面的说明,对project.phxproj文件结构进行说明
项目中setting有2处,project和target中都有,那么他们之间的关系是怎样的?
在Xcode中添加代码块步骤
1、选择代码,右键选择 create code snippet,或者在顶部导航,选择Editor-create code snippet;
2、编辑信息和代码即可,其中completion表示输入的快捷方式;
3、需要修改的参数用形式添加 ;
4、所在目录~/Library/Developer/Xcode/UserData/CodeSnippets 。
还需要注意xcshareddata目录下
参考
Xcode build过程中都做了什么 Xcode编译疾如风-3.浅谈 dwarf 和 dSYM iOS崩溃日志解析&原理 - 掘金 LLVM编译流程 & Clang插件开发 8. Xcode 工程文件解析 - 掘金 XCode工程文件结构及Xcodeproj框架的使用( 二 ) XCode: Target Settings和Project Settings的区别 Xcode-项目重命名
代码混淆不再愁:一篇掌握核心技巧
代码混淆技术对于保护软件免受逆向工程具有关键作用。其原理是将原始代码转换为难以理解的形式,从而增加分析和篡改的难度。主要思路包括符号混淆、控制流混淆、计算混淆和虚拟机混淆。
首先,符号混淆涉及去除或混淆函数名、全局变量名等标识符,以降低代码可读性。例如,ELF文件可以通过命令行工具strip去除符号表实现这一目的。
控制流混淆旨在混淆程序的控制流程,使逻辑关系难以识别。常见的方法有控制流平坦化、虚假控制流和随机控制流。控制流平坦化通过删除跳转关系,使用集中分发块调度执行顺序。虚假控制流通过插入不可达基本块和虚假跳转,干扰攻击者分析。随机控制流通过克隆基本块和随机跳转混淆控制流。
计算混淆通过混淆计算流程或数据,使分析者难以分辨具体计算过程。主要手段包括指令替代和常量替代。指令替代替换二元运算指令为复杂指令序列,6502cpu源码常量替代则替换常数为复杂表达式,以混淆计算过程。
虚拟机混淆则将一组指令集合转化为自定义指令集,通过解释器执行,极大地增加了混淆难度,但可能带来性能损耗和易被误报等问题。
OLLVM是一款经典的代码混淆工具,支持控制流平坦化、虚假控制流和指令替代等混淆方法。Ipa Guard是另一款强大的混淆工具,无需iOS应用源码,直接对ipa文件进行混淆加密,保护代码、资源文件等,通过重命名和混淆关键代码降低可读性,提高破解和反编译难度。它同样支持对、资源、配置等进行修改,适用多种开发环境,包括OC、Swift、Flutter、React Native和H5类应用。
IDA F5 增强插件,还我源代码(一)
许多年以后,面对IDA的F5,面对着曾经的荣光与失落,老李老板的故事被追忆。在那个时代,App的名字还是exe和com,而Asm程序员的夜晚,是面对黑洞洞的屏幕,用DEBUG敲下代码的不眠之夜。随着时代的变迁,App改名,C程序员狂欢,Asm程序员黯淡。瑞士同行的ipad上阅读源码ollvm让混淆达到了新高度,而IDA F5,成了对抗这一挑战的希望。
如今,ollvm已经进入了第年,混淆技术愈发强大,而IDA F5以其独特的魅力再次成为焦点。它像是当年的小甜甜,现在则是牛夫人,每一次变身都充满着挑战与机遇。
对于使用IDA 7.x+的用户,有一个简单的步骤可以尝试。只需将d文件夹和D.py文件放置在C:\fenfei\IDAPro7_5\plugins目录下,然后运行D.py,使用Ctrl-Shift-D进行操作,选择配置文件default_instruction_only.json。点击”Start“按钮,然后F5,奇迹即将显现。尽管结果可能没有那么惊艳,但至少能辨认出其本质。
对于那些在配置好D后仍无法获得预期效果的用户,他们可能会遇到IDA F5的缓存问题。解决方法并非立即可见,但通过重新启动IDA或尝试等效的方法,可以清除缓存并让D的增强效果再次显现。
IDA Microcode的引入,为汇编代码到C代码的转换过程提供了一个层次,使得这一过程更加细致和可定制。它就像是烹饪米饭,不同成熟度代表了代码转换的不同阶段,每一步都能添加自己的“私货”,使得最终的C代码更加“可口”。Microcode的深度探讨为读者提供了一种新的视角,通过github资源,可以更深入地了解这一过程。
D的原理在于通过指令替换和流程重组来对抗混淆。它将混淆后的代码抽象为算式,利用AstNode对象进行表示,然后通过模式匹配进行替换。spring异步任务源码流程重组则寻找主分发器和真实块,重组正确的流程,这一过程在d/optimizers/flow中实现。
动手实践是学习的最好方式,通过添加额外的优化规则,可以显著提升D的性能。小学数学知识在这里扮演着关键角色,而github资源提供了强大的工具,让这一过程变得既有趣又有效。
总结而言,学习逆向工程技巧和思路是不断进化的,没有一劳永逸的方法。IDA F5的挑战与机遇并存,它与攻击者的对抗是一场永无止境的游戏。在这一过程中,技术的迭代与人的智慧同样重要,没有单一的决定性因素。而IDA社区的资源与知识,为每一个寻求进步的人提供了丰富的支持。
LLVM IR简介
对于LLVM这样的编译框架,IR(Intermediate Representation,中间表示)是核心。它连接着编译器前端与后端,体现着LLVM的插件化、模块化设计哲学。LLVM的pass实际上都是基于IR进行的。同时,IR作为编译器组件接口,使得设计新语言只需实现生成LLVM IR的编译器前端即可,从而轻松利用LLVM优化、JIT、目标代码生成等功能。
LLVM IR主要以三种形式表示:
1. 内存中的IR模型,对应于LLVM实现的类结构。
2. 用于读取的汇编形式的IR。
3. 通过命令行工具(如`clang`)生成,如`clang add.cpp -emit-llvm -S -c -o add.ll`。
汇编形式的IR以简洁形式展示,例如,`add`函数的IR可读性较高,即使不了解具体指令定义,也能大致对应源码与汇编IR。
IR生成方面,LLVM提供了构建接口,前端可调用实现代码生成。生成过程相对复杂,本文简要介绍。以一段示例代码为例,目标是构建IR Module,包含`add1`和`foo`两个函数。理解过程仿佛是编译器前端,根据语义将代码翻译为LLVM IR。
最终代码输出IR的汇编形式并保存,与之前生成的IR一致,展示了IR生成过程。
逆向入门cocos2d游戏逆向分析
深入剖析cocos2d-x游戏逆向分析
cocos2d-x是一个开源的移动2D游戏框架,它底层支持各种平台,核心用c++封装了各种库,外部则提供了lua和c++接口。关键代码可能隐藏在lua脚本中,许多安卓游戏的逻辑也主要在lua脚本里运行。通过官网示意图了解从c++进入lua世界的路径。
探索cocos2d-x的lua虚拟机相关代码,包括CCLuaEngine.h和CCLuaStack.h。在应用结束加载中进入lua虚拟机,具体由applicationDidFinishLaunching函数调用engine->executeScriptFile("main.lua")实现。
在luaLoadBuffer函数中,使用xxtea_decrypt解密了lua脚本,并通过luaL_loadbuffer加载解密后的脚本内容。因此,通过hook这个函数,可以将(char*)content字符dump出来,获取解密后的lua脚本。
然而,luaL_loadbuffer的源码无法直接获取,它位于编译过的库cocos2d-x\external\lua\luajit\prebuilt\android\armeabi-v7a\libluajit.a中。要找到实现细节,需要下载luajit源代码进行深入分析。
总结关键点:
1. 从c++进入lua世界的调用逻辑。
2. 使用xxtea加密算法,sign和key为XXTEA和2dxlua。
3. 无论是否加密,都会调用luaL_loadbuffer函数,通过hook这个函数获取解密后的lua脚本,但需运行游戏一次。
4. cocos2d-x\external\xxtea\xxtea.cpp中有加密解密算法,逻辑清晰,可使用python脚本本地解密或hook获取key、sign或解密后脚本。
实战案例:
以某捕鱼游戏为例,下载apk后内部集成十余款小游戏。通过分析游戏源码,找到luac加密文件,解密key和sign。使用ida打开libqpry_lua.so,定位到AppDelegate::applicationDidFinishLaunching函数,找到加密调用。对比源码,解密后可直接运行游戏。
深入lua脚本分析,如子弹击中鱼的逻辑,直接查找src\views\layer\BulletLayer.luac文件。通过修改相关函数参数,实现特定功能。其他功能逻辑获取源码后易于理解,修改代码后重新加密,实现游戏破解。
思考如何实现cocos2d-x反逆向,从浅至深可采用以下方法:
1. 修改xxtea的key和sign,需分析so文件。
2. 直接修改xxtea算法,增加逆向难度。
3. 更改luajit源码,调整字节码指令顺序或数据读取顺序。
4. 将关键代码封装到其他cpp或so文件,增加解密步骤。
5. 使用ollvm混淆代码,需分析混淆或vm。
Obfuscator-llvm源码分析
在逆向分析中,Obfuscator-llvm是一个备受关注的工具,它通过混淆前端语言生成的中间代码来增强SO文件的安全性。本文主要讲解了Obfuscator-llvm的三个核心pass——BogusControlFlow、Flattening和Instruction Substitution,它们在O-llvm-3.6.1版本中的实现。
BogusControlFlow通过添加虚假控制流和垃圾指令来混淆函数,其runOnFunction函数会检查特定参数,如混淆次数和基本块混淆概率。在测试代码中,它会将基本块一分为二,插入随机指令,形成条件跳转,如“1.0 == 1.0”条件下的真跳转和假跳转。
Flattening通过添加switch-case语句使函数结构扁平化,runOnFunction会检查启动标志。在示例代码中,它将基本块分隔,创建switch结构,并根据随机值跳转到不同case,使函数执行流程变得复杂。
Instruction Substitution负责替换特定指令,runOnFunction会检测启动命令,遍历所有指令并随机应用替换策略,如Add指令的多种可能替换方式。
虽然O-llvm提供了一定程度的混淆,但仍有改进空间,比如增加更多的替换规则和更复杂的跳转策略。作者建议,利用O-llvm的开源特性,开发者可以根据需求自定义混淆方法,提高混淆的复杂性和逆向难度。
最后,对于对Obfuscator-llvm感兴趣的读者,可以参考《ollvm的混淆反混淆和定制修改》的文章进一步学习。网易云安全提供的应用加固服务提供了试用机会,对于保护软件安全具有实际价值。
更多关于软件安全和源码分析的内容,欢迎访问网易云社区。
[clang]: llvm 前端编译流程
clang编译流程分为五个主要步骤:预处理器、编译器、后端生成、汇编、链接器。
预处理阶段主要进行文本替换操作,处理编译语言中的预处理指令,如导入头文件和宏替换等,不进行语法和词法检测。
编译器阶段通过词法分析和语法分析,将预处理结果转换成抽象语法树(AST),以便生成中间表示(IR)。例如,从文件test.cc生成的AST将会被转换成可读的文本中间表示(ll)或不可读的bitcode(bc)文件。
生成IR阶段,AST被转换为中间表示格式,确保正确识别代码的语法结构。bitcode(bc)和ll文件为两种不同的中间表示形式,二者可以相互转换。通过指令可以实现从中间表示到汇编语言的转换。
汇编阶段,使用指令将中间表示转换为汇编代码(test.s),汇编语言代码可用于运行或进一步转换。
最后阶段是链接器,将生成的汇编代码(或其他类型的目标文件)链接为可执行文件或动态库。
总结,整个流程包含以下关键输出文件:
- test.c:源代码输入
- test.i:预处理输出文件
- test.bc:bitcode中间表示文件
- test.ll:可读的文本中间表示文件
- test.s:汇编代码输出
- test.o:单文件生成的二进制文件
- image:最终的可执行文件
注意流程图中箭头方向表示文件转换方向,实线部分介绍Clang编译器相关功能,虚线部分不涉及。
教程 iOS混淆加固原理篇
在iOS开发中,为了保障应用免受逆向工程的威胁,混淆加固是不可或缺的措施。本文着重探讨了加固的必要性,编译过程,以及常见的混淆类型和对抗工具。
首先,由于越狱设备的威胁,应用程序的可执行文件容易被**并逆向,导致安全风险。因此,混淆加固成为了保护程序的关键步骤。
在编译流程中,Xcode通过预处理、符号化等步骤生成代码,Objective-C和Swift都借助LLVM进行编译。混淆则涵盖字符串、类名和方法名的加密,以及程序结构的混淆加密,以降低逆向者理解代码的难度。
具体来说,字符串混淆加密使得源代码中的敏感信息难以辨识,类名和方法名混淆则使功能逻辑变得难以解析。程序结构混淆加密则进一步削弱代码的可读性,增加破解难度。
逆向工具如ipa guard、Hopper和IDA等,广泛用于破解和分析iOS应用,但通过混淆技术,可以提高破解者的门槛。OLLVM和IPA guard是基于LLVM的混淆工具,而代码虚拟化则通过虚拟机技术,增强代码的保护性。
综上所述,通过理解并实施适当的混淆加固策略,iOS开发者能够有效提升应用的安全性,抵御逆向工程和反编译的挑战。