360加固保so动态脱壳
环境及工具
手机 : 中兴 U887
系统版本: Android 2.3.5
工具 : IDA pro 6.6 、0101Editor
目前so加壳有很多家,我己知的有 爱加密,梆梆,360, 娜迦等 各有所长。今天把学习360的脱壳笔记记录下来与小菜共同学习,没有其它目的,大神请绕道!
1.对加壳后的so进行反编译,代码不能正常显示,被加密了,如下图所示:
[解决方案1:将elf文件的区节表相关的3个数据参数设置为0,然后用IDA打开]
[解决方案2:动态调试apk等到so加载到内存解密完成以后从内存中dump出来,使用Thomasking的so修复工具修复一下]
查看so的"INIT_ARRAY",指向了壳的入口, 如下图所示:
2.用IDA反编译加壳后的so文件,到0Xfd30去(壳的入口函数),如下图所示
3.通过上面分析知道了入口在"INIT_ARRAY",接下来动态调试,(如果不知道如何到该入口的可以参考 0n1y3nd's 大神写的文章
http://0nly3nd.sinaapp.com/?p=649)到达壳入口后如下图所示:
与静态分析时是一样的。
4.壳反调试检查是否有如下调试器 gdb、strace 、ltrace 、android_server,如下图所:
5.接下来解密第二层的壳代码,算法为RC4,如下图所示:
6.知道密钥和算法及要解密的数据与大小,我们来写程序静态解密so中的数据,解密后生成so文件然后反编译该文件,以前不能正常显示的代码现在都能正常显示了(第二层壳),如下图所示:
7.第二层的壳代码解密完后,INIT_ARRAY处的壳代码功能算是走完了,接着在JNI_OnLoad处下好断点,F9运行,如下图所示:
8.断在JNI_OnLoad后继续分析,Unk_8050303C函数解密原始so RC4算法,如下图所示:
解密后的数据以".lfx"开头, 如下所示:
9.将解密后的数据全部dump出来保存为lfx.Dump,与原始的so比较,看发生了什么变化,如下图所示:
10.将上面dump出来的文件lfx.Dump与没加壳前的so文件比较,发现不同的地方很多,说明还没有完全解密,继续分析,如下图所示:
开头4字节不一样
中间N多字节不一样
11.继分析后发现会对该文件的代码节进解压缩,这时候dump出来就会是原始的代码了,如下图所示:
解密原始so并解压代码的流程如下:

- 1 libjuan.so:8050303C loc_8050303C ; CODE XREF:
- 2
- 3 libjuan.so:JNI_OnLoad+34p
- 4 libjuan.so:8050303C F0 4F 2D E9 STMFD SP!, {R4-R11,LR}
- 5 libjuan.so:80503040 D0 B2 9F E5 LDR R11, =(unk_8050FEE0 - 0x80503054)
- 6 libjuan.so:80503044 D0 32 9F E5 LDR R3, =0xFFFFFF68
- 7 libjuan.so:80503048 D0 52 9F E5 LDR R5, =(unk_8050D940 - 0x80503060)
- 8 libjuan.so:8050304C 0B B0 8F E0 ADD R11, PC, R11 ; unk_8050FEE0
- 9 libjuan.so:80503050 03 30 9B E7 LDR R3, [R11,R3]
- 10 libjuan.so:80503054 5B DF 4D E2 SUB SP, SP, #0x16C
- 11 libjuan.so:80503058 05 50 8F E0 ADD R5, PC, R5 ; unk_8050D940
- 12 libjuan.so:8050305C 0C 30 8D E5 STR R3, [SP,#0xC]
- 13 libjuan.so:80503060 00 30 93 E5 LDR R3, [R3]
- 14 libjuan.so:80503064 05 10 A0 E1 MOV R1, R5
- 15 libjuan.so:80503068 0A 20 A0 E3 MOV R2, #0xA
- 16 libjuan.so:8050306C 1C 00 8D E2 ADD R0, SP, #0x1C
- 17 libjuan.so:80503070 64 31 8D E5 STR R3, [SP,#0x164]
- 18 libjuan.so:80503074 11 FE FF EB BL memcpy_0 ; 拷贝密钥0XA字节
- 19 libjuan.so:80503074 ; 46 45 88 89 98 99 87 87
- 20
- 21 65 87
- 22 libjuan.so:80503078 1C 00 8D E2 ADD R0, SP, #0x1C
- 23 libjuan.so:8050307C 0A 10 A0 E3 MOV R1, #0xA
- 24 libjuan.so:80503080 60 20 8D E2 ADD R2, SP, #0x60
- 25 libjuan.so:80503084 7E 0B 00 EB BL init_Key
- 26 libjuan.so:80503088 94 32 9F E5 LDR R3, =0xFFFFFF94
- 27 libjuan.so:8050308C 45 1C A0 E3+MOV R1, #0x451C ; 要解密的大小 0000451C
- 28 libjuan.so:80503094 03 90 9B E7 LDR R9, [R11,R3]
- 29 libjuan.so:80503098 60 20 8D E2 ADD R2, SP, #0x60 ; R2初始化的的密钥
- 30 libjuan.so:8050309C 00 60 A0 E3 MOV R6, #0
- 31 libjuan.so:805030A0 09 00 A0 E1 MOV R0, R9 ; R0要解密的数据 地址
- 32
- 33 805104CC
- 34 libjuan.so:805030A4 97 0C 00 EB BL rc4_crypt ; 解密原始的so文件
- 35 libjuan.so:805030A8 01 2C A0 E3 MOV R2, #0x100
- 36 libjuan.so:805030AC 00 10 A0 E3 MOV R1, #0
- 37 libjuan.so:805030B0 02 20 82 E2 ADD R2, R2, #2
- 38 libjuan.so:805030B4 60 00 8D E2 ADD R0, SP, #0x60
- 39 libjuan.so:805030B8 03 FE FF EB BL memset_0
- 40 libjuan.so:805030BC 04 00 A0 E3 MOV R0, #4
- 41 libjuan.so:805030C0 12 12 00 EB BL AnitDbg_0
- 42 libjuan.so:805030C4 20 40 99 E5 LDR R4, [R9,#0x20]
- 43 libjuan.so:805030C8 B2 33 D9 E1 LDRH R3, [R9,#0x32]
- 44 libjuan.so:805030CC 28 20 A0 E3 MOV R2, #0x28
- 45 libjuan.so:805030D0 04 40 89 E0 ADD R4, R9, R4
- 46 libjuan.so:805030D4 92 43 23 E0 MLA R3, R2, R3, R4
- 47 libjuan.so:805030D8 10 30 93 E5 LDR R3, [R3,#0x10]
- 48 libjuan.so:805030DC 03 30 89 E0 ADD R3, R9, R3
- 49 libjuan.so:805030E0 04 30 8D E5 STR R3, [SP,#4]
- 50 libjuan.so:805030E4 76 10 00 EB BL __gnu_armfini_11
- 51 libjuan.so:805030E8 0D 20 A0 E3 MOV R2, #0xD
- 52 libjuan.so:805030EC 0C 10 85 E2 ADD R1, R5, #0xC
- 53 libjuan.so:805030F0 28 00 8D E2 ADD R0, SP, #0x28
- 54 libjuan.so:805030F4 F1 FD FF EB BL memcpy_0
- 55 libjuan.so:805030F8 28 00 8D E2 ADD R0, SP, #0x28
- 56 libjuan.so:805030FC D3 14 00 EB BL GetBase64String
- 57 libjuan.so:80503100 38 10 8D E2 ADD R1, SP, #0x38
- 58 libjuan.so:80503104 28 00 8D E2 ADD R0, SP, #0x28
- 59 libjuan.so:80503108 38 60 8D E5 STR R6, [SP,#0x38]
- 60 libjuan.so:8050310C 3C 60 8D E5 STR R6, [SP,#0x3C]
- 61 libjuan.so:80503110 40 60 8D E5 STR R6, [SP,#0x40]
- 62 libjuan.so:80503114 44 60 8D E5 STR R6, [SP,#0x44]
- 63 libjuan.so:80503118 48 60 8D E5 STR R6, [SP,#0x48]
- 64 libjuan.so:8050311C 4C 60 8D E5 STR R6, [SP,#0x4C]
- 65 libjuan.so:80503120 50 60 8D E5 STR R6, [SP,#0x50]
- 66 libjuan.so:80503124 54 60 8D E5 STR R6, [SP,#0x54]
- 67 libjuan.so:80503128 58 60 8D E5 STR R6, [SP,#0x58]
- 68 libjuan.so:8050312C 5C 60 8D E5 STR R6, [SP,#0x5C]
- 69 libjuan.so:80503130 4D 13 00 EB BL DecBase64String
- 70 libjuan.so:80503134 1C 10 85 E2 ADD R1, R5, #0x1C
- 71 libjuan.so:80503138 06 20 A0 E3 MOV R2, #6
- 72 libjuan.so:8050313C 14 00 8D E2 ADD R0, SP, #0x14
- 73 libjuan.so:80503140 DE FD FF EB BL memcpy_0
- 74 libjuan.so:80503144 14 00 8D E2 ADD R0, SP, #0x14
- 75 libjuan.so:80503148 06 10 A0 E3 MOV R1, #6
- 76 libjuan.so:8050314C 8A FF FF EB BL DecString_0
- 77 libjuan.so:80503150 B0 33 D9 E1 LDRH R3, [R9,#0x30]
- 78 libjuan.so:80503154 06 00 53 E1 CMP R3, R6
- 79 libjuan.so:80503158 03 60 A0 01 MOVEQ R6, R3
- 80 libjuan.so:8050315C 39 00 00 0A BEQ loc_80503248
- 81 libjuan.so:80503160 C0 71 9F E5 LDR R7, =(dword_805149E8 - 0x80503170)
- 82 libjuan.so:80503164 06 80 A0 E1 MOV R8, R6
- 83 libjuan.so:80503168 07 70 8F E0 ADD R7, PC, R7 ; dword_805149E8
- 84 libjuan.so:8050316C
- 85 libjuan.so:8050316C loc_8050316C ; CODE XREF:
- 86
- 87 libjuan.so:__gnu_arm_flush+350j
- 88 libjuan.so:8050316C 04 C0 9D E5 LDR R12, [SP,#4]
- 89 libjuan.so:80503170 00 00 94 E5 LDR R0, [R4]
- 90 libjuan.so:80503174 14 10 8D E2 ADD R1, SP, #0x14
- 91 libjuan.so:80503178 00 00 8C E0 ADD R0, R12, R0
- 92 libjuan.so:8050317C DE FD FF EB BL strcmp ; 与.text比较
- 93 libjuan.so:80503180 00 30 50 E2 SUBS R3, R0, #0
- 94 libjuan.so:80503184 3D 00 00 1A BNE loc_80503280
- 95 libjuan.so:80503188 10 50 94 E5 LDR R5, [R4,#0x10]
- 96 libjuan.so:8050318C 14 C0 94 E5 LDR R12, [R4,#0x14]
- 97 libjuan.so:80503190 05 A0 99 E7 LDR R10, [R9,R5]
- 98 libjuan.so:80503194 08 C0 8D E5 STR R12, [SP,#8]
- 99 libjuan.so:80503198 00 30 8D E5 STR R3, [SP]
- 100 libjuan.so:8050319C 0A 00 A0 E1 MOV R0, R10
- 101 libjuan.so:805031A0 C3 FD FF EB BL malloc
- 102 libjuan.so:805031A4 00 60 50 E2 SUBS R6, R0, #0
- 103 libjuan.so:805031A8 05 50 89 E0 ADD R5, R9, R5
- 104 libjuan.so:805031AC 00 30 9D E5 LDR R3, [SP]
- 105 libjuan.so:805031B0 51 00 00 0A BEQ loc_805032FC
- 106 libjuan.so:805031B4 00 00 5A E3 CMP R10, #0
- 107 libjuan.so:805031B8 14 00 00 DA BLE loc_80503210
- 108 libjuan.so:805031BC 68 11 9F E5 LDR R1, =0xFFFFFF70
- 109 libjuan.so:805031C0 04 20 A0 E3 MOV R2, #4
- 110 libjuan.so:805031C4 01 E0 9B E7 LDR LR, [R11,R1]
- 111 libjuan.so:805031C8 00 10 9E E5 LDR R1, [LR]
- 112 libjuan.so:805031CC
- 113 libjuan.so:805031CC loc_805031CC ; CODE XREF:
- 114
- 115 libjuan.so:__gnu_arm_flush+28Cj
- 116 libjuan.so:805031CC 03 00 13 E3 TST R3, #3
- 117 libjuan.so:805031D0 07 00 00 1A BNE loc_805031F4
- 118 libjuan.so:805031D4 FE 00 51 E3 CMP R1, #0xFE
- 119 libjuan.so:805031D8 05 00 00 8A BHI loc_805031F4
- 120 libjuan.so:805031DC 4C 01 9F E5 LDR R0, =0xFFFFFF6C
- 121 libjuan.so:805031E0 02 C0 D5 E7 LDRB R12, [R5,R2]
- 122 libjuan.so:805031E4 01 10 81 E2 ADD R1, R1, #1
- 123 libjuan.so:805031E8 00 00 9B E7 LDR R0, [R11,R0]
- 124 libjuan.so:805031EC 01 20 82 E2 ADD R2, R2, #1
- 125 libjuan.so:805031F0 43 C1 C0 E7 STRB R12, [R0,R3,ASR#2]
- 126 libjuan.so:805031F4
- 127 libjuan.so:805031F4 loc_805031F4 ; CODE XREF:
- 128
- 129 libjuan.so:__gnu_arm_flush+254j
- 130 libjuan.so:805031F4 ;
- 131
- 132 libjuan.so:__gnu_arm_flush+25Cj
- 133 libjuan.so:805031F4 02 00 D5 E7 LDRB R0, [R5,R2]
- 134 libjuan.so:805031F8 01 20 82 E2 ADD R2, R2, #1
- 135 libjuan.so:805031FC 03 00 C6 E7 STRB R0, [R6,R3]
- 136 libjuan.so:80503200 01 30 83 E2 ADD R3, R3, #1
- 137 libjuan.so:80503204 03 00 5A E1 CMP R10, R3
- 138 libjuan.so:80503208 EF FF FF 1A BNE loc_805031CC
- 139 libjuan.so:8050320C 00 10 8E E5 STR R1, [LR]
- 140 libjuan.so:80503210
- 141 libjuan.so:80503210 loc_80503210 ; CODE XREF:
- 142
- 143 libjuan.so:__gnu_arm_flush+23Cj
- 144 libjuan.so:80503210 08 C0 9D E5 LDR R12, [SP,#8]
- 145 libjuan.so:80503214 05 00 A0 E1 MOV R0, R5
- 146 libjuan.so:80503218 10 10 8D E2 ADD R1, SP, #0x10
- 147 libjuan.so:8050321C 06 20 A0 E1 MOV R2, R6
- 148 libjuan.so:80503220 0A 30 A0 E1 MOV R3, R10
- 149 libjuan.so:80503224 10 C0 8D E5 STR R12, [SP,#0x10]
- 150 libjuan.so:80503228 C2 FD FF EB BL uncompress_0 ; 解压代码(.text)
- 151 libjuan.so:8050322C 00 00 50 E3 CMP R0, #0 ; 这时候dump可以得到原始的so
- 152
- 153 so了
- 154 libjuan.so:80503230 27 00 00 0A BEQ loc_805032D4
- 155 libjuan.so:80503234 F8 30 9F E5 LDR R3, =0xFFFFFF60
- 156 libjuan.so:80503238 BF 2E A0 E3 MOV R2, #0xBF0
- 157 libjuan.so:8050323C 00 60 A0 E3 MOV R6, #0
- 158 libjuan.so:80503240 03 30 9B E7 LDR R3, [R11,R3]
- 159 libjuan.so:80503244 00 20 83 E5 STR R2, [R3]
- 160 libjuan.so:80503248
- 161 libjuan.so:80503248 loc_80503248 ; CODE XREF:
- 162
- 163 libjuan.so:__gnu_arm_flush+1E0j
- 164 libjuan.so:80503248 ;
- 165
- 166 libjuan.so:__gnu_arm_flush+354j ...
- 167 libjuan.so:80503248 0C C0 9D E5 LDR R12, [SP,#0xC]
- 168 libjuan.so:8050324C 64 21 9D E5 LDR R2, [SP,#0x164]
- 169 libjuan.so:80503250 06 00 A0 E1 MOV R0, R6
- 170 libjuan.so:80503254 00 30 9C E5 LDR R3, [R12]
- 171 libjuan.so:80503258 03 00 52 E1 CMP R2, R3
- 172 libjuan.so:8050325C 2C 00 00 1A BNE loc_80503314
- 173 libjuan.so:80503260 5B DF 8D E2 ADD SP, SP, #0x16C
- 174 libjuan.so:80503264 F0 8F BD E8 LDMFD SP!, {R4-R11,PC}
- 175 libjuan.so:80503268 ;
- 176
- 177 ---------------------------------------------------------------------------
- 178 libjuan.so:80503268
- 179 libjuan.so:80503268 loc_80503268 ; CODE XREF:
- 180
- 181 libjuan.so:__gnu_arm_flush+364j
- 182 libjuan.so:80503268 05 00 A0 E1 MOV R0, R5
- 183 libjuan.so:8050326C 0C 10 85 E0 ADD R1, R5, R12
- 184 libjuan.so:80503270 69 FE FF EB BL sub_80502C1C
- 185 libjuan.so:80503274 06 00 A0 E1 MOV R0, R6
- 186 libjuan.so:80503278 96 FD FF EB BL unk_805028D8
- 187 libjuan.so:8050327C 01 60 A0 E3 MOV R6, #1
- 188 libjuan.so:80503280
- 189 libjuan.so:80503280 loc_80503280 ; CODE XREF:
- 190
- 191 libjuan.so:__gnu_arm_flush+208j
- 192 libjuan.so:80503280 05 00 A0 E3 MOV R0, #5
- 193 libjuan.so:80503284 A1 11 00 EB BL AnitDbg_0 ; 反调试,查看是否有
- 194 libjuan.so:80503284 ; gdb strace ltrace
- 195
- 196 android_server程序
- 197 libjuan.so:80503288 04 C0 9D E5 LDR R12, [SP,#4]
- 198 libjuan.so:8050328C 00 00 94 E5 LDR R0, [R4]
- 199 libjuan.so:80503290 38 10 8D E2 ADD R1, SP, #0x38
- 200 libjuan.so:80503294 00 00 8C E0 ADD R0, R12, R0
- 201 libjuan.so:80503298 94 FD FF EB BL strstr
- 202 libjuan.so:8050329C 00 00 50 E3 CMP R0, #0
- 203 libjuan.so:805032A0 05 00 00 0A BEQ loc_805032BC
- 204 libjuan.so:805032A4 00 30 97 E5 LDR R3, [R7]
- 205 libjuan.so:805032A8 0C 00 84 E2 ADD R0, R4, #0xC
- 206 libjuan.so:805032AC 07 00 90 E8 LDMIA R0, {R0-R2}
- 207 libjuan.so:805032B0 03 10 81 E0 ADD R1, R1, R3
- 208 libjuan.so:805032B4 03 30 80 E0 ADD R3, R0, R3
- 209 libjuan.so:805032B8 0E 00 87 E9 STMIB R7, {R1-R3}
- 210 libjuan.so:805032BC
- 211 libjuan.so:805032BC loc_805032BC ; CODE XREF:
- 212
- 213 libjuan.so:__gnu_arm_flush+324j
- 214 libjuan.so:805032BC B0 33 D9 E1 LDRH R3, [R9,#0x30]
- 215 libjuan.so:805032C0 01 80 88 E2 ADD R8, R8, #1
- 216 libjuan.so:805032C4 28 40 84 E2 ADD R4, R4, #0x28
- 217 libjuan.so:805032C8 08 00 53 E1 CMP R3, R8
- 218 libjuan.so:805032CC A6 FF FF CA BGT loc_8050316C
- 219 libjuan.so:805032D0 DC FF FF EA B loc_80503248
- 220 libjuan.so:805032D4 ;
- 221
- 222 ---------------------------------------------------------------------------
- 223 libjuan.so:805032D4
- 224 libjuan.so:805032D4 loc_805032D4 ; CODE XREF:
- 225
- 226 libjuan.so:__gnu_arm_flush+2B4j
- 227 libjuan.so:805032D4 10 30 9D E5 LDR R3, [SP,#0x10]
- 228 libjuan.so:805032D8 08 C0 9D E5 LDR R12, [SP,#8]
- 229 libjuan.so:805032DC 03 00 5C E1 CMP R12, R3
- 230 libjuan.so:805032E0 E0 FF FF 0A BEQ loc_80503268
- 231 libjuan.so:805032E4 48 30 9F E5 LDR R3, =0xFFFFFF60
- 232 libjuan.so:805032E8 BF 2E A0 E3 MOV R2, #0xBF0
- 233 libjuan.so:805032EC 00 60 A0 E1 MOV R6, R0
- 234 libjuan.so:805032F0 03 30 9B E7 LDR R3, [R11,R3]
- 235 libjuan.so:805032F4 00 20 83 E5 STR R2, [R3]
- 236 libjuan.so:805032F8 D2 FF FF EA B loc_80503248
- 237 libjuan.so:805032FC ;
- 238
- 239 ---------------------------------------------------------------------------
- 240 libjuan.so:805032FC
- 241 libjuan.so:805032FC loc_805032FC ; CODE XREF:
- 242
- 243 libjuan.so:__gnu_arm_flush+234j
- 244 libjuan.so:805032FC 30 20 9F E5 LDR R2, =0xFFFFFF60
- 245 libjuan.so:80503300 BE 3E A0 E3+MOV R3, #0xBEF
- 246 libjuan.so:80503308 02 20 9B E7 LDR R2, [R11,R2]

12.解压缩后再次dump出来保存为lfx1.Dump与原始的so比较,发现只有前4字节不一样了,如下图所示:
13.将第二次dump出来的lfx1.Dump文件的头4字节.lfx改成.ELF就成了,脱壳完毕。
14.总结: INIT_ARRAY--->解密第二层壳(JNI_OnLoad)---->解密原始so文件--->解压缩原始so的代码节。
说明:虽然作者大牛,脱壳的360 so加固是2015年年初的版本,但是作者脱壳so加固的思路还是值得好好学习的,尽管后面的so加固的反调试的方法和一些思路在变,但是手动研究so加固的脱壳思路还是在原来的基础上进行发现和研究的。谢谢作者大牛的分享。
转载链接:http://www.cnblogs.com/2014asm/p/4456438.html
360加固保so动态脱壳的更多相关文章
- 360加固保的dex脱壳方法
完全测试了看雪论坛的方法,发现并没有脱壳,依然无法反编译 http://bbs.pediy.com/thread-213377.htm 使用上面方法的结果是会得到16个dex文件,只有一个是与程序相关 ...
- 360加固apk并自动签名
我们知道Android加混淆之后,代码的安全性得到了提高,即使你hook,反编译得到的也是乱码的,对于阅读性造成了影响,为了增强代码的破解难度,我们通常退对apk进行加固,常见的有腾讯,360,爱加密 ...
- 【最新】Android使用jenkins全自动构建打包-Windows版本(Android,Jenkins,360加固,Email,QRcode,参数构建,蒲公英)
Android打包喝咖啡系列(Windows版) 这篇博客主要讲述的内容: 1.windows上部署Jenkins https://jenkins.io 2.基于SVN或Git https://git ...
- 柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布
柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布 由于JAVA和Android的平台型,所以APP很容易被反编译,这对于我们开发者来说,是一个不想要 ...
- 360 so动态脱壳
环境及工具 手机 : 中兴 U887 系统版本: Android 2.3.5 工具 : IDA pro 6.6 .0101Editor 版权声明:未经许可,随便转载 目前so加壳有 ...
- app反编译遇到360加固,傻瓜式脱壳
转载https://blog.kieng.cn/2051.html 第一步 电脑安装安卓模拟器,我使用的是雷电模拟器(推荐). 第二步 打开模拟器,准备安装软件: 1.需要脱壳的软件 2.XP 框架. ...
- android加固系列—6.仿爱加密等第三方加固平台之动态加载dex防止apk被反编译
[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5402599.html ] 此方案的目的是隐藏源码防止直接性的反编译查看源码,原理是加密编译好的 ...
- android系统360浏览器使用append动态添加元素出现黑色错乱背景
去掉样式 backface-visibility:hidden;
- walle多渠道打包+Tinker(bugly)热更新集成+360加固(乐固)
这三个东东是干啥的相信大家都有所耳闻了,如果你没有听说过,请出门左拐,百度一下你就知道.这里不对这三个东东具体的集成方式做详细的介绍,因为官方文档已经写的很详细了,主要是对同时使用这三个东东时所需要注 ...
随机推荐
- HDOJ-1069(动态规划+排序+嵌套矩形问题)
Monkey and Banana HDOJ-1069 这里实际是嵌套矩形问题的变式,也就是求不固定起点的最长路径 动态转移方程为:dp[i]=max(dp[j]+block[i].h|(i,j)∈m ...
- golang-Zap和Go Logger日志库
目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...
- 盘点Excel中的那些有趣的“bug”
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Excel 1.0早在1985年正式进入市场,距今已经有36年了,虽然在推出 ...
- docker nacos 集群部署
1.准备机器3台 192.168.101.14 192.168.101.15 192.168.101.16 2.初始化sql(如果我们要搭建集群的话,那么肯定是不能用内嵌的数据库,不然数据无法共享.集 ...
- Android+Chrome 真机调试H5页面实践
前言 使用weinre在真机上调试H5页面,有一个突出的缺点,就是无法调试真机上的样式,真机上页面动态创建的dom在weinre的Elements面板显示不出来,所以调试真机上的页面样式也就无从谈起. ...
- 漏洞复现-CVE-2017-12629-RCE-solr:XXE
0x00 实验环境 攻击机:Win 10.Win Server 2012 R2 靶机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apac ...
- Protobuf在Cmake中的正确使用
Protobuf是google开发的一个序列化和反序列化的协议库,我们可以自己设计传递数据的格式,通过.proto文件定义我们的要传递的数据格式.例如,在深度学习中常用的ONNX交换模型就是使用.pr ...
- 关于搬运CSDN上学生信息管理系统的阅读与二次开发
关于本篇博客内容,我大概分成了三个部分进行讲述:对于源代码的解读.二次重开发后程序的介绍和自己在做完对他人代码的解读和重开发后自己的一些感想. 一. 源代码的解读 在本部分的解读中主要分为三部分:该 ...
- key解析
密钥在不同实体之间传递,因此密钥必须可以序列化. 所有密钥三个特性: 算法:密钥使用的算法,如DES和DSA等,通过getAlgorithm()获取算法名 编码形式:密钥的外部编码形式,如X.509, ...
- 2、MyBatis教程之第一个MyBatis程序
3.MyBatis第一个程序 1.搭建实验数据库 CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREA ...