base64魔改算法 | jsvmp日志分析并還原

前言

上一篇我們講了標準 base64 算法還原,為了進一步學習 base64 算法特點,本文將結合 jsvmp 日志,實戰還原出 base64 魔改算法。

為了方便大家學習,我將入參和上篇文章一樣,入參為 Hello, World!

插樁

在js代碼中,找到 運算符 位置以及 apply 插樁點,結合插樁日志框架,代碼插樁如下:

jsvmp源碼:https://t.zsxq.com/B5aRh

base64魔改算法 | jsvmp日志分析并還原

日志分析

代碼執行后,日志如下:

1:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 0 ] 結果: 722:  函數: [Function: push] 調用者: [ 72 ] 參數: [ 72 ] 結果: 13:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 1 ] 結果: 1014:  函數: [Function: push] 調用者: [ 72, 101 ] 參數: [ 101 ] 結果: 25:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 2 ] 結果: 1086:  函數: [Function: push] 調用者: [ 72, 101, 108 ] 參數: [ 108 ] 結果: 37:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 3 ] 結果: 1088:  函數: [Function: push] 調用者: [ 72, 101, 108, 108 ] 參數: [ 108 ] 結果: 49:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 4 ] 結果: 11110:  函數: [Function: push] 調用者: [ 72, 101, 108, 108, 111 ] 參數: [ 111 ] 結果: 511:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 5 ] 結果: 4412:  函數: [Function: push] 調用者: [ 72, 101, 108, 108, 111, 44 ] 參數: [ 44 ] 結果: 613:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 6 ] 結果: 3214:  函數: [Function: push] 調用者: [72, 101, 108, 108,111,  44,  32
] 參數: [ 32 ] 結果: 715:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 7 ] 結果: 8716:  函數: [Function: push] 調用者: [72, 101, 108, 108,111,  44,  32,  87
] 參數: [ 87 ] 結果: 817:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 8 ] 結果: 11118:  函數: [Function: push] 調用者: [72, 101, 108, 108,111,  44,  32,  87,111
] 參數: [ 111 ] 結果: 919:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 9 ] 結果: 11420:  函數: [Function: push] 調用者: [72, 101, 108, 108,111,  44,  32,  87,111, 114
] 參數: [ 114 ] 結果: 1021:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 10 ] 結果: 10822:  函數: [Function: push] 調用者: [72, 101, 108, 108,111,  44,  32,  87,111, 114, 108
] 參數: [ 108 ] 結果: 1123:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 11 ] 結果: 10024:  函數: [Function: push] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100
] 參數: [ 100 ] 結果: 1225:  函數: [Function: charCodeAt] 調用者: Hello, World! 參數: [ 12 ] 結果: 3326:  函數: [Function: push] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100,  33
] 參數: [ 33 ] 結果: 1327:  0 + 3 ====> 328:  函數: [Function: slice] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100,  33
] 參數: [ 0, 3 ] 結果: [ 72, 101, 108 ]29:  函數: [Function: slice] 調用者: [ 72, 101, 108 ] 參數: [] 結果: [ 72, 101, 108 ]30:  3 - 3 ====> 031:  72 & 255 ====> 7232:  101 & 255 ====> 10133:  108 & 255 ====> 10834:  72 << 16 ====> 471859235:  101 << 8 ====> 2585636:  4718592 | 25856 ====> 474444837:  4744448 | 108 ====> 474455638:  4744556 >> 18 ====> 1839:  18 & 63 ====> 1840:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 18 ] 結果: w
第 41:  4744556 >> 12 ====> 115842:  1158 & 63 ====> 643:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 6 ] 結果: 444:  4744556 >> 6 ====> 7413345:  74133 & 63 ====> 2146:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 21 ] 結果: X47:  4744556 & 63 ====> 4448:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 44 ] 結果: u
第 49:  函數: [Function: apply] 調用者: [Function: t4] 參數: [ null, [ 72, 101, 108 ] ] 結果: [ 'w', '4', 'X', 'u' ]50:   + w ====> w
第 51:  w + 4 ====> w4
第 52:  w4 + X ====> w4X
第 53:  w4X + u ====> w4Xu
第 54:  0 + 3 ====> 355:  3 + 3 ====> 656:  函數: [Function: slice] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100,  33
] 參數: [ 3, 6 ] 結果: [ 108, 111, 44 ]57:  函數: [Function: slice] 調用者: [ 108, 111, 44 ] 參數: [] 結果: [ 108, 111, 44 ]58:  3 - 3 ====> 059:  108 & 255 ====> 10860:  111 & 255 ====> 11161:  44 & 255 ====> 4462:  108 << 16 ====> 707788863:  111 << 8 ====> 2841664:  7077888 | 28416 ====> 710630465:  7106304 | 44 ====> 710634866:  7106348 >> 18 ====> 2767:  27 & 63 ====> 2768:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 27 ] 結果: +69:  7106348 >> 12 ====> 173470:  1734 & 63 ====> 671:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 6 ] 結果: 472:  7106348 >> 6 ====> 11103673:  111036 & 63 ====> 6074:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 60 ] 結果: S75:  7106348 & 63 ====> 4476:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 44 ] 結果: u
第 77:  函數: [Function: apply] 調用者: [Function: t4] 參數: [ null, [ 108, 111, 44 ] ] 結果: [ '+', '4', 'S', 'u' ]78:  w4Xu + + ====> w4Xu+79:  w4Xu+ + 4 ====> w4Xu+480:  w4Xu+4 + S ====> w4Xu+4S
第 81:  w4Xu+4S + u ====> w4Xu+4Su
第 82:  3 + 3 ====> 683:  6 + 3 ====> 984:  函數: [Function: slice] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100,  33
] 參數: [ 6, 9 ] 結果: [ 32, 87, 111 ]85:  函數: [Function: slice] 調用者: [ 32, 87, 111 ] 參數: [] 結果: [ 32, 87, 111 ]86:  3 - 3 ====> 087:  32 & 255 ====> 3288:  87 & 255 ====> 8789:  111 & 255 ====> 11190:  32 << 16 ====> 209715291:  87 << 8 ====> 2227292:  2097152 | 22272 ====> 211942493:  2119424 | 111 ====> 211953594:  2119535 >> 18 ====> 895:  8 & 63 ====> 896:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 8 ] 結果: K97:  2119535 >> 12 ====> 51798:  517 & 63 ====> 599:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 5 ] 結果: h
第 100:  2119535 >> 6 ====> 33117101:  33117 & 63 ====> 29102:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 29 ] 結果: U103:  2119535 & 63 ====> 47104:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 47 ] 結果: F105:  函數: [Function: apply] 調用者: [Function: t4] 參數: [ null, [ 32, 87, 111 ] ] 結果: [ 'K', 'h', 'U', 'F' ]106:  w4Xu+4Su + K ====> w4Xu+4SuK
第 107:  w4Xu+4SuK + h ====> w4Xu+4SuKh
第 108:  w4Xu+4SuKh + U ====> w4Xu+4SuKhU
第 109:  w4Xu+4SuKhU + F ====> w4Xu+4SuKhUF
第 110:  6 + 3 ====> 9111:  9 + 3 ====> 12112:  函數: [Function: slice] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100,  33
] 參數: [ 9, 12 ] 結果: [ 114, 108, 100 ]113:  函數: [Function: slice] 調用者: [ 114, 108, 100 ] 參數: [] 結果: [ 114, 108, 100 ]114:  3 - 3 ====> 0115:  114 & 255 ====> 114116:  108 & 255 ====> 108117:  100 & 255 ====> 100118:  114 << 16 ====> 7471104119:  108 << 8 ====> 27648120:  7471104 | 27648 ====> 7498752121:  7498752 | 100 ====> 7498852122:  7498852 >> 18 ====> 28123:  28 & 63 ====> 28124:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 28 ] 結果: W125:  7498852 >> 12 ====> 1830126:  1830 & 63 ====> 38127:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 38 ] 結果: o
第 128:  7498852 >> 6 ====> 117169129:  117169 & 63 ====> 49130:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 49 ] 結果: J131:  7498852 & 63 ====> 36132:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 36 ] 結果: L133:  函數: [Function: apply] 調用者: [Function: t4] 參數: [ null, [ 114, 108, 100 ] ] 結果: [ 'W', 'o', 'J', 'L' ]134:  w4Xu+4SuKhUF + W ====> w4Xu+4SuKhUFW
第 135:  w4Xu+4SuKhUFW + o ====> w4Xu+4SuKhUFWo
第 136:  w4Xu+4SuKhUFWo + J ====> w4Xu+4SuKhUFWoJ
第 137:  w4Xu+4SuKhUFWoJ + L ====> w4Xu+4SuKhUFWoJL
第 138:  9 + 3 ====> 12139:  12 + 3 ====> 15140:  函數: [Function: slice] 調用者: [72, 101, 108, 108, 111,44,  32,  87, 111, 114,108, 100,  33
] 參數: [ 12, 15 ] 結果: [ 33 ]141:  函數: [Function: slice] 調用者: [ 33 ] 參數: [] 結果: [ 33 ]142:  3 - 1 ====> 2143:  函數: [Function: push] 調用者: [ 33, 0 ] 參數: [ 0 ] 結果: 2144:  3 - 1 ====> 2145:  函數: [Function: push] 調用者: [ 33, 0, 0 ] 參數: [ 0 ] 結果: 3146:  3 - 1 ====> 2147:  33 & 255 ====> 33148:  0 & 255 ====> 0149:  0 & 255 ====> 0150:  33 << 16 ====> 2162688151:  0 << 8 ====> 0152:  2162688 | 0 ====> 2162688153:  2162688 | 0 ====> 2162688154:  2162688 >> 18 ====> 8155:  8 & 63 ====> 8156:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 8 ] 結果: K157:  2162688 >> 12 ====> 528158:  528 & 63 ====> 16159:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 16 ] 結果: f
第 160:  2162688 >> 6 ====> 33792161:  33792 & 63 ====> 0162:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 0 ] 結果: D163:  2162688 & 63 ====> 0164:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 0 ] 結果: D165:  函數: [Function: apply] 調用者: [Function: t4] 參數: [ null, [ 33, 0, 0 ] ] 結果: [ 'K', 'f', 'D', 'D' ]166:  w4Xu+4SuKhUFWoJL + K ====> w4Xu+4SuKhUFWoJLK
第 167:  w4Xu+4SuKhUFWoJLK + f ====> w4Xu+4SuKhUFWoJLKf
第 168:  w4Xu+4SuKhUFWoJLKf + = ====> w4Xu+4SuKhUFWoJLKf=169:  w4Xu+4SuKhUFWoJLKf= + = ====> w4Xu+4SuKhUFWoJLKf==170:  12 + 3 ====> 15171:  函數: [Function: t4] 調用者: Object [global] {'@faceless': <ref *1> Object [global] {global: [Circular *1],queueMicrotask: [Function: queueMicrotask],clearImmediate: [Function: clearImmediate],setImmediate: [Function: setImmediate] {[Symbol(nodejs.util.promisify.custom)]: [Getter]},structuredClone: [Getter/Setter],clearInterval: [Function: clearInterval],clearTimeout: [Function: clearTimeout],setInterval: [Function: setInterval],setTimeout: [Function: setTimeout] {[Symbol(nodejs.util.promisify.custom)]: [Getter]},atob: [Getter/Setter],btoa: [Getter/Setter],performance: [Getter/Setter],fetch: [AsyncFunction: fetch],window: [Circular *1]},arguments: undefined,optimizedBase64Encode: [Function: t4]
} 參數: [ 'Hello, World!' ] 結果: w4Xu+4SuKhUFWoJLKf==
w4Xu+4SuKhUFWoJLKf==

