国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]代碼理解之代碼可讀性:代碼反混淆

admin
2022年6月8日 16:48 本文熱度 1886

背景

代碼反混淆(deobfuscation)和代碼混淆(obfuscation)對(duì)應(yīng),是其逆過(guò)程。維基百科將代碼混淆定義為故意生成人類(lèi)難以理解的源代碼或機(jī)器碼的過(guò)程("In software developmentobfuscation is the deliberate act of creating source or machine code that is difficult for humans to understand.")。代碼反混淆可以理解為將原本人類(lèi)難以理解的代碼轉(zhuǎn)化為簡(jiǎn)單的、可理解的、直觀的代碼的過(guò)程。

這篇文章主要介紹一下 "Big Code" 在代碼反混淆領(lǐng)域的應(yīng)用。更具體一點(diǎn)就是介紹一下提出 "JSNice" 和 "Deguard" 的兩篇文章,這兩篇文章雖然已經(jīng)發(fā)表快五年了,但至今沒(méi)有文章Follow這兩份工作,因?yàn)槲恼乱呀?jīng)將使用 "Big Code" 做代碼命名反混淆做到了極致。后來(lái)的人無(wú)法在這個(gè)問(wèn)題上推陳出新,脫穎而出。

"Big Code": 代碼托管網(wǎng)站如GitHub上的大量免費(fèi)可用的高質(zhì)量代碼被稱(chēng)為 "Big Code" ,這些數(shù)據(jù)結(jié)合統(tǒng)計(jì)推理或深度學(xué)習(xí)為新興的開(kāi)發(fā)工具的出現(xiàn)提供了契機(jī)。

概率圖模型:概率圖模型是用圖來(lái)表示變量概率依賴(lài)關(guān)系的理論,結(jié)合概率論與圖論的知識(shí),利用圖來(lái)表示與模型有關(guān)的變量的聯(lián)合概率分布。

問(wèn)題

為了項(xiàng)目的安全,開(kāi)發(fā)者在打包發(fā)布項(xiàng)目時(shí)會(huì)對(duì)代碼進(jìn)行混淆加密,包括但不限于用無(wú)意義的短變量去重命名類(lèi)、變量、方法,以免代碼被輕易破解泄露。另外由于JS腳本主要用于Web開(kāi)發(fā),對(duì)其進(jìn)行混淆還能壓縮腳本的大小,使得瀏覽器下載、加載更加快速,提升用戶的瀏覽體驗(yàn)。

這一類(lèi)通過(guò)對(duì)類(lèi)、變量、方法重命名的混淆方案確實(shí)能加大其他開(kāi)發(fā)者對(duì)代碼的理解難度。其他開(kāi)發(fā)者不干了,為了能方便理解他人混淆后的代碼,學(xué)習(xí)(抄襲)他人的經(jīng)驗(yàn),針對(duì)這一類(lèi)混淆方法的反混淆方法也應(yīng)運(yùn)而生。

下面先展示一下安卓APP的代碼混淆技術(shù):

圖1. Java程序的代碼混淆過(guò)程

經(jīng)過(guò)混淆的代碼在功能上是沒(méi)有變化的,但是去掉了部分名稱(chēng)中的語(yǔ)義信息。因?yàn)榉N種限制,這類(lèi)混淆也不可能對(duì)所有的名稱(chēng)都進(jìn)行替換。上圖中的SQLiteHelper、SQLiteDatabase和Cursor就是一個(gè)證明,這些名稱(chēng)都是安卓API,如果將這些類(lèi)名混淆會(huì)影響代碼的功能。

