主頁 > 軟體設計 > 面試官不講武德,居然讓我講講蠕蟲和金絲雀!

面試官不講武德,居然讓我講講蠕蟲和金絲雀!

2020-11-20 12:12:43 軟體設計

蠕蟲病毒是一種常見的利用Unix系統中的缺點來進行攻擊的病毒,緩沖區溢位一個常見的后果是:黑客利用函式呼叫程序中程式的回傳地址,將存放這塊地址的指標精準指向計算機中存放攻擊代碼的位置,造成程式例外中止,為了防止發生嚴重的后果,計算機會采用堆疊隨機化,利用金絲雀值檢查破壞堆疊,限制代碼可執行區域等方法來盡量避免被攻擊,雖然,現代計算機已經可以“智能”查錯了,但是我們還是要養成良好的編程習慣,盡量避免寫出有漏洞的代碼,以節省寶貴的時間!

蠕蟲病毒簡介

??蠕蟲是一種可以自我復制的代碼,并且通過網路傳播,通常無需人為干預就能傳播,蠕蟲病毒入侵并完全控制一臺計算機之后,就會把這臺機器作為宿主,進而掃描并感染其他計算機,當這些新的被蠕蟲入侵的計算機被控制之后,蠕蟲會以這些計算機為宿主繼續掃描并感染其他計算機,這種行為會一直延續下去,蠕蟲使用這種遞回的方法進行傳播,按照指數增長的規律分布自己,進而及時控制越來越多的計算機, (來源百度百科)

緩沖區溢位

??緩沖區溢位是指當計算機向緩沖區內填充資料位數時超過了緩沖區本身的容量,溢位的資料覆寫在合法資料上,理想的情況是:程式會檢查資料長度,而且并不允許輸入超過緩沖區長度的字符,但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩沖區溢位埋下隱患,作業系統所使用的緩沖區,又被稱為“堆疊”,在各個操作行程之間,指令會被臨時儲存在“堆疊”當中,“堆疊”也會出現緩沖區溢位, (來源百度百科)

緩沖區溢位舉例

void echo()
{
  char buf[4];   /*故意設定很小*/
  gets(buf);
  puts(buf);
}
void call_echo(){
  echo();
}

??反匯編如下:

/*echo*/
000000000040069c <echo>: 
40069c:48 83 ec 18         sub $0x18,%rsp  /*0X18 == 24,分配了24位元組記憶體,計算機會多分配一些給緩沖區*/
4006a0:48 89 e7            mov %rsp,%rdi   
4006a3:e8 a5 ff ff ff      callq 40064d <gets>
4006a8::48 89 e7           mov %rsp,%rdi
4006ab:e8 50  fe ff ff     callq callq 400500 <puts@plt>
4006b0:48 83 c4 18         add $0x18,%rsp 
4006b4:c3                  retq 
/*call_echo*/
4006b5:48 83  ec 08             sub $0x8,%rsp 
4006b9:b8 00 00 00 00           mov $0x0,%eax
4006be:e8 d9 ff ff ff           callq 40069c <echo>
4006c3:48 83 c4 08              add $0x8,%rsp 
4006c7:c3                       retq

??在這個例子中,我們故意把buf設定的很小,運行該程式,我們在命令列中輸入012345678901234567890123,程式立馬就會報錯:Segmentation fault,

??要想明白為什么會報錯,我們需要通過分析反匯編來了解其在記憶體是如何分布的,具體如下圖所示:

??如下圖所示,此時計算機為buf分配了24位元組空間,其中20位元組還未使用,

image-20201111215122537

??此時,準備呼叫echo函式,將其回傳地址壓堆疊,

image-20201111214702010

??當我們輸入“01234567890123456789012"時,緩沖區已經溢位,但是并沒有破壞程式的運行狀態,

image-20201111214811039

??當我們輸入:“012345678901234567890123",緩沖區溢位,回傳地址被破壞,程式回傳 0x0400600,

image-20201111214914863

??這樣程式就跳轉到了計算機中其他記憶體的位置,很大可能這塊記憶體已經被使用,跳轉修改了原來的值,所以程式就會中止運行,

??黑客可以利用這個漏洞,將程式精準跳轉到其存放木馬的位置,然后就會執行木馬程式,對我們的計算機造成破壞,

緩沖區溢位的危害

??可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作,緩沖區溢位攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段,第一個緩沖區溢位攻擊–Morris蠕蟲,發生在二十年前,它曾造成了全世界6000多臺網路服務器癱瘓,

??在當前網路與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢位,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲,而緩沖區溢位中,最為危險的是堆疊溢位,因為入侵者可以利用堆疊溢位,在函式回傳時改變回傳程式的地址,讓其跳轉到任意地址,帶來的危害一種是程式崩潰導致拒絕服務,另外一種就是跳轉并且執行一段惡意代碼,比如得到shell,然后為所欲為, (來源百度百科)

記憶體在計算機中的排布方式

??記憶體在計算機中的排布方式如下,從上到下依次為共享庫,堆疊,堆,資料段,代碼段,各個段的作用簡介如下(更詳細的內容總結見嵌入式軟體開發知識點總結.pdf):

??共享庫:共享庫以.so結尾.(so==share object)在程式的鏈接時候并不像靜態庫那樣在拷貝使用函式的代碼,而只是作些標記,然后在程式開始啟動運行的時候,動態地加載所需模塊,所以,應用程式在運行的時候仍然需要共享庫的支持,共享庫鏈接出來的檔案比靜態庫要小得多,

??堆疊:堆疊又稱堆疊,是用戶存放程式臨時創建的變數,也就是我們函式{}中定義的變數但不包括static宣告的變數,static意味著在資料段中存放變數,除此之外,在函式被呼叫時,其引數也會被壓入發起呼叫的行程堆疊中,并且待到呼叫結束后,函式的回傳值也會被存放回堆疊中,由于堆疊的先進后出特點,所以堆疊特別方便用來保存、恢復呼叫現場,從這個意義上講,我們可以把堆疊看成一個寄存,交換臨時資料的記憶體區,在X86-64 Linux系統中,堆疊的大小一般為8M(用ulitmit - a命令可以查看),

??:堆是用來存放行程中被動態分配的記憶體段,它的大小并不固定,可動態擴張或縮減,當行程呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態分配到堆上,當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除,

??堆存放new出來的物件、堆疊里面所有物件都是在堆里面有指向的、假如堆疊里指向堆的指標被洗掉、堆里的物件也要釋放(C++需要手動釋放)、當然我們現在好面向物件程式都有’垃圾回識訓制’、會定期的把堆里沒用的物件清除出去,

??資料段:資料段通常用來存放程式中已初始化的全域變數和已初始化為非0的靜態變數的一塊記憶體區域,屬于靜態記憶體分配,直觀理解就是C語言程式中的全域變數(注意:全域變數才算是程式的資料,區域變數不算程式的資料,只能算是函式的資料

??代碼段:代碼段通常用來存放程式執行代碼的一塊區域,這部磁區域的大小在程式運行前就已經確定了,通常這塊記憶體區域屬于只讀,有些架構也允許可寫,在代碼段中也有可能包含以下只讀的常數變數,例如字串常量等,程式段為程式代碼在記憶體中映射一個程式可以在記憶體中有多個副本,

image-20201111151446190

??下面舉個例子來看下代碼中各個部分再計算機中是如何排布的,

#include <stdio.h>
#include <stdlib.h>

char big_array[1L<<24];     /*16 MB*/
char huge_array[1L<<31];    /*2 GB*/

int global = 0;

int useless() {return 0;}

int main()
{
  void *phuge1,*psmall2,*phuge3,*psmall4;
  int local = 0;
  phuge1 = malloc(1L<<28);    /*256 MB*/
  psmall2 = malloc(1L<<8);    /*256 B*/
  phuge3 = malloc(1L<<32);    /*4 GB*/
  psmall4 = malloc(1L<<8);    /*256 B*/
  /*some print statements....*/
}

??上述代碼中,程式中的各個變數在記憶體的排布方式如下圖所示,根據顏色可以一一對應起來,由于了local變數存放在堆疊區,四個指標變數使用了malloc分配了空間,所以存放在堆上,兩個陣列big_array,huge_array存放在資料段,main,useless函式的其他部分存放在代碼段中,

image-20201111153803357

計算機中越界訪問的后果

??下面再看一個例子,看下越界訪問記憶體會有什么結果,

typedef struct 
{
  int a[2];
  double d;
}struct_t;

double fun(int i){

  volatile struct_t s;
  s.d = 3.14;
  s.a[i] = 1073741824;  /*可能越界*/
  return s.d;
}

int main()
{
  printf("fun(0):%lf\n",fun(0));
  printf("fun(1):%lf\n",fun(1));
  printf("fun(2):%lf\n",fun(2));
  printf("fun(3):%lf\n",fun(3));
  printf("fun(6):%lf\n",fun(6));
  return 0; 
}

??列印結果如下所示

fun(0):3.14
fun(1):3.14
fun(2):3.1399998664856
fun(3):2.00000061035156
fun(6):Segmentation fault

??在上面的程式中,我們定義了一個結構體,其中 a 陣列中包含兩個整數值,還有 d 一個雙精度浮點數,在函式fun中,fun函式根據傳入的引數i來初始化a陣列,顯然,i的值只能為0和1,在fun函式中,同時還設定了d的值為3.14,當我們給fun函式傳入0和1時可以列印出正確的結果3.14,但是當我們傳入2,3,6時,奇怪的現象發生了,為什么fun(2)和fun(3)的值會接近3.14,而fun(6)會報錯呢?

??要搞清楚這個問題,我們要明白結構體在記憶體中是如何存盤的,具體如下圖所示,

image-20201111165638477

??GCC默認不檢查陣列越界,除非加編譯選項,這也是C的bug之一,越界會修改某些記憶體的值,得出我們意想不到的結果,即使有些資料相隔萬里,也可能受到影響,當一個系統這幾天運行正常時,過幾天可能就會崩潰,(如果這個系統是運行在我們的心臟起搏器,又或者是航天飛行器上,那么這無疑將會造成巨大的損失!)

??如上圖所示,對于最下面的兩個元素,每個塊代表 4 位元組,a陣列占用8個位元組,d變數占用8位元組,d排布在a陣列的上方,所以我們會看到,如果我參考 a[0] 或者 a[1],會按照正常修改該陣列的值,但是當我呼叫 fun(2) 或者 fun(3)時,實際上修改的是這個浮點數 d 的位元組,這就是為什么我們列印出來的fun(2)和fun(3)的值如此接近3.14,當輸入 6 時,就修改了對應的這塊記憶體的值,原來這塊記憶體可能存盤的其他用于維持程式運行的內容,而且是已經分配的記憶體,所示,我們程式就會報出Segmentation fault的錯誤,當我們理解了資料結構的機器級表示以及它們是如何運行的,處理這些漏洞也就很輕松了,

避免緩沖區溢位的三種方法

??為了在系統中插入攻擊代碼,攻擊者既要插入代碼,也要插入指向這段代碼的指標,這個指標也是攻擊字串的一部分,產生這個指標需要知道這個字串放置的堆疊地址,在過去,程式的堆疊地址非常容易預測,對于所有運行同樣程式和作業系統版本的系統來說,在不同的機器之間,堆疊的位置是相當固定的,因此,如果攻擊者可以確定一個常見的Web服務器所使用的堆疊空間,就可以設計一個在許多機器上都能實施的攻擊,

堆疊隨機化

??堆疊隨機化的思想使得堆疊的位置在程式每次運行時都有變化,因此,即使許多機器都運行同樣的代碼,它們的堆疊地址都是不同的,實作的方式是:程式開始時,在堆疊上分配一段0 ~ n位元組之間的隨機大小的空間,例如,使用分配函式alloca在堆疊上分配指定位元組數量的空間,程式不使用這段空間,但是它會導致程式每次執行時后續的堆疊位置發生了變化,分配的范圍n必須足夠大,才能獲得足夠多的堆疊地址變化,但是又要足夠小,不至于浪費程式太多的空間,

int main(){
	long local;
	printf("local at %p\n",&local);
	return 0;
}

??這段代碼只是簡單地列印出main函式中區域變數的地址,在32位 Linux上運行這段代碼10000次,這個地址的變化范圍為0xff7fc59c到0xffffd09c,范圍大小大約是 2 23 {2^{23}} 223,在更新一點兒的機器上運行64位 Linux,這個地址的變化范圍為0x7fff0001b698到0x7ffffffaa4a8,范圍大小大約是 2 32 {2^{32}} 232

??其實,一個好的黑客專家,可以使用蠻力破壞堆疊的隨機化,對于32位的機器,我們列舉 2 15 = 32768 {2^{15}} = 32768 215=32768個地址就能猜出來堆疊的地址,對于64位的機器,我們需要列舉 2 24 = 16777216 {2^{24}} = 16777216 224=16777216次,如此看來,堆疊的隨機化降低了病毒或者蠕蟲的傳播速度,但是也不能提供完全的安全保障,

檢測堆疊是否被破壞

??計算機的第二道防線是能夠檢測到何時堆疊已經被破壞,我們在echo函式示例中看到,當訪問緩沖區越界時,會破壞程式的運行狀態,在C語言中,沒有可靠的方法來防止對陣列的越界寫,但是,我們能夠在發生了越界寫的時候,在造成任何有害結果之前,嘗試檢測到它,

??GCC在產生的代碼中加人了一種堆疊保護者機制,來檢測緩沖區越界,其思想是在堆疊幀中任何區域緩沖區與堆疊狀態之間存盤一個特殊的金絲雀( canary)值,如下圖所示:

image-20201112085448688

??這個金絲雀值,也稱為哨兵值,是在程式每次運行時隨機產生的,因此,攻擊者沒有簡單的辦法能夠知道它是什么,在恢復暫存器狀態和從函式回傳之前,程式檢查這個金絲雀值是否被該函式的某個操作或者該函式呼叫的某個函式的某個操作改變了,如果是的,那么程式例外中止,

image-20201112085829359

英國礦井飼養金絲雀的歷史大約起始1911年,當時,礦井作業條件差,礦工在下井時時常冒著中毒的生命危險,后來,約翰·斯科特·霍爾丹(John Scott Haldane)在經過對一訊訓碳一番研究之后,開始推薦在煤礦中使用金絲雀檢測一訊訓碳和其他有毒氣體,金絲雀的特點是極易受有毒氣體的侵害,因為它們平常飛行高度很高,需要吸入大量空氣吸入足夠氧氣,因此,相比于老鼠或其他容易攜帶的動物,金絲雀會吸入更多的空氣以及空氣中可能含有的有毒物質,這樣,一旦金絲雀出了事,礦工就會迅速意識到礦井中的有毒氣體濃度過高,他們已經陷入危險之中,從而及時撤離,

??GCC會試著確定一個函式是否容易遭受堆疊溢位攻擊,并且自動插入這種溢位檢測,實際上,對于前面的堆疊溢位展示,我們不得不用命令列選項“-fno- stack- protector”來阻止GCC產生這種代碼,當不用這個選項來編譯echo函式時,也就是允許使用堆疊保護,得到下面的匯編代碼

/*void echo */
subq $24,%rsp Allocate 24 bytes on stack
movq  %fs:40,%rax  Retrieve canary 
movq %rax,8(%rsp) Store on stack
xorl %eax, %eax Zero out register 
movq %rsp, %rdi  Compute buf as %rsp 
call gets Call gets 
movq ‰rsp,%rdi Compute buf as %rsp
call puts Call puts 
movq 8(%rsp),%rax Retrieve canary 
xorq %fs:40,%rax Compare to stored value
je .L9  If =, goto ok 
call __stack_chk_fail Stack corrupted 
.L9
addq $24,%rsp Deallocate stack space 
ret

??這個版本的函式從記憶體中讀出一個值(第4行),再把它存放在堆疊中相對于%rsp偏移量為8的地方,指令引數各fs:40指明金絲雀值是用段尋址( segmented addressing)從記憶體中讀入的,段尋址機制可以追溯到80286的尋址,而在現代系統上運行的程式中已經很少見到了,將金絲雀值存放在一個特殊的段中,標志為“只讀”,這樣攻擊者就不能覆寫存盤金絲雀值,在恢復暫存器狀態和回傳前,函式將存盤在堆疊位置處的值與金絲雀值做比較(通過第12行的xorq指令),如果兩個數相同,xorq指令就會得到0,函式會按照正常的方式完成,非零的值表明堆疊上的金絲雀值被修改過,那么代碼就會呼叫一個錯誤處理例程,

??堆疊保護很好地防止了緩沖區溢位攻擊破壞存盤在程式堆疊上的狀態,通常只會帶來很小的性能損失,

限制可執行代碼區域

??最后一招是消除攻擊者向系統中插入可執行代碼的能力,一種方法是限制哪些記憶體區域能夠存放可執行代碼,在典型的程式中,只有保存編譯器產生的代碼的那部分記憶體才需要是可執行的,其他部分可以被限制為只允許讀和寫,許多系統允許控制三種訪問形式:讀(從記憶體讀資料)、寫(存盤資料到記憶體)和執行(將記憶體的內容看作機器級代碼),以前,x86體系結構將讀和執行訪問控制合并成一個1位的標志,這樣任何被標記為可讀的頁也都是可執行的,堆疊必須是既可讀又可寫的,因而堆疊上的位元組也都是可執行的,已經實作的很多機制,能夠限制一些頁是可讀但是不可執行的,然而這些機制通常會帶來嚴重的性能損失,

總結

??計算機提供了多種方式來彌補我們犯錯可能產生的嚴重后果,但是最關鍵的還是我們盡量減少犯錯,例如,對于gets,strcpy等函式我們應替換為 fgets,strncpy等,在陣列中,我們可以將陣列的索引宣告為size_t 型別,從根本上防止它傳遞負數,此外,還可以在訪問陣列前來加上num<ARRAY_MAX陳述句來檢查陣列的上界,總之,要養成良好的編程習慣,這樣可以節省很多寶貴的時間,同時最后也推薦兩本相關書籍,代碼大全(第二版) 高質量程式設計指南 ,

??養成習慣,先贊后看!如果覺得寫的不錯,歡迎關注,點贊,轉發,謝謝!

著作權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
本文鏈接:https://blog.csdn.net/qq_16933601/article/details/109638145

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/225390.html

標籤:其他

上一篇:C語言真的很難嗎?那是你沒看這張圖,化整為零輕松學習C語言。

下一篇:推薦系統實戰 --- 基于音樂播放推薦

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more