實戰過程中,當看到 w4Xu+4SuKhUFWoJLKf== 這個字符后,看起來像是 base64 編碼,所以通過 atob 嘗試解碼,得到 ?\x85??\x84?*\x15\x05Z\x82K),顯然不對。

那分析日志吧!

29:  函數: [Function: slice] 調用者: [ 72, 101, 108 ] 參數: [] 結果: [ 72, 101, 108 ]30:  3 - 3 ====> 031:  72 & 255 ====> 7232:  101 & 255 ====> 10133:  108 & 255 ====> 10834:  72 << 16 ====> 471859235:  101 << 8 ====> 2585636:  4718592 | 25856 ====> 474444837:  4744448 | 108 ====> 474455638:  4744556 >> 18 ====> 1839:  18 & 63 ====> 1840:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 18 ] 結果: w
第 41:  4744556 >> 12 ====> 115842:  1158 & 63 ====> 643:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 6 ] 結果: 444:  4744556 >> 6 ====> 7413345:  74133 & 63 ====> 2146:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 21 ] 結果: X47:  4744556 & 63 ====> 4448:  函數: [Function: charAt] 調用者: Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe= 參數: [ 44 ] 結果: u

看到這段日志,有什么發現嗎?

上篇文章講過,如果是 3 個字節值通過位運算得到一個 4 個字節值,即:72, 101, 108 ===> 18, 6, 21, 44

