應用安裝包的加密混淆方法及裝置的制造方法
【專利摘要】本發明公開了一種應用安裝包的加密混淆方法及裝置。該方法包括:獲取應用安裝包中的用于存取符號表的可執行文件,其中,可執行文件包括加載命令區、數據區以及文件頭;依據文件頭遍歷加載命令區,在數據區中確定用于存放選擇地址的分區;若選擇地址包含反射調用函數,根據反射調用函數的調用地址判斷是否需對選擇地址進行加密混淆處理,在判斷出需對選擇地址進行加密混淆處理的情況下,調用預定的加密混淆算法對選擇地址進行加密混淆處理;若選擇地址不包含反射調用函數,調用預定的加密混淆算法對選擇地址進行加密混淆處理。本發明解決了現有技術由于使用selector命名代表當前方法實際功能,造成的函數容易被破解、安全性低的技術問題。
【專利說明】
應用安裝包的加密混淆方法及裝置
技術領域
[0001] 本發明涉及數據處理領域,具體而言,涉及一種應用安裝包的加密混淆方法及裝 置。
【背景技術】
[0002] Objective-C (對象C編程語言)中各個對象間互相調用的方法是"消息傳遞",這 個和常用的調用方式的區別是,你可以隨時對一個對象傳遞任何消息,而不需要在編譯的 時候聲明這些方法。所以Objective-C可以在運行的時候傳遞消息以實現對象間互相調用 是依賴于selector來實現的,selector是指iOS應用里面用來標識一個方法(或函數)的 字符串,應用在運行時根據selector來決定調用的方法(或函數)地址。
[0003] 然而,程序員在開發過程中受自己開發習慣的影響以及后續程序調試的便利,會 將這些selector命名為代表當前方法實際功能的名稱。那么,黑客在逆向分析這些明文存 儲的selector的應用的時候,會根據這些selector的字面意思來猜測selector所對應的 一個或者多個方法的功能,從而迅速的破解應用的一些關鍵功能,比如密碼保存,登錄后臺 系統等等,造成了信息的泄漏甚至是財產的損失。
[0004] 針對上述的問題,目前尚未提出有效的解決方案。
【發明內容】
[0005] 本發明實施例提供了一種應用安裝包的加密混淆方法及裝置,以至少解決現有技 術由于使用selector命名代表當前方法實際功能,造成的函數容易被破解、安全性低的技 術問題。
[0006] 根據本發明實施例的一個方面,提供了一種應用安裝包的加密混淆方法,包括:獲 取應用安裝包中的用于存取符號表的可執行文件,其中,上述可執行文件包括加載命令區、 數據區以及具有第一長度的文件頭;依據上述具有第一長度的文件頭遍歷上述加載命令 區,在上述數據區中確定用于存放選擇地址的分區,其中,上述選擇地址用于調用與上述選 擇地址所指示的代碼;判斷上述分區中的上述選擇地址是否包含反射調用函數;若上述選 擇地址包含上述反射調用函數,則根據上述反射調用函數的調用地址判斷是否需對上述選 擇地址進行加密混淆處理,并在判斷出需對上述選擇地址進行加密混淆處理的情況下,調 用預定的加密混淆算法對上述選擇地址進行加密混淆處理;若上述選擇地址不包含上述反 射調用函數,則直接調用上述預定的加密混淆算法對上述選擇地址進行加密混淆處理。
[0007] 根據本發明實施例的另一方面,還提供了一種應用安裝包的加密混淆裝置,包括: 獲取單元,用于獲取應用安裝包中的用于存取符號表的可執行文件,其中,上述可執行文件 包括加載命令區、數據區以及具有第一長度的文件頭;遍歷單元,用于依據上述具有第一長 度的文件頭遍歷上述加載命令區,在上述數據區中確定用于存放選擇地址的分區,其中,上 述選擇地址用于調用與上述選擇地址所指示的代碼;判斷單元,用于判斷上述分區中的上 述選擇地址是否包含反射調用函數,以及若上述選擇地址包含上述反射調用函數,則根據 上述反射調用函數的調用地址判斷是否需對上述選擇地址進行加密混淆處理;加密混淆 處理單元,用于在判斷出需對上述選擇地址進行加密混淆處理的情況下,調用預定的加密 混淆算法對上述選擇地址進行加密混淆處理,以及若上述選擇地址不包含上述反射調用函 數,則直接調用上述預定的加密混淆算法對上述選擇地址進行加密混淆處理。
[0008] 在本發明實施例中,采用獲取應用安裝包中的用于存取符號表的可執行文件,其 中,可執行文件包括加載命令區、數據區以及具有第一長度的文件頭;依據具有第一長度的 文件頭遍歷加載命令區,在數據區中確定用于存放選擇地址的分區,其中,選擇地址用于調 用與選擇地址所指示的代碼;判斷分區中的選擇地址是否包含反射調用函數;若選擇地址 包含反射調用函數,則根據反射調用函數的調用地址判斷是否需對選擇地址進行加密混淆 處理,并在判斷出需對選擇地址進行加密混淆處理的情況下,調用預定的加密混淆算法對 選擇地址進行加密混淆處理;若選擇地址不包含反射調用函數,則直接調用預定的加密混 淆算法對選擇地址進行加密混淆處理的方式,通過從二進制指令層對應用安裝包的可執行 文件進行判斷混淆,達到了提高函數安全性的目的,從而實現了不易破解、安全性較高,并 且對程序的性能沒有損耗的技術效果,進而解決了現有技術由于使用selector命名代表 當前方法實際功能,造成的函數容易被破解、安全性低的技術問題。
【附圖說明】
[0009] 此處所說明的附圖用來提供對本發明的進一步理解,構成本申請的一部分,本發 明的示意性實施例及其說明用于解釋本發明,并不構成對本發明的不當限定。在附圖中:
[0010] 圖1是根據本發明實施例的一種運行應用安裝包的加密混淆方法的計算機終端 的硬件結構框圖;
[0011] 圖2是根據本發明實施例的一種可選的應用安裝包的加密混淆方法的流程示意 圖;
[0012] 圖3是根據本發明實施例的一種可選的可執行文件的結構示意圖;
[0013] 圖4是根據本發明實施例的一種可選的應用安裝包的加密混淆裝置的結構示意 圖;
[0014] 圖5是根據本發明實施例的另一種可選的應用安裝包的加密混淆裝置的結構示 意圖。
【具體實施方式】
[0015] 為了使本技術領域的人員更好地理解本發明方案,下面將結合本發明實施例中的 附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是 本發明一部分的實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術 人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都應當屬于本發明保護的范 圍。
[0016] 需要說明的是,本發明的說明書和權利要求書及上述附圖中的術語"第一"、"第 二"等是用于區別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用 的數據在適當情況下可以互換,以便這里描述的本發明的實施例能夠以除了在這里圖示或 描述的那些以外的順序實施。此外,術語"包括"和"具有"以及他們的任何變形,意圖在于 覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統、產品或設備不必限 于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或對于這些過程、方法、產 品或設備固有的其它步驟或單元。
[0017] 實施例1
[0018] 根據本發明實施例,還提供了一種應用安裝包的加密混淆方法的方法實施例,需 要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執行指令的計算機系統 中執行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的 順序執行所示出或描述的步驟。
[0019] 本申請實施例一所提供的方法實施例可以在移動終端、計算機終端或者類似的運 算裝置中執行。以運行在計算機終端上為例,圖1是本發明實施例的一種應用安裝包的加 密混淆方法的計算機終端的硬件結構框圖。如圖1所示,計算機終端10可以包括一個或多 個(圖中僅示出一個)處理器102 (處理器102可以包括但不限于微處理器MCU或可編程 邏輯器件FPGA等的處理裝置)、用于存儲數據的存儲器104、以及用于通信功能的傳輸裝置 106。本領域普通技術人員可以理解,圖1所示的結構僅為示意,其并不對上述電子裝置的 結構造成限定。例如,計算機終端10還可包括比圖1中所示更多或者更少的組件,或者具 有與圖1所示不同的配置。
[0020] 存儲器104可用于存儲應用軟件的軟件程序以及模塊,如本發明實施例中的應用 安裝包的加密混淆方法對應的程序指令/模塊,處理器102通過運行存儲在存儲器104內 的軟件程序以及模塊,從而執行各種功能應用以及數據處理,即實現上述的應用程序的漏 洞檢測方法。存儲器104可包括高速隨機存儲器,還可包括非易失性存儲器,如一個或者多 個磁性存儲裝置、閃存、或者其他非易失性固態存儲器。在一些實例中,存儲器104可進一 步包括相對于處理器102遠程設置的存儲器,這些遠程存儲器可以通過網絡連接至計算機 終端10。上述網絡的實例包括但不限于互聯網、企業內部網、局域網、移動通信網及其組合。
[0021] 傳輸裝置106用于經由一個網絡接收或者發送數據。上述的網絡具體實例可包括 計算機終端10的通信供應商提供的無線網絡。在一個實例中,傳輸裝置106包括一個網絡 適配器(Network Interface Controller,NIC),其可通過基站與其他網絡設備相連從而可 與互聯網進行通訊。在一個實例中,傳輸裝置106可以為射頻(Radio Frequency,RF)模 塊,其用于通過無線方式與互聯網進行通訊。
[0022] 在上述運行環境下,本申請提供了如圖2所示的應用安裝包的加密混淆方法。圖 2是根據本發明實施例一的應用安裝包的加密混淆方法的流程圖。
[0023] 如圖2所示,該應用安裝包的加密混淆方法可以包括如下實現步驟:
[0024] 步驟S202,獲取應用安裝包中的用于存取符號表的可執行文件,其中,可執行文件 包括加載命令區、數據區以及具有第一長度的文件頭。
[0025] 上述步驟S202中應用安裝包可以為iOS應用包,可執行文件可以是MACH-O文件。 應用安裝包的加密混淆裝置可以對應用安裝包進行解壓縮,以獲得上述可執行文件,其中, 如圖3所示,本發明實施例的可執行文件可以包括加載命令區、數據區以及具有第一長度 的文件頭。
[0026] 以可執行文件MACH-O文件為例,上述的加載命令區可以為MACH-O文件中的Load command,數據區可以按照segment來劃分,segment中又包含了多個section。
[0027] (I)MACH-O文件的文件頭格式可以包括:
[0028] struct, mach_ header { uint32_t magic; /* maeh magiG number ielentif ier (mach /?.^ IkII > */ cpu_type_t cputype; /* cpu specifier Ccpu 說明符)*/ cpu_subtype_t cpusubtype; /木 machine specifier (才Λ*器說明符)氺/ uint32_t .f i ie.type; .type of f i Ie (文件類型)*/ uI nt32_t Hcirtds:.;. /* number of load commands (load commands ^?) W ui nt32_t s i zeof cmds; /* the size of a I I the load commands (全召卜 load commands 的長度).*/ uint32_t .flags'.:; f'lags (標簽)*4. I ;
[0029] 其中,文件頭后面就是load command區,然后根據文件頭的ncmds和sizeofcmds 字段可以定位后續所有的load co_and數據。
[0030] (2) MACH-0文件的Load command格式可以包括:
[0031] struct l.oa.d一command { uint32_t cmd. ./* type of. load eommand (I oad command 類型).*/ uint.32_t Ginds I ze; Z5fc total size of command i n bytes (命令 6勺,5£' 土戶 ?? .長 度)V u8 pay load [xxx]I };
[0032] 其中,load_co_and中的命令類型cmd和整個命令長度這兩個信息是固定格式, 都占據了前8個字節。
[0033] 但命令數據區payload的定義就完全不一樣了,取決于命令字cmd (payload的長 度取決于cmdsize)。
[0034] 例如,LC_SEGMENT這條命令,結構如下:
[0035] struct segment^command { for 32-bit architectures (32-bit It41)本/ u i η?32_? cmd ; /* LG__:SEGMENT 水/ u i nt32___t cmd s i z.e; /* includes sizeof section structs (s i zeof sect ion 結構)*/ Char segname[16] * /* segment name (segment 名稱)W u i nt32_t vmaddr; memory address of this segment (segment 的內存:地址)*/ uint32___t vmsize, /* memory size of this segment, (segment:的內 存長度)*/ u i nt32_t 十i Ieoff, /本 file offset of this segment (segment 的文付- 偏移量)*/ u i η?32_? f i Iesi ze; /* amoun t, to map f rom the f i I e (映射文件的:'!:) */ vm__prot___t maxprot.; /* maximum VM protection (最大的虛擬·機保護)*/ vm_prot_t m I tprot,/* i nit ia 丨 VM protect ion (最相的虛擬機保於)本/ u i nt32_t nsects; /* number of sect i ons i n segment (segment 中sect i on的數量)*/ uint32_t flags; /* flags (標簽)*/ 1;
[0036] 其中,load command里面除了 LC_SEGMENT這個命令,還有 LC_ID_DYLIB、LC_DYLD_ INFO、LC_SYMTAB等其余20余種command,每個command都有自己的功能,在此不再贅述D
[0037] 在LC_SEGMENT里面,根據LC_SEGMENT的結構的fileoff、nsects可以定位和遍 歷所有的 segment。常見的 segments 有 _TEXT、_DATA、_LINKEDIT 這三個,其中 _DATA 這個segments是我們關心的,_DATA segment里面也會包含有多個section結構,具體 section個數由segment結構中的nsects決定D
[0038] (3) section的結構可以包括:
[0039] Struet section { /* for 32-bit architeotures (32-bit
[0040] ohar sect name [16]; /* name of this section (seotion^#) W char segname[16]; segment this section goes in */ u I nt32___t addr, /* memory address of this section (section 的內 存地址)*/ uint32_t size, /本 size in bytes of this section (section i令字 節長度)*/ uint32_t offset; /* file offset ?f this section Csection 的文 件偏移量)*/ u i nt32_t align; /* sect i on a I i gnment (power of 2) (sect i on F人歹r]) 氺/ u i nt32_t re I of f; /* file offset of relocation entries (重定 位表表項的偏移量)*/ uint32___t nreIoc, number of relocation entries (重定位表表 項數量)*/ uint32_t 干lags: /* flags (section type and attributes (section 類型和屬性))*/ u i nt32_t reservedl ;/* reserved (f0r off set or index)(保存偏移量或 栺針)氺/. uint32_t reserved2; /* reserved (for count or sizeof)(保存 count 濟數或sizeof函數)*/ I ;
[0041] 需要補充的是,常見的 section 有 _nl_symbol_ptr、-la_symbol_ptr、_objc_ selrefs、-ob jc_classrefs、-ob jc-methname 等,其中,-ob jc_selrefs 保存著 iOS 應用 的所有selector。
[0042] 本發明實施例提供的應用安裝包的加密混淆方法,即是通過定位該section,然后 遍歷其中的所有selector根據特定的規則過濾后,使用定的加密混淆算法進行加密混淆 處理。
[0043] 步驟S204,依據具有第一長度的文件頭遍歷加載命令區,在數據區中確定用于存 放選擇地址的分區,其中,選擇地址用于調用與選擇地址所指示的代碼。
[0044] 上述步驟S204中,應用安裝包的加密混淆裝置可以依據具有第一長度的文件頭 遍歷加載命令區,在數據區中確定用于存放選擇地址的分區。具體地,依據具有第一長度的 文件頭遍歷加載命令區,在數據區中確定用于存放選擇地址的分區,可以包括:
[0045] S10,將距離可執行文件的起始位置第一長度處確定為第一個加載命令區的起始 位置。
[0046] 上述步驟SlO中,假設文件頭的長度為3字節,那么應用安裝包的加密混淆裝置則 將距離可執行文件的起始位置3字節的地方,確定為第一個加載命令區的起始位置。
[0047] S12,根據文件頭的第一字段確定加載命令區的個數。
[0048] 上述步驟S12中,應用安裝包的加密混淆裝置在確定了第一個加載命令區的起始 位置后,需要確定加載命令區的個數,通常加載命令區有多個(20多個),應用安裝包的加 密混淆裝置通過文件頭的第一字段來確定加載命令區的個數。具體地,第一字段可以為 ncmds字段。
[0049] S14,根據第一個加載命令區的起始位置以及加載命令區的個數,確定每個加載命 令區的起始位置。
[0050] 基于上述步驟SlO和步驟S12,在步驟S14中應用安裝包的加密混淆裝置根據第一 個加載命令區的起始位置以及加載命令區的個數則可以確定每個加載命令區的起始位置。
[0051] S16,遍歷每個加載命令區,在數據區中確定用于存放選擇地址的分區。
[0052] 可選地,上述步驟S16中,遍歷每個加載命令區,在數據區中確定用于存放選擇地 址的分區可以包括:
[0053] S20,遍歷每個加載命令區,直到查找到包含有第一預設字段的第一加載命令區, 其中,第一預設字段設置于第一加載命令區中的第二字段。
[0054] 上述步驟S20中,應用安裝包的加密混淆裝置遍歷每個加載命令區,直到查找到 包含有第一預設字段的第一加載命令區,其中,第一預設字段設置于第一加載命令區中的 第二字段,具體地,第二字段可以為cmd字段,第一預設字段可以為LC_SEGMENT。
[0055] S22,根據第一預設字段中的第三字段確定數據區中的每個分段的起始偏移。
[0056] 在上述步驟S22中,應用安裝包的加密混淆裝置在查找到第一預設字段之后,可 以根據第一預設字段中的第三字段確定數據區中的每個分段的起始偏移。具體地,第三字 段可以為payload字段。
[0057] S24,遍歷數據區中的每個分段,當查找到第一分段中的第四字段包含第二預設字 段時,確定用于存放選擇地址的第一分段。
[0058] 在上述步驟S24中,應用安裝包的加密混淆裝置在確定數據區中的每個分段的起 始偏移之后,通過遍歷該每個分段,當查找到第一分段中的第四字段包含第二預設字段時, 確定用于存放選擇地址的第一分段。具體地,第二預設字段可以S_DATA,第四字段可以為 segname 字段。
[0059] S26,遍歷第一分段,當查找到第一分段中的分區的第五字段包含第三預設字段 時,確定用于存放選擇地址的分區。
[0060] 仍舊以MACH-O文件為例,上述的選擇地址可以為MACH-O文件中的selector,上 述的分區可以是MACH-O文件中的section,上述的第一字段可以是MACH-O文件中的ncmds 字段,上述的第一預設字段可以是MACH-O文件中的LC_SEGMENT,上述的第二字段可以是 MACH-O文件中的cmd字段,上述的第三字段可以是MACH-O文件中的payload字段,上述的 第四字段可以是MACH-O文件中的segname字段,上述的第二預設字段可以是MACH-O文件 中的_DATA,上述的第五字段可以是MACH-O文件中的nsects字段,上述的第三預設字段可 以是 MACH-0 文件中的 _objc_selrefs〇
[0061] 那么,應用安裝包的加密混淆裝置執行的步驟可以包括:
[0062] S30,按照文件頭的長度(假定Sh_size字節),在距離文件起始位置h_size處確 定為load command結構的起始位置。
[0063] S32,根據文件頭里面的ncmds字段確定load commands的個數(假定為lc_count 個)。
[0064] S34,根據load command的結構遍歷所有load command,不超過lc_count次,當 結構的cmd字段值為LC_SEGMENT的時候,確認找到LC_SEGMENT。
[0065] S36,LC_SEGMENT中的payload字段即為segment的起始偏移,segments的總大小 為 LC_SEGMENT 的 cmdsize (假定為 lc_size)。
[0066] S38,根據segment的結構及lc_size的總大小,開始查找_DATA。當segment結 構的segname字段為"_DATA"的時候確認找到存放selector的segment。
[0067] S40, Segment 中包含多個 section,根據 Segment 中的 nsects 字段確定 Segment 中 有 η 個 section,遍歷這 η 個 section,當 section 中的 segname 字段為"_objc_selrefs" 時,找到了存放selector的section。
[0068] 步驟S206,判斷分區中的選擇地址是否包含反射調用函數。
[0069] 上述步驟S206中,應用安裝包的加密混淆裝置在確定了用于存放選擇地址的分 區之后,則可以開始進行加密混淆處理。首先,應用安裝包的加密混淆裝置可以判斷該分區 中的選擇地址是否包含反射調用函數。
[0070] 仍舊以MACH-O文件為例,應用安裝包的加密混淆裝置依次讀取section中 的selector,判斷當前selector在代碼中是否使用反射調用函數,Objective-c中 常見的使用反射調用函數包括:NSClassFromString、NSSelectorFromString以及 NSProtocoIFromString〇
[0071] 步驟S208,若選擇地址包含反射調用函數,則根據反射調用函數的調用地址判斷 是否需對選擇地址進行加密混淆處理,并在判斷出需對選擇地址進行加密混淆處理的情況 下,調用預定的加密混淆算法對選擇地址進行加密混淆處理。
[0072] 在上述步驟S208中,作為一種可選的實現方式,若應用安裝包的加密混淆裝置判 斷出選擇地址包含反射調用函數,則根據反射調用函數的調用地址判斷是否需對選擇地址 進行加密混淆處理。
[0073] 可選地,根據反射調用函數的調用地址判斷是否需對選擇地址進行加密混淆處 理,包括:
[0074] S50,根據反射調用函數的調用地址解析反射調用函數的具有第一格式的第一參 數。
[0075] S52,判斷第一參數中是否包含選擇地址。
[0076] S54,若第一參數中包含選擇地址,則確認需對選擇地址進行加密混淆處理。
[0077] S56,若第一參數中不包含選擇地址,則根據應用安裝包中的消息函數的調用地址 判斷是否需對選擇地址進行加密混淆處理。
[0078] 其中,所述反射調用函數可以包括NSClassFromString函數、 NSSelectorFromString 函數以及 NSProtocolFromString 函數;所述消息函數可以為 ob jc_ msgSendSuper 函數。
[0079] 可選地,上述步驟S56中根據應用安裝包中的消息函數的調用地址判斷是否需對 選擇地址進行加密混淆處理,包括:
[0080] S60,從應用安裝包中獲取消息函數的調用地址。
[0081] S62,根據消息函數的調用地址解析消息函數的具有第二格式的第二參數。
[0082] S64,遍歷第二參數,判斷第二參數中是否包含選擇地址。
[0083] S66,若第二參數中包含選擇地址,則確定不對選擇地址進行加密混淆處理。
[0084] S68,若第二參數中不包含選擇地址,則確定需對選擇地址進行加密混淆處理。
[0085] 可選地,上述步驟S208中調用預定的加密混淆算法對選擇地址進行加密混淆處 理包括:讀取選擇地址中的字符串;調用信息摘要算法或安全哈希算法,對字符串進行加 密混淆處理;將進行加密混淆處理后的字符串寫入選擇地址中。
[0086] 步驟S210,若選擇地址不包含反射調用函數,則直接調用預定的加密混淆算法對 選擇地址進行加密混淆處理。
[0087] 需要說明的是,selector是iOS應用里面對象之間相互調用的唯一紐帶, objectrive-c語言里面各個對象之間的調用不能使用類似c語言的函數指針地址,而是使 用selector做為選擇器,在運行時動態查找到真實的函數地址,然后跳轉到該地址完成調 用的。然而,現有技術中程序員在應用開發過程中,往往將selector命名成有真實意義字 符串,比如getPassword。這就導致黑客在逆向分析該應用安裝包的時候,通過逆向分析工 具可以搜索到這些selector,然后根據selector查找到真實的函數地址,并根據selector 的字面意思(getPassword)來猜測該函數的作用,從而造成應用的關鍵功能被黑客破解, 造成損失。本發明實施例的應用安裝包的加密混淆方法從二進制的層次,對這些selector 進行混淆和加密處理,使得攻擊者不能簡單的通過selector的字面含義來破解應用的關 鍵功能。
[0088] 由上可知,本申請上述實施例一所提供的方案,通過從二進制指令層對應用安裝 包的可執行文件進行判斷混淆,達到了提高函數安全性的目的,從而實現了不易破解、安全 性較高,并且對程序的性能沒有損耗的技術效果,進而解決了現有技術由于使用selector 命名代表當前方法實際功能,造成的函數容易被破解、安全性低的技術問題。
[0089] 可選地,獲取應用安裝包中的用于存取符號表的可執行文件,包括:獲取應用安裝 包;對所述應用安裝包進行解壓縮處理,得到可執行文件;其中,應用安裝包的加密混淆方 法還包括:將進行加密混淆處理后的可執行文件進行與解壓縮對應的打包處理,得到進行 加密混淆處理后的應用安裝包。
[0090] 可選地,上述步驟S210中調用預定的加密混淆算法對選擇地址進行加密混淆處 理包括:
[0091] S70,讀取選擇地址中的字符串。
[0092] 其中,每個selector為四個字節的地址,應用安裝包的加密混淆裝置則讀取該選 擇地址對應的內容。
[0093] S72,調用信息摘要算法或安全哈希算法,對字符串進行加密混淆處理。
[0094] 在上述步驟S72中,信息摘要算法可以包括MD5(Message Digest Algorithm 5, 信息摘要算法第五版),安全哈希算法可以包括SHAl (Secure Hash Algorithm,安全哈希算 法)、SHA128、SHA256。
[0095] S74,將進行加密混淆處理后的字符串寫入選擇地址中。
[0096] 本發明實施例提供的應用安裝包的加密混淆方法,由于是直接對編譯后的可執行 MACH-O文件進行處理,故無需源碼,且無需任何人為的配置,不會造成selector加密后iOS 應用無法運行、crash等穩定性問題和性能下降問題。
[0097] 另外,由于本發明是直接對MACH-O文件進行處理,開發人員在開發階段所使用的 靜態庫在編譯完成后已經直接合成到應用的MACH-O文件中,在對該MACH-O的selector進 行加密混淆的時候,已經對靜態庫本身的selector進行了加密和混淆處理。
[0098] 綜上,本發明可以實現無須源碼且可以對靜態庫的selector進行混淆的效果。
[0099] 本申請上述實施例提供的一種可選方案中,有兩種selector是需要進行特殊處 理的,具體如下:
[0100] (1)如果當前selector在代碼中有使用反射調用函數:NSClassFromString、 NSSelectorFromString、 NSProtocolFromString、 NSStringFromProtocol、 NSStringFromClassN NSStringFromSelector, 其中,NSStringFromProtocol、 NSStringFromC I as s N NSStringFromSe lector 分 另Ij 是 NSClassFromStr ing、 NSSelectorFromString、NSProtocolFromString 的反函數。
[0101] 在代碼中使用如下偽代碼進行調用,則需要對selector B對應的常量字符串進行 定位,按照預定的加密混淆算法,確保selector B及字符串B的混淆結果相同即可:
[0102] SEL selector = NSSelectorFromString (0',B")
[0103] (2)如果當前selector在各個方法調用中調用了父類的實現且父類的實現位于 dylib中,則這個selector無法混淆。例如:
[0104] 類 A 繼承自 /System/Library/Frameworks/Foundation. framework/Foundation 中的類B,類A重寫了 B中的方法methodl,如果在A的methodl中使用super關鍵字調用 了父類B的methodl方法,則methodl這個方法名不能進行混淆。
[0105] 簡單而言:
[0106] 步驟a,使用idc腳本導出iOS應用包中使用反射調用函數的調用方,并根據 反射調用函數的調用地址解析出其第一參數(類型為字符串)并保存為m,具體格式為 {name:offset},類型為hash類型,啟用name即調用反射函數的第一個參數,offset為該 字符串在文件中的偏移。Objective-c中常見的使用反射調用的函數有以下三個:
[0107] NSClassFromStr ing
[0108] NSSeIectorFromString
[0109] NSProtocolFromString
[0110] 步驟b,使用idc腳本導出iOS應用包中objc_msgSendSuper函數的調用方,并根 據objc_msgSendSuper函數的調用地址解析出第二參數(類型為selector)并保存為n,具 體格式為[nl]。
[0111] 步驟c,在m中查找是否存在上述selector,即如果m. name等于s,則將selector 和文件偏移m. offset處的m. name使用預定的加密混淆算法進行處理,并結束處理流程。否 則進入步驟d。
[0112] 步驟d,在η中遍歷查找上述selector,如果η中存在s,則s不能混淆。忽略這個 selector并繼續處理下一個selector。
[0113] 本發明與現有方案的關鍵區別是本發明從更低的層面(二進制層次)通過解析 i〇S應用包的MACH-O文件格式直接定位到selector的存儲位置,然后使用特定的算法對這 些selector進行加密混淆,整個過程可以通過工具自動化完成,無需人工干預、無需源碼、 不影響應用的穩定性和性能。
[0114] 在本發明實施例中,采用獲取應用安裝包中的用于存取符號表的可執行文件,其 中,可執行文件包括加載命令區、數據區以及具有第一長度的文件頭;依據具有第一長度的 文件頭遍歷加載命令區,在數據區中確定用于存放選擇地址的分區,其中,選擇地址用于調 用與選擇地址所指示的代碼;判斷分區中的選擇地址是否包含反射調用函數;若選擇地址 包含反射調用函數,則根據反射調用函數的調用地址判斷是否需對選擇地址進行加密混淆 處理,并在判斷出需對選擇地址進行加密混淆處理的情況下,調用預定的加密混淆算法對 選擇地址進行加密混淆處理;若選擇地址不包含反射調用函數,則直接調用預定的加密混 淆算法對選擇地址進行加密混淆處理的方式,通過從二進制指令層對應用安裝包的可執行 文件進行判斷混淆,達到了提高函數安全性的目的,從而實現了不易破解、安全性較高,并 且對程序的性能沒有損耗的技術效果,進而解決了現有技術由于使用selector命名代表 當前方法實際功能,造成的函數容易被破解、安全性低的技術問題。
[0115] 需要說明的是,對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列 的動作組合,但是本領域技術人員應該知悉,本發明并不受所描述的動作順序的限制,因為 依據本發明,某些步驟可以采用其他順序或者同時進行。其次,本領域技術人員也應該知 悉,說明書中所描述的實施例均屬于優選實施例,所涉及的動作和模塊并不一定是本發明 所必須的。
[0116] 通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到根據上述實施 例的方法可借助軟件加必需的通用硬件平臺的方式來實現,當然也可以通過硬件,但很多 情況下前者是更佳的實施方式。基于這樣的理解,本發明的技術方案本質上或者說對現有 技術做出貢獻的部分可以以軟件產品的形式體現出來,該計算機軟件產品存儲在一個存儲 介質(如R0M/RAM、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計 算機,服務器,或者網絡設備等)執行本發明各個實施例所述的方法。
[0117] 實施例2
[0118] 根據本發明實施例,還提供了一種用于實施上述方法實施例的裝置實施例,本申 請上述實施例所提供的裝置可以在計算機終端上運行。
[0119] 圖4是根據本申請實施例的應用安裝包的加密混淆裝置的結構示意圖。
[0120] 如圖4所示,該應用安裝包的加密混淆裝置可以包括獲取單元402、遍歷單元404、 判斷單元406以及加密混淆處理單元408。
[0121] 其中,獲取單元402,用于獲取應用安裝包中的用于存取符號表的可執行文件,其 中,所述可執行文件包括加載命令區、數據區以及具有第一長度的文件頭;遍歷單元404, 用于依據所述具有第一長度的文件頭遍歷所述加載命令區,在所述數據區中確定用于存放 選擇地址的分區,其中,所述選擇地址用于調用與所述選擇地址所指示的代碼;判斷單元 406,用于判斷所述分區中的所述選擇地址是否包含反射調用函數,以及若所述選擇地址包 含所述反射調用函數,則根據所述反射調用函數的調用地址判斷是否需對所述選擇地址進 行加密混淆處理;加密混淆處理單元408,用于在判斷出需對所述選擇地址進行加密混淆 處理的情況下,調用預定的加密混淆算法對所述選擇地址進行加密混淆處理,以及若所述 選擇地址不包含所述反射調用函數,則直接調用所述預定的加密混淆算法對所述選擇地址 進行加密混淆處理。
[0122] 由上可知,本申請上述實施例二所提供的方案,通過從二進制指令層對應用安裝 包的可執行文件進行判斷混淆,達到了提高函數安全性的目的,從而實現了不易破解、安全 性較高,并且對程序的性能沒有損耗的技術效果,進而解決了現有技術由于使用selector 命名代表當前方法實際功能,造成的函數容易被破解、安全性低的技術問題。
[0123] 此處需要說明的是,上述獲取單元402、遍歷單元404、判斷單元406以及加密混淆 處理單元408對應于實施例一中的步驟S202至步驟S210,四個模塊與對應的步驟所實現的 示例和應用場景相同,但不限于上述實施例一所公開的內容。需要說明的是,上述模塊作為 裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟件實現,也可以通 過硬件實現。
[0124] 可選地,所述判斷單元406用于執行以下步驟根據所述反射調用函數的調用地址 判斷是否需對所述選擇地址進行加密混淆處理:根據所述反射調用函數的調用地址解析所 述反射調用函數的具有第一格式的第一參數;判斷所述第一參數中是否包含所述選擇地 址;若所述第一參數中包含所述選擇地址,則確認需對所述選擇地址進行所述加密混淆處 理;若所述第一參數中不包含所述選擇地址,則根據所述應用安裝包中的消息函數的調用 地址判斷是否需對所述選擇地址進行所述加密混淆處理。
[0125] 可選地,所述判斷單元406用于執行以下步驟根據所述應用安裝包中的消息函數 的調用地址判斷是否需對所述選擇地址進行所述加密混淆處理:從所述應用安裝包中獲取 所述消息函數的調用地址;根據所述消息函數的調用地址解析所述消息函數的具有第二格 式的第二參數;遍歷所述第二參數,判斷所述第二參數中是否包含所述選擇地址;若所述 第二參數中包含所述選擇地址,則確定不對所述選擇地址進行所述加密混淆處理;若所述 第二參數中不包含所述選擇地址,則確定需對所述選擇地址進行所述加密混淆處理。
[0126] 可選地,所述遍歷單元404用于執行以下步驟依據所述具有第一長度的文件頭遍 歷所述加載命令區,在所述數據區中確定用于存放選擇地址的分區:將距離所述可執行文 件的起始位置第一長度處確定為第一個加載命令區的起始位置;根據所述文件頭的第一字 段確定加載命令區的個數;根據所述第一個加載命令區的起始位置以及所述加載命令區的 個數,確定每個加載命令區的起始位置;遍歷所述每個加載命令區,在所述數據區中確定用 于存放選擇地址的分區。
[0127] 可選地,所述遍歷單元404用于執行以下步驟遍歷所述每個加載命令區,在所述 數據區中確定用于存放選擇地址的分區:遍歷所述每個加載命令區,直到查找到包含有第 一預設字段的第一加載命令區,其中,所述第一預設字段設置于所述第一加載命令區中的 第二字段;根據所述第一預設字段中的第三字段確定所述數據區中的每個分段的起始偏 移;遍歷所述數據區中的每個分段,當查找到第一分段中的第四字段包含第二預設字段時, 確定用于存放所述選擇地址的第一分段;遍歷所述第一分段,當查找到所述第一分段中的 分區的第五字段包含第三預設字段時,確定所述用于存放選擇地址的分區。
[0128] 可選地,所述加密混淆處理單元408用于執行以下步驟調用預定的加密混淆算法 對所述選擇地址進行加密混淆處理:讀取所述選擇地址中的字符串;調用信息摘要算法或 安全哈希算法,對所述字符串進行加密混淆處理;將進行加密混淆處理后的字符串寫入所 述選擇地址中。
[0129] 可選地,如圖5所示,所述獲取單元402可以包括:獲取模塊502和解壓縮模塊 504〇
[0130] 其中,獲取模塊502,用于獲取所述應用安裝包;解壓縮模塊504,用于對所述應用 安裝包進行解壓縮處理,得到所述可執行文件;
[0131] 其中,所述裝置還包括:打包單元506。
[0132] 打包單元506,用于將進行加密混淆處理后的可執行文件進行與所述解壓縮對應 的打包處理,得到進行加密混淆處理后的應用安裝包。
[0133] 可選地,所述第一字段為ncmds字段,所述第二字段為cmd字段,所述第三字段為 payload字段,所述第四字段為segname字段,所述第五字段為nsects字段,所述第一預設 字段為LC_SEGMENT,所述第二預設字段為_DATA,所述第三預設字段為_objc_ selrefS。
[0134] 可選地,所述應用安裝包為iOS應用包,所述可執行文件為MACH-O文件。
[0135] 可選地,所述反射調用函數包括NSClassFromString函數、NSSelectorFromString 函數以及NSProtocolFromString函數;所述消息函數為objc_msgSendSuper函數。
[0136] 以可執行文件MACH-O文件為例,上述的加載命令區可以為MACH-O文件中的Load command,數據區可以按照segment來劃分,segment中又包含了多個section。
[0137] (I)MACH-O文件的文件頭格式可以包括:
[0138] struct mach_header { u I nt32_t magic; /* mach mag i c number identifier (mach 魔術字標
[0139] 識符)*/ cpu_type_t cputype; /* cpu specifier (cpui:i明符).*/ cpu_subtype_t cpusubtype; /*: machine specifier (機器說明符)*/ uint32_t fi Ietype.;: /* type, of f i Ie (文件類型)*/ uI nt32_t ncmds, /* number of load commands (Ioad commands 個數) */. uint.32._1: s i zeofcmds; /* the size of a I I the I oad commands (:全部 load commands 的長度).氺/ uint32_t flags;:: /* flags:.(.標簽〉*/ h
[0140] 其中,文件頭后面就是load command區,然后根據文件頭的ncmds和sizeofcmds 字段可以定位后續所有的load co_and數據。
[0141] (2) MACH-0文件的Load command格式可以包括:
[0142] struct ioad_command { U i nt32_t cmd ; /* type of I oad Gommand ( I oad command ) */ ui nt32_t cmds i ze ; /* tota I size of command in bytes (命令的總號、-節長 處)=¥ u8 pay Ioad [xxx]; h
[0143] 其中,load_co_and中的命令類型cmd和整個命令長度這兩個信息是固定格式, 都占據了前8個字節。
[0144] 但命令數據區payload的定義就完全不一樣了,取決于命令字cmd (payload的長 度取決于cmdsize)。
[0145] 例如,LC_SEGMENT這條命令,結構如下:
[0146] StfUGt Segmeirt_c<3iTraa.nd 丨 /* f.or 32~bi.t architectures (32-bit 結構)*/ uint32_t cmd; LC^SEGIENT
[0147] uint32_t Gmdsize; /* inoIudes sizeof section structs (sizeof section 結構)*/ ehar segname [16] , /* segment name (segment W uint32_t vmaddr; /* memory address of this segment (segment 的內存地址)本/ u i nt32_t vms i ze, /* memory size of this segment (segment 的內 存長度)*/ uint32__t f i Ieaff; /* f i Ie offset of this segment (segment 文件 偏移量)_*/ uint32_t f i Iesize;/* amount to map from the f i Ie (映射文件的量)*/ vm一prot_t: maxprot; maximum VM protection (最大的虛以相-保如)木/ vm_prot_t. initprot; /木 initial VM protection (最-初的虛松機保護)木/ u I nt32___t nsects ; /木 number of sect ions in segment ( segment 中sect i on的數量)*/ uint32_t flags, /* flags (標簽) h
[0148] 其中,load command里面除了 LC_SEGMENT這個命令,還有 LC_ID_DYLIB、LC_DYLD_ INFO、LC_SYMTAB等其余20余種command,每個command都有自己的功能,在此不再贅述D
[0149] 在LC_SEGMENT里面,根據LC_SEGMENT的結構的fileoff、nsects可以定位和遍 歷所有的 segment。常見的 segments 有 _TEXT、_DATA、_LINKEDIT 這三個,其中 _DATA 這個segments是我們關心的,_DATA segment里面也會包含有多個section結構,具體 section個數由segment結構中的nsects決定D
[0150] (3) section的結構可以包括:
[0151] struct section { /本 f<?r 32一bit archHectures char sect name 116] , /* name of this section (section 本 / char segname[16]; /本 segment this sect?〇? goes i ? */
[0152] u i nt 32_t ad dr; memory address of this section (section 的內 存地址)*/ uiη?32__? size; /* size in bytes of this section (section 的字 節長度〉 u i nt32_t offset t /本 file of 十 set of this section (sect i on 件:偏移量)*/ u i η?32-t align: /* section a I ignment (power of 2) (sect i on F人歹 iJ) u i nt.32_t re I off; /* f ? I e offset of relocation entries (重定 位表表項的偏移量)*/ uInt32_t nreIog; /* number of relocation entries (重定位表表 項數量> */ uiη?32__? flags; /木 flags (section type and attributes (section 類歲和屬性))*/ uint32___t reservedl ; /* reserved (for offset or index)(保存偏移量或 栺針 uint32_t reserved2; /* reserved (for count or sizeof)(保存 count 函數或s i zeof函數)*/ };
[0153] 需要補充的是,常見的 section 有 _nl_symbol_ptr、_la_symbol_ptr、_objc_ selrefs、-ob jc_classrefs、-ob jc-methname 等,其中,-ob jc_selrefs 保存著 iOS 應用 的所有selector。
[0154] 上述的選擇地址可以為MCH-O文件中的selector,上述的分區可以是MCH-O文 件中的section,上述的第一字段可以是MCH-O文件中的ncmds字段,上述的第一預設字段 可以是MCH-O文件中的LC_SEGMENT,上述的第二字段可以是MCH-O文件中的cmd字段,上 述的第三字段可以是MCH-O文件中的payload字段,上述的第四字段可以是MCH-O文件 中的segname字段,上述的第二預設字段可以是MCH-O文件中的_DATA,上述的第五字段 可以是MCH-O文件中的nsects字段,上述的第三預設字段可以是MCH-O文件中的_〇13加_ Selrefs0
[0155] 那么,應用安裝包的加密混淆裝置執行的步驟可以包括:按照文件頭的長度(假 定為h_size字節),在距離文件起始位置h_size處確定為load command結構的起始位置; 根據文件頭里面的ncmds字段確定load commands的個數(假定為lc_count個根據load command的結構遍歷所有load command,不超過lc_count次,當結構的cmd字段值為LC_ SEGMENT的時候,確認找到LC_SEGMENT ;LC_SEGMENT中的payload字段即為segment的起始 偏移,segments的總大小為LC_SEGMENT的cmdsize(假定為lc_size);根據segment的結 構及lc_size的總大小,開始查找_DATA。當segment結構的segname字段為"_DATA"的 時候確認找到存放selector的segment !Segment中包含多個section,根據Segment中的 nsects字段石角定Segment中有η個section,遍歷這η個section,當section中的segname 字段為"_objc_selrefs" 時,找到了存放 selector 的 section。
[0156] 根據配置選擇預定的加密混淆算法,依次讀取selector,每個selector為四個 字節地址,讀取該地址的字符串,判斷selector是否可以進行加密混淆處理,如果可以進 行加密混淆處理,則使用預定的加密混淆算法進行加密混淆處理;將混淆完的結果根據 selector的偏移寫入文件相應偏移處。
[0157] 在判斷selector是否可以進行加密混淆處理時,有兩種selector是需要進行特 殊處理的,具體如下:
[0158] (1)如果當前selector在代碼中有使用反射調用函數:NSClassFromString、 NSSelectorFromString、 NSProtocolFromString、 NSStringFromProtocol、 NSStringFromClassN NSStringFromSelector, 其中,NSStringFromProtocol、 NSStringFromC I as s N NSStringFromSe lector 分 另Ij 是 NSClassFromStr ing、 NSSelectorFromString、NSProtocolFromString 的反函數。
[0159] 在代碼中使用如下偽代碼進行調用,則需要對selector B對應的常量字符串進行 定位,按照預定的加密混淆算法,確保selector B及字符串B的混淆結果相同即可:
[0160] SEL selector = NSSelectorFromString (0',B")
[0161] (2)如果當前selector在各個方法調用中調用了父類的實現且父類的實現位于 dylib中,則這個selector無法混淆。例如:
[0162] 類 A 繼承自 /System/Library/Frameworks/Foundation. framework/Foundation 中的類B,類A重寫了 B中的方法methodl,如果在A的methodl中使用super關鍵字調用 了父類B的methodl方法,則methodl這個方法名不能進行混淆。
[0163] 簡單而言:
[0164] 步驟a,使用idc腳本導出iOS應用包中使用反射調用函數的調用方,并根據 反射調用函數的調用地址解析出其第一參數(類型為字符串)并保存為m,具體格式為 {name:offset},類型為hash類型,啟用name即調用反射函數的第一個參數,offset為該 字符串在文件中的偏移。Objective-c中常見的使用反射調用的函數有以下三個:
[0165] NSClassFromString
[0166] NSSeIectorFromString
[0167] NSProtocolFromString
[0168] 步驟b,使用idc腳本導出iOS應用包中objc_msgSendSuper函數的調用方,并根 據objc_msgSendSuper函數的調用地址解析出第二參數(類型為selector)并保存為n,具 體格式為[nl]。
[0169] 步驟c,在m中查找是否存在上述selector,即如果m. name等于s,則將selector 和文件偏移m. offset處的m. name使用預定的加密混淆算法進行處理,并結束處理流程。否 則進入步驟d。
[0170] 步驟d,在η中遍歷查找上述selector,如果η中存在s,則s不能混淆。忽略這個 selector并繼續處理下一個selector。
[0171] 本發明與現有方案的關鍵區別是本發明從更低的層面(二進制層次)通過解析 i〇S應用包的MACH-O文件格式直接定位到selector的存儲位置,然后使用特定的算法對這 些selector進行加密混淆,整個過程可以通過工具自動化完成,無需人工干預、無需源碼、 不影響應用的穩定性和性能。
[0172] 在本發明實施例中,采用獲取應用安裝包中的用于存取符號表的可執行文件,其 中,可執行文件包括加載命令區、數據區以及具有第一長度的文件頭;依據具有第一長度的 文件頭遍歷加載命令區,在數據區中確定用于存放選擇地址的分區,其中,選擇地址用于調 用與選擇地址所指示的代碼;判斷分區中的選擇地址是否包含反射調用函數;若選擇地址 包含反射調用函數,則根據反射調用函數的調用地址判斷是否需對選擇地址進行加密混淆 處理,并在判斷出需對選擇地址進行加密混淆處理的情況下,調用預定的加密混淆算法對 選擇地址進行加密混淆處理;若選擇地址不包含反射調用函數,則直接調用預定的加密混 淆算法對選擇地址進行加密混淆處理的方式,通過從二進制指令層對應用安裝包的可執行 文件進行判斷混淆,達到了提高函數安全性的目的,從而實現了不易破解、安全性較高,并 且對程序的性能沒有損耗的技術效果,進而解決了現有技術由于使用selector命名代表 當前方法實際功能,造成的函數容易被破解、安全性低的技術問題。
[0173] 實施例3
[0174] 本發明的實施例還提供了一種存儲介質。可選地,在本實施例中,上述存儲介質可 以用于保存上述實施例一所提供的應用安裝包的加密混淆方法所執行的程序代碼。
[0175] 可選地,在本實施例中,上述存儲介質可以位于計算機網絡中計算機終端群中的 任意一個計算機終端中,或者位于移動終端群中的任意一個移動終端中。
[0176] 可選地,在本實施例中,存儲介質被設置為存儲用于執行以下步驟的程序代碼:獲 取應用安裝包中的用于存取符號表的可執行文件,其中,所述可執行文件包括加載命令區、 數據區以及具有第一長度的文件頭;依據所述具有第一長度的文件頭遍歷所述加載命令 區,在所述數據區中確定用于存放選擇地址的分區,其中,所述選擇地址用于調用與所述選 擇地址所指示的代碼;判斷所述分區中的所述選擇地址是否包含反射調用函數;若所述選 擇地址包含所述反射調用函數,則根據所述反射調用函數的調用地址判斷是否需對所述選 擇地址進行加密混淆處理,并在判斷出需對所述選擇地址進行加密混淆處理的情況下,調 用預定的加密混淆算法對所述選擇地址進行加密混淆處理;若所述選擇地址不包含所述反 射調用函數,則直接調用所述預定的加密混淆算法對所述選擇地址進行加密混淆處理。
[0177] 可選地,存儲介質還被設置為存儲用于執行以下步驟的程序代碼:根據所述反射 調用函數的調用地址解析所述反射調用函數的具有第一格式的第一參數;判斷所述第一參 數中是否包含所述選擇地址;若所述第一參數中包含所述選擇地址,則確認需對所述選擇 地址進行所述加密混淆處理;若所述第一參數中不包含所述選擇地址,則根據所述應用安 裝包中的消息函數的調用地址判斷是否需對所述選擇地址進行所述加密混淆處理。
[0178] 可選地,存儲介質還被設置為存儲用于執行以下步驟的程序代碼:從所述應用安 裝包中獲取所述消息函數的調用地址;根據所述消息函數的調用地址解析所述消息函數的 具有第二格式的第二參數;遍歷所述第二參數,判斷所述第二參數中是否包含所述選擇地 址;若所述第二參數中包含所述選擇地址,則確定不對所述選擇地址進行所述加密混淆處 理;若所述第二參數中不包含所述選擇地址,則確定需對所述選擇地址進行所述加密混淆 處理。
[0179] 可選地,存儲介質還被設置為存儲用于執行以下步驟的程序代碼:將距離所述可 執行文件的起始位置第一長度處確定為第一個加載命令區的起始位置;根據所述文件頭的 第一字段確定加載命令區的個數;根據所述第一個加載命令區的起始位置以及所述加載命 令區的個數,確定每個加載命令區的起始位置;遍歷所述每個加載命令區,在所述數據區中 確定用于存放選擇地址的分區。
[0180] 可選地,存儲介質還被設置為存儲用于執行以下步驟的程序代碼:遍歷所述每個 加載命令區,直到查找到包含有第一預設字段的第一加載命令區,其中,所述第一預設字段 設置于所述第一加載命令區中的第二字段;根據所述第一預設字段中的第三字段確定所述 數據區中的每個分段的起始偏移;遍歷所述數據區中的每個分段,當查找到第一分段中的 第四字段包含第二預設字段時,確定用于存放所述選擇地址的第一分段;遍歷所述第一分 段,當查找到所述第一分段中的分區的第五字段包含第三預設字段時,確定所述用于存放 選擇地址的分區。
[0181] 可選地,存儲介質還被設置為存儲用于執行以下步驟的程序代碼:讀取所述選擇 地址中的字符串;調用信息摘要算法或安全哈希算法,對所述字符串進行加密混淆處理; 將進行加密混淆處理后的字符串寫入所述選擇地址中。
[0182] 可選地,存儲介質還被設置為存儲用于執行以下步驟的程序代碼:獲取所述應用 安裝包;對所述應用安裝包進行解壓縮處理,得到所述可執行文件;其中,所述方法還包 括:將進行加密混淆處理后的可執行文件進行與所述解壓縮對應的打包處理,得到進行加 密混淆處理后的應用安裝包。
[0183] 可選地,在本實施例中,上述存儲介質可以包括但不限于:U盤、只讀存儲器(R0M, Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者 光盤等各種可以存儲程序代碼的介質。
[0184] 可選地,本實施例中的具體示例可以參考上述實施例中所描述的示例,本實施例 在此不再贅述。
[0185] 上述本發明實施例序號僅僅為了描述,不代表實施例的優劣。
[0186] 在本發明的上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有 詳述的部分,可以參見其他實施例的相關描述。
[0187] 在本申請所提供的幾個實施例中,應該理解到,所揭露的訂單信息的處理裝置,可 通過其它的方式實現。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃 分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可 以結合或者可以集成到另一個系統,或一些特征可以忽略,或不執行。另一點,所顯示或討 論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合 或通信連接,可以是電性或其它的形式。
[0188] 所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯 示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個 網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目 的。
[0189] 另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以 是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單 元既可以采用硬件的形式實現,也可以采用軟件功能單元的形式實現。
[0190] 所述集成的單元如果以軟件功能單元的形式實現并作為獨立的產品銷售或使用 時,可以存儲在一個計算機可讀取存儲介質中。基于這樣的理解,本發明的技術方案本質上 或者說對現有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟件產品的形式 體現出來,該計算機軟件產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機 設備(可為個人計算機、服務器或者網絡設備等)執行本發明各個實施例所述方法的全部 或部分步驟。而前述的存儲介質包括:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機存 取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代 碼的介質。
[0191] 以上所述僅是本發明的優選實施方式,應當指出,對于本技術領域的普通技術人 員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應 視為本發明的保護范圍。
【主權項】
1. 一種應用安裝包的加密混淆方法,其特征在于,包括: 獲取應用安裝包中的用于存取符號表的可執行文件,其中,所述可執行文件包括加載 命令區、數據區以及具有第一長度的文件頭; 依據所述具有第一長度的文件頭遍歷所述加載命令區,在所述數據區中確定用于存放 選擇地址的分區,其中,所述選擇地址用于調用與所述選擇地址所指示的代碼; 判斷所述分區中的所述選擇地址是否包含反射調用函數; 若所述選擇地址包含所述反射調用函數,則根據所述反射調用函數的調用地址判斷是 否需對所述選擇地址進行加密混淆處理,并在判斷出需對所述選擇地址進行加密混淆處理 的情況下,調用預定的加密混淆算法對所述選擇地址進行加密混淆處理; 若所述選擇地址不包含所述反射調用函數,則直接調用所述預定的加密混淆算法對所 述選擇地址進行加密混淆處理。2. 根據權利要求1所述的方法,其特征在于,所述根據所述反射調用函數的調用地址 判斷是否需對所述選擇地址進行加密混淆處理,包括: 根據所述反射調用函數的調用地址解析所述反射調用函數的具有第一格式的第一參 數; 判斷所述第一參數中是否包含所述選擇地址; 若所述第一參數中包含所述選擇地址,則確認需對所述選擇地址進行所述加密混淆處 理; 若所述第一參數中不包含所述選擇地址,則根據所述應用安裝包中的消息函數的調用 地址判斷是否需對所述選擇地址進行所述加密混淆處理。3. 根據權利要求2所述的方法,其特征在于,所述根據所述應用安裝包中的消息函數 的調用地址判斷是否需對所述選擇地址進行所述加密混淆處理,包括: 從所述應用安裝包中獲取所述消息函數的調用地址; 根據所述消息函數的調用地址解析所述消息函數的具有第二格式的第二參數; 遍歷所述第二參數,判斷所述第二參數中是否包含所述選擇地址; 若所述第二參數中包含所述選擇地址,則確定不對所述選擇地址進行所述加密混淆處 理; 若所述第二參數中不包含所述選擇地址,則確定需對所述選擇地址進行所述加密混淆 處理。4. 根據權利要求1所述的方法,其特征在于,所述依據所述具有第一長度的文件頭遍 歷所述加載命令區,在所述數據區中確定用于存放選擇地址的分區,包括: 將距離所述可執行文件的起始位置第一長度處確定為第一個加載命令區的起始位 置; 根據所述文件頭的第一字段確定加載命令區的個數; 根據所述第一個加載命令區的起始位置以及所述加載命令區的個數,確定每個加載命 令區的起始位置; 遍歷所述每個加載命令區,在所述數據區中確定用于存放選擇地址的分區。5. 根據權利要求4所述的方法,其特征在于,所述遍歷所述每個加載命令區,在所述數 據區中確定用于存放選擇地址的分區,包括: 遍歷所述每個加載命令區,直到查找到包含有第一預設字段的第一加載命令區,其中, 所述第一預設字段設置于所述第一加載命令區中的第二字段; 根據所述第一預設字段中的第三字段確定所述數據區中的每個分段的起始偏移; 遍歷所述數據區中的每個分段,當查找到第一分段中的第四字段包含第二預設字段 時,確定用于存放所述選擇地址的第一分段; 遍歷所述第一分段,當查找到所述第一分段中的分區的第五字段包含第三預設字段 時,確定所述用于存放選擇地址的分區。6. 根據權利要求1所述的方法,其特征在于,所述調用預定的加密混淆算法對所述選 擇地址進行加密混淆處理包括: 讀取所述選擇地址中的字符串; 調用信息摘要算法或安全哈希算法,對所述字符串進行加密混淆處理; 將進行加密混淆處理后的字符串寫入所述選擇地址中。7. 根據權利要求1所述的方法,其特征在于,所述獲取應用安裝包中的用于存取符號 表的可執行文件,包括: 獲取所述應用安裝包; 對所述應用安裝包進行解壓縮處理,得到所述可執行文件; 其中,所述方法還包括: 將進行加密混淆處理后的可執行文件進行與所述解壓縮對應的打包處理,得到進行加 密混淆處理后的應用安裝包。8. 根據權利要求5所述的方法,其特征在于,所述第一字段為ncmds字段,所述第二字 段為cmd字段,所述第三字段為pay load字段,所述第四字段為segname字段,所述第五字 段為nsects字段,所述第一預設字段為LC_SEGMENT,所述第二預設字段為_DATA,所述第三 預設字段為_〇bjc_selrefs。9. 根據權利要求1至8中任一項所述的方法,其特征在于,所述應用安裝包為iOS應用 包,所述可執行文件為MACH-0文件。10. 根據權利要求1至8中任一項所述的方法,其特征在于, 所述反射調用函數包括NSClassFromString函數、NSSelectorFromString函數以及 NSProtocolFromString 函數; 所述消息函數為〇bjc_msgSendSuper函數。11. 一種應用安裝包的加密混淆裝置,其特征在于,包括: 獲取單元,用于獲取應用安裝包中的用于存取符號表的可執行文件,其中,所述可執行 文件包括加載命令區、數據區以及具有第一長度的文件頭; 遍歷單元,用于依據所述具有第一長度的文件頭遍歷所述加載命令區,在所述數據區 中確定用于存放選擇地址的分區,其中,所述選擇地址用于調用與所述選擇地址所指示的 代碼; 判斷單元,用于判斷所述分區中的所述選擇地址是否包含反射調用函數,以及若所述 選擇地址包含所述反射調用函數,則根據所述反射調用函數的調用地址判斷是否需對所述 選擇地址進行加密混淆處理; 加密混淆處理單元,用于在判斷出需對所述選擇地址進行加密混淆處理的情況下,調 用預定的加密混淆算法對所述選擇地址進行加密混淆處理,以及若所述選擇地址不包含所 述反射調用函數,則直接調用所述預定的加密混淆算法對所述選擇地址進行加密混淆處 理。12. 根據權利要求11所述的裝置,其特征在于,所述判斷單元用于執行以下步驟根據 所述反射調用函數的調用地址判斷是否需對所述選擇地址進行加密混淆處理: 根據所述反射調用函數的調用地址解析所述反射調用函數的具有第一格式的第一參 數; 判斷所述第一參數中是否包含所述選擇地址; 若所述第一參數中包含所述選擇地址,則確認需對所述選擇地址進行所述加密混淆處 理; 若所述第一參數中不包含所述選擇地址,則根據所述應用安裝包中的消息函數的調用 地址判斷是否需對所述選擇地址進行所述加密混淆處理。13. 根據權利要求12所述的裝置,其特征在于,所述判斷單元用于執行以下步驟根據 所述應用安裝包中的消息函數的調用地址判斷是否需對所述選擇地址進行所述加密混淆 處理: 從所述應用安裝包中獲取所述消息函數的調用地址; 根據所述消息函數的調用地址解析所述消息函數的具有第二格式的第二參數; 遍歷所述第二參數,判斷所述第二參數中是否包含所述選擇地址; 若所述第二參數中包含所述選擇地址,則確定不對所述選擇地址進行所述加密混淆處 理; 若所述第二參數中不包含所述選擇地址,則確定需對所述選擇地址進行所述加密混淆 處理。14. 根據權利要求11所述的裝置,其特征在于,所述遍歷單元用于執行以下步驟依據 所述具有第一長度的文件頭遍歷所述加載命令區,在所述數據區中確定用于存放選擇地址 的分區: 將距離所述可執行文件的起始位置第一長度處確定為第一個加載命令區的起始位 置; 根據所述文件頭的第一字段確定加載命令區的個數; 根據所述第一個加載命令區的起始位置以及所述加載命令區的個數,確定每個加載命 令區的起始位置; 遍歷所述每個加載命令區,在所述數據區中確定用于存放選擇地址的分區。15. 根據權利要求14所述的裝置,其特征在于,所述遍歷單元用于執行以下步驟遍歷 所述每個加載命令區,在所述數據區中確定用于存放選擇地址的分區: 遍歷所述每個加載命令區,直到查找到包含有第一預設字段的第一加載命令區,其中, 所述第一預設字段設置于所述第一加載命令區中的第二字段; 根據所述第一預設字段中的第三字段確定所述數據區中的每個分段的起始偏移; 遍歷所述數據區中的每個分段,當查找到第一分段中的第四字段包含第二預設字段 時,確定用于存放所述選擇地址的第一分段; 遍歷所述第一分段,當查找到所述第一分段中的分區的第五字段包含第三預設字段 時,確定所述用于存放選擇地址的分區。16. 根據權利要求11所述的裝置,其特征在于,所述加密混淆處理單元用于執行以下 步驟調用預定的加密混淆算法對所述選擇地址進行加密混淆處理: 讀取所述選擇地址中的字符串; 調用信息摘要算法或安全哈希算法,對所述字符串進行加密混淆處理; 將進行加密混淆處理后的字符串寫入所述選擇地址中。17. 根據權利要求11所述的裝置,其特征在于,所述獲取單元包括: 獲取模塊,用于獲取所述應用安裝包; 解壓縮模塊,用于對所述應用安裝包進行解壓縮處理,得到所述可執行文件; 其中,所述裝置還包括: 打包單元,用于將進行加密混淆處理后的可執行文件進行與所述解壓縮對應的打包處 理,得到進行加密混淆處理后的應用安裝包。18. 根據權利要求15所述的裝置,其特征在于,所述第一字段為ncmds字段,所述第二 字段為cmd字段,所述第三字段為payload字段,所述第四字段為segname字段,所述第五 字段為nsects字段,所述第一預設字段為LC_SEGMENT,所述第二預設字段為_DATA,所述第 三預設字段為_〇bjc_selrefs。19. 根據權利要求11至18中任一項所述的裝置,其特征在于,所述應用安裝包為iOS 應用包,所述可執行文件為MACH-0文件。20. 根據權利要求11至18中任一項所述的裝置,其特征在于, 所述反射調用函數包括NSClassFromString函數、NSSelectorFromString函數以及 NSProtocolFromString 函數; 所述消息函數為〇bjc_msgSendSuper函數。
【文檔編號】H04L29/06GK106034119SQ201510114467
【公開日】2016年10月19日
【申請日】2015年3月16日
【發明人】樊興華
【申請人】阿里巴巴集團控股有限公司