理論上一個(gè)有經(jīng)驗(yàn)的安卓開(kāi)發(fā)者可以在這些有限的提示下為所有的名稱(chēng)找到富含語(yǔ)義的表示,所以反混淆只需要一個(gè)有經(jīng)驗(yàn)的開(kāi)發(fā)者(有經(jīng)驗(yàn)的開(kāi)發(fā)者:???我做錯(cuò)了什么)。退一步,找不到有經(jīng)驗(yàn)的開(kāi)發(fā)者怎么辦,沒(méi)關(guān)系,GitHub有高質(zhì)量的各種項(xiàng)目,現(xiàn)訓(xùn)練一個(gè)有經(jīng)驗(yàn)的開(kāi)發(fā)者也行。不過(guò)為了人道主義,消滅996剝削,程序員表示可以用程序代替人,正好可以用GitHub數(shù)據(jù)訓(xùn)練一個(gè)程序做這個(gè)反混淆嘛!理論存在,實(shí)踐開(kāi)始。

JSNice[1]

用程序代替人其實(shí)并不簡(jiǎn)單,針對(duì)上圖中的反混淆問(wèn)題,程序需要具有“聯(lián)想”和“推理”能力,比如從a extends SQLiteHelper這一句中,a應(yīng)該很可能也是Helper類(lèi),結(jié)合類(lèi)中有SQLiteDatabase實(shí)例推理出比較符合a的語(yǔ)義的類(lèi)名是DBHelper。

針對(duì)以上兩點(diǎn),程序需要先有關(guān)系的概念,能從一個(gè)詞“聯(lián)想”到另一個(gè)詞,然后還要有推理的能力,能通過(guò)約束從幾個(gè)候選詞中找到最符合的那個(gè)詞。怎么做這個(gè)事呢?雖然有很多的未混淆的JS腳本供程序?qū)W習(xí),但在反混淆JS腳本時(shí),程序無(wú)法理解復(fù)雜的JS腳本,所以需要將JS腳本表示成一種可以利用已知屬性推理未知屬性的結(jié)構(gòu),JSNice采用了概率圖模型。

概率圖模型相比其他學(xué)習(xí)算法的優(yōu)勢(shì)在于可以利用圖結(jié)構(gòu)將已知信息帶入知識(shí)網(wǎng)絡(luò),在使用概率圖模型之前,往往要求圖結(jié)構(gòu)是已知的。現(xiàn)實(shí)中我們沒(méi)有這些先驗(yàn)知識(shí),但是有大量的樣本(未混淆代碼)。通過(guò)樣本學(xué)習(xí)出未混淆JS腳本的概率圖就是JSNice的核心。

具體到JSNice,這個(gè)工具想要做的是為JS腳本推測(cè)名稱(chēng)(name)和類(lèi)型(type)。先通過(guò)一張圖看看JSNice的推理過(guò)程。

圖2. 一段推理出名稱(chēng)和類(lèi)型的Javascript程序及推理名稱(chēng)的推理過(guò)程

由于JSNice推理名稱(chēng)和推理類(lèi)型的過(guò)程類(lèi)似,本文就只闡述推理名稱(chēng)的過(guò)程。

1. 確定已知和未知屬性

JS腳本中包含了各類(lèi)代碼元素(elements)比如變量,常量,類(lèi),方法名,域等。對(duì)推理名稱(chēng)問(wèn)題,元素的屬性即帶有語(yǔ)義的名稱(chēng),一個(gè)需要推理名稱(chēng)的元素,稱(chēng)其屬性未知。不需要推理名稱(chēng)的元素其屬性已知。首先需要確定JS腳本中的元素屬性是否已知。很容易看出圖2(a)代碼中屬性已知的元素包括:常量0和[]、feild名稱(chēng)length和方法名稱(chēng)push,其他的局部變量如e,t,n,r和i的屬性都是未知的。

將問(wèn)題泛化,如何判斷任意的JS腳本中的任意元素的屬性是否已知是需要解決的第一個(gè)問(wèn)題。JSNice采用程序分析和人工指定的方式確定元素屬性是否已知,簡(jiǎn)單來(lái)說(shuō),JSNice認(rèn)為JS腳本中的常量(constants)、對(duì)象屬性名(objects properties)、方法名(methods)和全局變量名(global variables)都是屬性已知的元素,而所有的局部變量的屬性都是未知的。值得注意的是JSNice將對(duì)象屬性名稱(chēng)和API名稱(chēng)直接看做是常量。這個(gè)劃分是否合理暫不去討論,但是其確實(shí)適用與大部分的JS腳本。有興趣的讀者可以自行研究。

2. 建立依賴(lài)網(wǎng)絡(luò)

第一步獲取了JS腳本中的所有元素(屬性已知或未知),接下來(lái)需要建立元素之間的關(guān)系,好方便后續(xù)的推理;圖2(c)中簡(jiǎn)單的給出了一些關(guān)系,比如"var r = e.length"中可以得到(r, length, L=_.R)的關(guān)系。

JSNice實(shí)際考慮的元素關(guān)系十分復(fù)雜,主要有三類(lèi),這里簡(jiǎn)單的進(jìn)行描述:

  • 句法關(guān)系,這一類(lèi)關(guān)系主要通過(guò)AST得到,例子如下:
圖3. (a) 語(yǔ)句i + j < k的AST. (b) 根據(jù)AST建立用于名稱(chēng)預(yù)測(cè)的依賴(lài)網(wǎng)絡(luò). (c) 用于類(lèi)型預(yù)測(cè)的網(wǎng)絡(luò).

這類(lèi)關(guān)系的形式化定義如下

  • 別名關(guān)系,這類(lèi)關(guān)系通過(guò)standard alias analysis得到,將方法調(diào)用時(shí)傳入的arguments和方法聲明時(shí)的parameters進(jìn)行關(guān)聯(lián),形成ARG_TO_PM關(guān)系。
  • 函數(shù)名稱(chēng)關(guān)系,由于JS的語(yǔ)言特性,很多的局部變量本身是方法定義,MAY_CALL和MAY_ACCESS表示一個(gè)方法的可能調(diào)用方法關(guān)系和可能訪問(wèn)對(duì)象域關(guān)系,這類(lèi)關(guān)系可以通過(guò)program analysis得到。

類(lèi)型推理采用的關(guān)系有所不同,但這里也不再詳述,有興趣的讀者直接移步原文。

3. 訓(xùn)練和推理

現(xiàn)在整理一下對(duì)某個(gè)JS腳本x進(jìn)行上述兩步分析能得到什么?得到了一個(gè)依賴(lài)網(wǎng)絡(luò) [公式] ,其中 [公式] 為節(jié)點(diǎn)集,分別表示未知(unknow)屬性元素和已知屬性元素。 [公式] 為邊集,表示兩個(gè)程序元素之間的關(guān)系以及關(guān)系類(lèi)型。

現(xiàn)在不去考慮訓(xùn)練的過(guò)程,直接看一下推理過(guò)程,JSNice采用貪婪算法,對(duì)未知屬性元素遍歷其所有的屬性可能,尋找到使score最大的屬性作為結(jié)果。

圖4. 建立網(wǎng)絡(luò)尋找未知屬性元素y的最佳屬性的模式

具體的算法如下:

JSNice在具體實(shí)現(xiàn)時(shí)對(duì)算法有所優(yōu)化,但是其基本思想和主要框架都沒(méi)變。其實(shí)對(duì)比前文提到人進(jìn)行反混淆時(shí)需要的“聯(lián)想”和“推理”兩種能力,candidates函數(shù)擔(dān)負(fù)了“聯(lián)想”的重任,利用scoreEdges函數(shù)對(duì)不同的候選屬性計(jì)算score并選擇最大score對(duì)應(yīng)屬性的過(guò)程就是”推理“。

將圖2的推理部分摘出來(lái)看:

r的candidates有l(wèi)en和length,t的candidates有step、j和q,i的candidates只有i。推理得到的(r、i、t)的屬性是(len、i、step)而不是(length、i、step);是因?yàn)榍罢叩木C合score是0.4+0.8+0.5=1.7,而后者的綜合score只有0.5+0.6+0.5=1.6。

那么怎么得到scoreEdges和candidates函數(shù)呢?

JSNice定義了一個(gè)條件隨機(jī)場(chǎng):

x為給定某個(gè)JS腳本,y為未知屬性元素(復(fù)數(shù))的任意分配屬性,score為指示屬性y和腳本x的匹配程度的函數(shù),其返回值為實(shí)數(shù),值越大越匹配。

Z是對(duì)應(yīng)JS腳本x的一個(gè)懲罰系數(shù),用來(lái)保證其Pr和為1

將score定義為k個(gè)特征函數(shù)的加權(quán)平均,得到

最終條件隨機(jī)場(chǎng)的表示形式為:

寫(xiě)到這里,出現(xiàn)了第一個(gè)問(wèn)題,score為k個(gè)特征函數(shù)的加權(quán)平均,如何確定k呢?

JSNice是在訓(xùn)練階段的預(yù)處理步驟得到k的,實(shí)際上不僅僅這一步不僅獲得了k,還直接定義了k個(gè) pairwise feature functions [公式] 。

往前回一步,本文前面一直說(shuō)GitHub有未混淆的代碼可供概率圖模型學(xué)習(xí),這里定義訓(xùn)練集 [公式] 由t個(gè)未混淆的JS腳本組成。對(duì) [公式] 中的任意 [公式] 元組,JSNice定義其特征的集合為

整個(gè)訓(xùn)練集的所有特征集為

JSNice直接定義pairwise feature functions為每個(gè)特征三元組

的指示函數(shù):

所以訓(xùn)練集有多少特征三元組,k的值就有多大。

但說(shuō)了這么多,還是沒(méi)有提到scoreEdges和candidates。別急,直接定義

如此把前面的公式都串起來(lái)了,整個(gè)公式組其實(shí)只有 [公式] 是未知,條件隨機(jī)場(chǎng)的訓(xùn)練過(guò)程其實(shí)就是計(jì)算 [公式] 的過(guò)程。

至于candidates,假設(shè)現(xiàn)在概率圖模型中的 [公式] 已經(jīng)訓(xùn)練完成,根據(jù)前面的定義, [公式] 和 [公式] 其實(shí)是一一對(duì)應(yīng)的, [公式] 本身是特征三元組的指示函數(shù),也和三元組一一對(duì)應(yīng),所以可以使用權(quán)重 [公式] 直接限制節(jié)點(diǎn) [公式] 的可能取值。定義 [公式] 函數(shù)對(duì)輸入的特征三元組集合基于此權(quán)重返回top s的三元組。定義 [公式] 。定義如下輔助函數(shù):

最后:

candidates函數(shù)其實(shí)就是先在 [公式] 中找到和 [公式] 有 [公式] 關(guān)系的 [公式] ,然后利用 [公式] 和 [公式] 在訓(xùn)練集中找到和 [公式] 最相似的詞作為候選。比較方便的是輔助函數(shù)其實(shí)可以在預(yù)測(cè)之前提前計(jì)算并緩存下來(lái)。

由于筆者本身沒(méi)有不研究概率圖模型,所以訓(xùn)練模型得到 [公式] 的內(nèi)容就省略了,有興趣的讀者可以閱讀原文[1],本文只簡(jiǎn)單的描述:

JSNice采用判別式訓(xùn)練,由于最大似然需要計(jì)算 [公式] ,JSNice采用max-margin training,使用Structured Support Vector Machine (SSVM)并用scalable subgradient descent algorithm優(yōu)化。

Deguard[2]

相對(duì)JSNice做的對(duì)JS腳本進(jìn)行反混淆,Deguard對(duì)安卓APK做反混淆的難度要大了很多,放在眼前的一個(gè)問(wèn)題就是項(xiàng)目規(guī)模,JSNice的應(yīng)用scope其實(shí)是Web上的JS腳本,考慮網(wǎng)站的加載等限制,單個(gè)JS腳本必不會(huì)太大,而安卓APK不同,由于安卓本身事件驅(qū)動(dòng)的編程方式,一個(gè)簡(jiǎn)單的安卓APK的復(fù)雜度可能就能比得上十分復(fù)雜的JS腳本。并且安卓APK的大小一般也沒(méi)有限制。

還有一些安卓或者說(shuō)Java需要的約束是建模時(shí)需要考慮的,比如一個(gè)Java類(lèi)中的feilds名稱(chēng)必須不一樣,一個(gè)package中的classes名稱(chēng)必須不一樣。不滿足這些約束,對(duì)APK進(jìn)行反混淆的結(jié)果就失去了其實(shí)用性。

考慮到安卓application的復(fù)雜性,選取合適的粒度建模是首要的問(wèn)題,關(guān)系過(guò)于復(fù)雜不利于概率圖模型的學(xué)習(xí),關(guān)系過(guò)于簡(jiǎn)略可能導(dǎo)致無(wú)法預(yù)測(cè)準(zhǔn)確的屬性,必須有一個(gè)權(quán)衡。

1. 確定程序元素(圖的節(jié)點(diǎn) [公式] 

要為安卓APK定義一個(gè)依賴(lài)圖,首先確定圖上的節(jié)點(diǎn),Deguard考慮了APK中的如下元素:

  • Types,不管是基本類(lèi)型(int, long, float),引用類(lèi)型(Object, ArrayList),還是數(shù)組類(lèi)型(int[], Object[])都能做為節(jié)點(diǎn)
  • Feilds,APK中的任意類(lèi)中定義的任意Feild都能做為節(jié)點(diǎn)
  • Packages,APK中的任意package能做為節(jié)點(diǎn),像package a.b就可以做為兩個(gè)節(jié)點(diǎn),a和a.b。
  • Methods,APK中的任意方法都能做為節(jié)點(diǎn),但是如果有overrides關(guān)系,那么子類(lèi)和父類(lèi)的method公用一個(gè)節(jié)點(diǎn)表示。
  • Constant values and null
  • Access Modifiers,比如static,synchronized
  • Operations

這里沒(méi)有考慮Java語(yǔ)言中的泛型機(jī)制是因?yàn)樵诰幾g過(guò)程中會(huì)消除泛型,APK本身就是編譯過(guò)后的文件。另外和JSNice不一樣的是,Deguard沒(méi)有考慮局部變量名和參數(shù)名,但考慮了局部變量的類(lèi)型和參數(shù)的類(lèi)型,一方面減少規(guī)模,另一方面就是變量名和參數(shù)名本身不在APK中。

2. 確定元素屬性是否已知

這里將元素屬性定義為節(jié)點(diǎn)是否被混淆,屬性已知說(shuō)明節(jié)點(diǎn)名稱(chēng)未被混淆,不需要預(yù)測(cè)名稱(chēng),屬性未知說(shuō)明節(jié)點(diǎn)名稱(chēng)已被混淆,需要預(yù)測(cè)名稱(chēng)。

已知屬性元素包括

  • 節(jié)點(diǎn)如果代表pakages,classes,methods和feilds且在安卓API中,那么這些節(jié)點(diǎn)是已知的,因?yàn)榛诿Q(chēng)的混淆工具并不會(huì)混淆這些名稱(chēng)
  • 構(gòu)造函數(shù)名稱(chēng)都是已知的
  • 節(jié)點(diǎn)代表對(duì)安卓API方法重寫(xiě)的方法也是已知的,因?yàn)榍拔囊呀?jīng)提過(guò),重寫(xiě)關(guān)系其實(shí)是用一個(gè)節(jié)點(diǎn)表示。

剩下的元素都是未知的,需要預(yù)測(cè)名稱(chēng)

3. 構(gòu)建依賴(lài)網(wǎng)絡(luò)

Deguard用一張圖詳細(xì)描述了其用于構(gòu)建依賴(lài)網(wǎng)絡(luò)的關(guān)系

圖5. 安卓application采用的關(guān)聯(lián)程序元素的關(guān)系,第二列定義了邊的類(lèi)型,如果滿足第三列提出的條件,一個(gè)關(guān)系就成立

相對(duì)JSNice中大部分的關(guān)系來(lái)自AST,Deguard選擇的關(guān)系明顯融合進(jìn)了人的經(jīng)驗(yàn),更加的抽象。實(shí)際上本文的精華也是這一張圖,某種程度上這圖中展現(xiàn)出來(lái)了人類(lèi)對(duì)具體問(wèn)題具體分析的思考,而不是僅僅簡(jiǎn)單的復(fù)用已有工作提出的各種關(guān)系。

剩下的內(nèi)容比如模型的訓(xùn)練和推理其實(shí)和JSNice差不多,這里不會(huì)重復(fù)一遍,后續(xù)會(huì)講不一樣的地方,也就是Deguard如何處理Java程序帶來(lái)的關(guān)于各種名稱(chēng)的約束。

Java中的名稱(chēng)約束還是比較復(fù)雜的,這里拿一個(gè)例子講一下:

圖6. 展示方法命名顯示的例子
  1. A.a(A)沒(méi)有任何約束,因?yàn)锳作為參數(shù)的方法只有它一個(gè)
  2. A.b(Object)不能被重命名為equals,因?yàn)檫@樣會(huì)override java.lang.Object.equals(Object)
  3. B.g()和B.h()方法重命名名稱(chēng)必須不一樣,因?yàn)檫@兩方法的特征一樣
  4. B.g()和A.c()方法重命名名稱(chēng)必須不一樣,如果一樣就是隱式的繼承
  5. B.h()和A.c()方法重命名名稱(chēng)必須不一樣,也是由于method overriding的原因
  6. C.x()和B.h()卻沒(méi)有沖突,因?yàn)锽.h()是private的

相等約束(繼承重寫(xiě)機(jī)制)可通過(guò)共用節(jié)點(diǎn)表示,不等約束也需要明確表示,所以Deguard提出了一個(gè)檢測(cè)方法名稱(chēng)不等約束的算法

其他元素,比如類(lèi)名,F(xiàn)eilds名稱(chēng)的不等約束比較簡(jiǎn)單,直接處理就行。

所有不等約束以集合 [公式] 表示, [公式] , [公式] 中任意兩個(gè)節(jié)點(diǎn)的名稱(chēng)必須不一樣。

注意這個(gè)約束只用與預(yù)測(cè)階段,因?yàn)橛?xùn)練數(shù)據(jù)(未混淆)本身滿足這些約束。很容易可以把這些約束結(jié)合到JSNice的算法1中。

Deguard的概率圖優(yōu)化算法和JSNice也不一樣,采用的是pseudo likelihood estimation。具體闡述推薦閱讀文章[3]

值得注意的是,為什么JSNice就沒(méi)有Deguard中提到的相等約束和不等約束,筆者個(gè)人認(rèn)為還是由問(wèn)題和語(yǔ)言特性共同決定,JSNice的名稱(chēng)預(yù)測(cè)其實(shí)只預(yù)測(cè)了局部變量,而JS的語(yǔ)言特性導(dǎo)致其本身不需要檢測(cè)局部變量的名稱(chēng)沖突,只有執(zhí)行結(jié)果報(bào)錯(cuò)才會(huì)說(shuō)明程序出錯(cuò)。也就是說(shuō)其實(shí)JS本身語(yǔ)言特性就沒(méi)有這類(lèi)約束,自然不需要建模。

總結(jié)