所以,我們判斷,它大概是 標準base64或者變種 base64算法,由于我們驗證過,它不是標準base64,所以它應該是變種base64

那么,既然知道它大概是變種base64,那我們還需要一步一步去日志還原嗎?

答案肯定不需要的。

我們只需要拿著 base64標準算法模板去改就行。俗稱:套模板,大大節省我們的時間,而且也不容易出錯!

標準 base64 算法模版:https://t.zsxq.com/sphu5

首先控制入參一樣,即:Hello, World!

分析日志發現,首先它把標準的 base64 算法,碼表由 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 變成了 Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=

其次是:

31:  72 & 255 ====> 7232:  101 & 255 ====> 10133:  108 & 255 ====> 108

每次位運算之前,都進行了 & 255 操作。

所以我們只需要微調代碼,如下:

function processGroup(a, b, c) {a = a & 255; // 追加內容b = b & 255; // 追加內容c = c & 255; // 追加內容var combined = (a << 16) | (b << 8) | c;return [base64Chars.charAt((combined >> 18) & 63),base64Chars.charAt((combined >> 12) & 63),base64Chars.charAt((combined >> 6) & 63),base64Chars.charAt(combined & 63)];
}

最后,我們再驗證一下,發現結果也是 w4Xu+4SuKhUFWoJLKf==,和日志結果一致,說明我們還原成功!

完整代碼:https://t.zsxq.com/ROTc7

下一篇文章我們分析 RC4 jsvmp算法,學習它的日志特點。

請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90550.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3筆記(2)自用

目錄 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念與用法 1. 安裝與初始化 2. 創建 Store 3. 在組件中使用 Store 4. 高級用法 5、storeToRefs 二、Pinia 與 Vuex 的主要區別 三、為什么選擇 Pinia&#xff1f; 三、定義全局指令 1.封裝通用 DOM 操作&#…

大模型面試回答,介紹項目

1. 模型準備與轉換&#xff08;PC端/服務器&#xff09;你先在PC上下載或訓練好大語言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型轉換成瑞芯微NPU能用的專用格式&#xff08;.rkllm&#xff09;&#xff0c;并可選擇量化優化。把轉換好的模型文件拷…

Oracle 19.20未知BUG導致oraagent進程內存泄漏

故障現象查詢操作系統進程的使用排序&#xff0c;這里看到oraagent的物理內存達到16G&#xff0c;遠遠超過正常環境&#xff08;正常環境在19.20大概就是100M多一點&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

嘗試幾道算法題,提升python編程思維

一、跳躍游戲題目描述&#xff1a; 給定一個非負整數數組 nums&#xff0c;你最初位于數組的第一個下標。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標。示例&#xff1a;輸入&#xff1a;nums [2,3,1,1,4] → 輸出&#xff1a;True輸入…

【菜狗處理臟數據】對很多個不同時間序列數據的文件聚類—20250722

目錄 具體做法 可視化方法1&#xff1a;PCA降維 可視化方法2、TSNE降維可視化&#xff08;非線性降維&#xff0c;更適合聚類&#xff09; 可視化方法3、輪廓系數評判好壞 每個文件有很多行列的信息&#xff0c;每列是一個駕駛相關的數據&#xff0c;需要對這些文件進行聚類…

Qwen-MT:翻得快,譯得巧

我們再向大家介紹一位新朋友&#xff1a;機器翻譯模型Qwen-MT。開發者朋友們可通過Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;來直接體驗它又快又準的翻譯技能。 本次更新基于強大的 Qwen3 模型&#xff0c;進一步使用超大規模多語言和翻譯數據對模型進行訓練…

在 OceanBase 中,使用 TO_CHAR 函數 直接轉換日期格式,簡潔高效的解決方案

SQL語句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;關鍵說明&#xff1a;核心函數&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 將字符串轉為日期類型TO_CHAR(..., YYYY-MM-DD) → 格式化為 2015-03-30處理中文月份&a…

pnpm運行electronic項目報錯,npm運行正常。electronic項目打包為exe報錯

pnpm運行electronic項目報錯 使用 pnpm 運行 electronic 項目報錯&#xff0c;npm 運行正常&#xff0c;報錯內容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8?? 高級特性—— 列表生成式

文章目錄&#x1f9e0; 總結1. 基本語法2. 加篩選條件&#x1f501; 雙層循環&#xff08;全排列&#xff09;&#x1f4c2; 遍歷目錄&#x1f511; 遍歷字典&#x1f521; 轉小寫3. if 和 if...else 的區別4. 練習題&#x1f9e0; 總結 特性用法示例基礎語法[x for x in iter…

DocC的簡單使用

DocC的簡單使用 在寫3GShare中&#xff0c;由于剛開始使用MVC模式來寫東西&#xff0c;對很多東西都不是很熟&#xff0c;經常寫著寫著就忘了自己在寫什么&#xff0c;所以學了一下DocC來加快開發進度 什么是DocC 簡單來說&#xff0c;DocC就是更高級的注釋&#xff0c;雖然…

深入理解C語言快速排序與自省排序(Introsort)

排序算法是計算機科學中最基礎也是最重要的知識之一。快速排序&#xff08;Quicksort&#xff09;因其平均時間復雜度為 O(n log n) 而廣受歡迎&#xff0c;但在最壞情況下會退化到 O(n)。為了克服這一缺點&#xff0c;自省排序&#xff08;Introsort&#xff09; 應運而生&…

C#編程基礎:運算符與結構詳解

目錄 一.關系運算符 常見關系運算符 二.邏輯運算符 常見邏輯運算符 1. 邏輯與&#xff08;&& 或 and&#xff09; 2. 邏輯或&#xff08;|| 或 or&#xff09; 3. 邏輯非&#xff08;! 或 not&#xff09; 運算符優先級 三.if語句 1.c#程序的三大結構 1.順序…

嵌入式學習-土堆目標檢測(3)-day27

再學一個labelme在labelstudio環境中再pip install labelme安裝好后直接輸入 labelme之后點擊保存&#xff0c;選擇保存文件地址還有一個就是將labelme的格式轉化為yolo格式還是在labelstudio這個環境里面安裝pip install labelme2yolo

Qt OpenGL 集成:開發 3D 圖形應用

Qt 提供了完善的 OpenGL 集成方案&#xff0c;使開發者能夠在 Qt 應用中高效開發 3D 圖形應用。通過 Qt 的 OpenGL 模塊&#xff0c;可簡化 OpenGL 上下文管理、窗口渲染和跨平臺適配&#xff0c;同時結合現代 OpenGL 特性&#xff08;如著色器、頂點緩沖、紋理等&#xff09;實…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 熱詞評論查詢功能實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解熱詞評論查詢功能實現 視頻在線地址&#…

使用 Google Earth 的 DEM — 教程。

數字高程模型 (DEM)描繪了已知高程點之間的表面高程。本教程將向您展示如何使用 Google Earth 的高程數據生成 DEM。在當今世界&#xff0c;DEM 主要用于 GIS 應用。 當然&#xff0c;我們可以從美國地質調查局 (USGS) 網站下載數字高程模型 (DEM)。但如果我們想知道某個地點的…

在 UniApp 中實現中間凸起 TabBar 的完整指南

如何在 UniApp 中設置中間 TabBar 凸起效果 在移動應用開發中&#xff0c;TabBar 是常見的導航組件&#xff0c;而中間凸起的 TabBar 按鈕則是一種流行的設計風格&#xff0c;常用于突出重要功能&#xff08;如發布、拍照等&#xff09;。UniApp 提供了 midButton 屬性&#xf…

微觀低代碼

今日去深圳的一家工廠給客戶做培訓&#xff0c;主要培訓內容為低代碼產品的二開和功能演示。客戶使用了20年的ERP和OA系統&#xff0c;目前想對接到低代碼平臺。客戶目前想實現的主要功能是&#xff0c;對接OA的單點登錄&#xff0c;把ERP的功能遷移到低代碼平臺上來工廠規模比…

Linux進程控制:掌握系統的核心脈絡

Linux進程控制&#xff1a;掌握系統的核心脈絡 在 Linux 系統中&#xff0c;進程控制是系統運行的核心機制之一。無論是日常的命令行操作&#xff0c;還是復雜的后臺服務運行&#xff0c;都離不開對進程的管理和控制。本文將深入探討 Linux 進程控制的相關知識&#xff0c;幫助…

4N90-ASEMI電機控制專用4N90

編輯&#xff1a;LL4N90-ASEMI電機控制專用4N90型號&#xff1a;4N90品牌&#xff1a;ASEMI封裝&#xff1a;ITO-220ABRDS(on):3.60Ω批號&#xff1a;最新引腳數量&#xff1a;3封裝尺寸&#xff1a;如圖特性&#xff1a;N溝道MOS管工作結溫&#xff1a;-55℃~150℃一、卓越性…