提出JSNice和Deguard的兩篇文章算是基于 "Big Code" 的較早的研究了,這兩個(gè)工具現(xiàn)在還在維護(hù)并可用(JSNice[4]、Deguard[5])也證明了基于 "Big Code" 的研究和工具確實(shí)是可行可信有前途的。

從文章的研究思路來(lái)看,基于 "Big Code" 的研究首先需要判斷:"Big Code"能夠做到什么和做出來(lái)的東西能不能make sense兩個(gè)問(wèn)題。分享的兩篇文章能夠發(fā)表就在于大家相信基于已有開(kāi)源項(xiàng)目做反混淆這件事是合理的。

另外一個(gè)就是找到問(wèn)題本身和建模并解決問(wèn)題同等重要甚至更加重要。這兩篇文章其實(shí)都是做的一件事,就是做代碼命名推薦。而作者能夠在命名推薦這個(gè)大的領(lǐng)域內(nèi)(領(lǐng)域太大),找到完整程序的代碼命名推薦(難以入手,沒(méi)有已知)問(wèn)題,再進(jìn)一步縮小Scope到基于部分已知命名的完整程序的代碼命名推薦(可以做,"Big Code"可以支持)這件事,這個(gè)范圍內(nèi)還正好有兩個(gè)應(yīng)用(JS腳本和安卓APK的反混淆)可以支撐研究,真正是十分厲害也比較走運(yùn)。

結(jié)合現(xiàn)在深度學(xué)習(xí)的風(fēng)口,其實(shí)從應(yīng)用的角度來(lái)看,模型的復(fù)雜度和創(chuàng)新度并不重要,還是模型和問(wèn)題本身的契合度更加重要。

參考

  1. ^abPredicting Program Properties from "Big Code". https://files.sri.inf.ethz.ch/website/papers/jsnice15.pdf
  2. ^Statistical Deobfuscation of Android Applications. https://files.sri.inf.ethz.ch/website/papers/deguard.pdf
  3. ^ C. Sutton and A. McCallum. An introduction to conditional random fields. Found. Trends Mach. Learn., 4(4):267–373, Apr. 2012.
  4. ^項(xiàng)目地址 http://www.jsnice.org/
  5. ^項(xiàng)目地址 http://apk-deguard.com/

該文章在 2022/6/8 16:48:09 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲国产精品sss在线观看av | 亚洲精品无码专区 | 国产激情久久久久影院小草 | 国产WW久久久久久久久久 | 一区二区视频传媒有限公司 | 国产精品久久无码不卡 | 无码纯肉视频在线观看 | 蜜臀av在线观看 | 麻豆精品成人免费国产片 | 免费的成人电影 | 国产成人喷潮在线观看 | 尤物在线精品视频 | 亚洲精品国品乱码久久久久 | 香港三级韩国三级日本三级 | 99久久免费国产精品 | 国产精品久久久久久无码人妻 | 亚州国产av一区二区三区伊在 | 亚洲一日韩欧美中文字幕在线 | 国产成人午夜精品一区二区三区 | 国产精品va在线观看无码 | 亚洲精品乱码久久久久久按摩 | 中文字幕久久久久一区 | 亚洲欧美另类天天更新影院 | 国产日韩视频 | 熟妇人妻水多爽中文字幕 | 亚洲精品无码午夜福利理论片麻豆 | 欧美日韩性高爱潮视频 | 午夜第九理论达达兔影院 | 亚洲专区不卡中文字幕人成乱码熟女 | 一本之道中文字幕久久美香 | 久久精品99久久无色码中文字幕 | 亚洲国产精品自在在线 | 国产中文字幕在线 | 91精品久久久久久久99蜜桃 | 亚洲av永久青草无码精品 | 日日碰狠狠躁久久躁婷婷 | 国产在线精品一区二区在线观看 | 最新69成人国产精品视频免费 | 亚洲国产精品尤物yw在线 | 人妻体内射精一区二区三四 | 国产婷婷视频在线观看 |