简略分析某外挂外壳

杰里AC7916A蓝牙音箱硬件设计实战:电源、音频、射频与低功耗避坑指南 蓝牙音频SoC通过集成MCU、射频收发器、音频DAC和电源管理单元,实现高集成度与低功耗的音频处理。其原理在于将数字音频解码与模拟功放驱动整合于单芯片,降低BOM成本与PCB面积。技术价值体现在便携设备的长续航与稳定连接,广泛应用于便携音箱、桌面音箱和儿童故事机等场景。在杰里AC7916A方案中,电源架构、音频链路、射频布局与低功耗策略的细节设计直接决定产品成败,需结合实际调试经验补全官方datasheet的简略之处。 阅读详情
简略分析某外挂外壳
【目    标】:英雄王座 v0.001.014
【工    具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任    务】:脱马甲
【操作平台】:Windows Xp sp2
【作    者】:loveboom[DFCG][FCG][US]
【简要说明】:这里一个比较奇怪的外壳,在外面看不到关于这个壳的任何说明,壳通过一个DLL对原程序进行解压,解压完毕执行原程序,是一个比较有新意的加壳方式。
【详细过程】:
OD没什么特别的设置,打开所有异常项就行了。
先直接用Lordpe 看看这个壳的一点信息:

比较有意思,程序只用一个DLL来解压并运行程序,
因为壳是通过DLL解压后,再运行,所以我们不能直接让OD停在OEP处,因为OD一般是在程序的oep处下个cc断,这样才会中断在程序入口处。改一下OD的设置:
让OD中断在系统DLL中。
这样就可以加载程序了,因为壳后面会改IAT到壳里,所以我们先要在程序里新增一个段。我的做法是用winhex新键一个大小为35KB(这个因IAT大小而定)的空白文件,然后用LORDPE载入程序文件并新增一个段,选择从磁盘载入段就行了。
最下面那个段就是我新加的.
现在再次用OD载入目标程序,现在中断在系统中:
7C921231    C3              RETN                                     ; 中断在系统dll中
7C921232    8BFF            MOV EDI,EDI
断下后在程序的CODE段下F2断点:
然后按F9运行程序,运行后,程序中断在ShellDll.dll中,也就是DLL解码程序文件处:
100025A2    8BCE            MOV ECX,ESI                              ; 如果没有解压完跳到这里继续
100025A4    6A 01           PUSH 1
100025A6    8B11            MOV EDX,DWORD PTR DS:[ECX]               ; 中断在这里
100025A8    895424 18       MOV DWORD PTR SS:[ESP+18],EDX            ; 这里的代码对原程序进行解码.
100025AC    8B41 04         MOV EAX,DWORD PTR DS:[ECX+4]
100025AF    894424 1C       MOV DWORD PTR SS:[ESP+1C],EAX
100025B3    8B51 08         MOV EDX,DWORD PTR DS:[ECX+8]
100025B6    895424 20       MOV DWORD PTR SS:[ESP+20],EDX
100025BA    8D5424 18       LEA EDX,DWORD PTR SS:[ESP+18]
100025BE    8B41 0C         MOV EAX,DWORD PTR DS:[ECX+C]
100025C1    8D4C24 28       LEA ECX,DWORD PTR SS:[ESP+28]
100025C5    51              PUSH ECX
100025C6    55              PUSH EBP
100025C7    52              PUSH EDX
100025C8    8D4C24 20       LEA ECX,DWORD PTR SS:[ESP+20]
100025CC    894424 30       MOV DWORD PTR SS:[ESP+30],EAX
100025D0    E8 5BEBFFFF     CALL 10001130
100025D5    8B4C24 24       MOV ECX,DWORD PTR SS:[ESP+24]
100025D9    8B5424 28       MOV EDX,DWORD PTR SS:[ESP+28]
100025DD    8BC6            MOV EAX,ESI
100025DF    83C6 10         ADD ESI,10
100025E2    4B              DEC EBX
100025E3    8908            MOV DWORD PTR DS:[EAX],ECX
100025E5    8B4C24 2C       MOV ECX,DWORD PTR SS:[ESP+2C]
100025E9    8950 04         MOV DWORD PTR DS:[EAX+4],EDX
100025EC    8B5424 30       MOV EDX,DWORD PTR SS:[ESP+30]
100025F0    8948 08         MOV DWORD PTR DS:[EAX+8],ECX
100025F3    8950 0C         MOV DWORD PTR DS:[EAX+C],EDX
100025F6  ^ 75 AA           JNZ SHORT 100025A2                       ; 没解压完跳回去
100025F8    5D              POP EBP
100025F9    5B              POP EBX
100025FA    8D4C24 08       LEA ECX,DWORD PTR SS:[ESP+8]
100025FE    C74424 34 FFFFF>MOV DWORD PTR SS:[ESP+34],-1
10002606    C1E7 04         SHL EDI,4
10002609    E8 22EAFFFF     CALL 10001030
1000260E    8B4C24 2C       MOV ECX,DWORD PTR SS:[ESP+2C]
10002612    8BC7            MOV EAX,EDI
10002614    5F              POP EDI
10002615    5E              POP ESI
10002616    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
1000261D    83C4 30         ADD ESP,30
10002620    C2 1000         RETN 10                                  ; 我们可以直接在这里按F4,执行到这里
断下后,直接F4执行到10002620处,注意因为OD在程序OEP处下了cc,这里解码后的OEP部分代码错误,所以我们要在这时改一个OEP代码,然后再改回去就行了。操作完毕后再一次CODE段断点,这样就到了IAT处理块,我们来分析一下IAT的处理:
1000236B    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
1000236F    C606 E9         MOV BYTE PTR DS:[ESI],0E9                ; 再一次下段后中断在这里,这里填入远程跳,让IAT的部分去壳里
10002372    2BC6            SUB EAX,ESI                              ; 计算跳转的距离
10002374    83C0 FB         ADD EAX,-5
10002377    8946 01         MOV DWORD PTR DS:[ESI+1],EAX             ; 填入跳去远程地址
1000237A    8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]            ; 取要保存输入表的地址
1000237E    8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]            ; 取出跳去IAT的代码,用于然后比较,跳去API一般是 ff25,ff15之类的等
10002382    3D 2D8B0000     CMP EAX,8B2D                             ; 比较是不是mov ebp,ds:[xxxxxxxx]的样式
10002387    893A            MOV DWORD PTR DS:[EDX],EDI               ; 把IAT填入壳里面
10002389    0F8F 9C000000   JG 1000242B                              ; 如果大于8b2d就跳
1000238F    0F84 86000000   JE 1000241B                              ; 如果等于就跳去8b2d情况的处理
10002395    3D 158B0000     CMP EAX,8B15                             ; 这里比较是不是 MOV EDX, DS:[XXXXXXXX]的样式
1000239A    7F 68           JG SHORT 10002404                        ; 如果大于就跳
1000239C    74 38           JE SHORT 100023D6                        ; 等于就跳去处理8b15的情况
1000239E    3D A1000000     CMP EAX,0A1                              ; 比较是不是 MOV EAX,DS:[xxxxxxxx]的情况
100023A3    74 1B           JE SHORT 100023C0                        ; 如果是则跳去处理
100023A5    3D 0D8B0000     CMP EAX,8B0D                             ; 判断是否为MOV ECX,DS:[xxxxxxxx]
100023AA    0F85 D9000000   JNZ 10002489                             ; 如果不是则跳
100023B0    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理MOV ECX,DS:[xxxxxxxx]的情况
100023B4    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
100023B7    C601 8B         MOV BYTE PTR DS:[ECX],8B
100023BA    C641 01 0D      MOV BYTE PTR DS:[ECX+1],0D
100023BE    EB 24           JMP SHORT 100023E4
100023C0    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理MOV EAX,DS:[xxxxxxxx]的情况
100023C4    8D46 05         LEA EAX,DWORD PTR DS:[ESI+5]
100023C7    C601 A1         MOV BYTE PTR DS:[ECX],0A1
100023CA    8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]
100023CE    8951 01         MOV DWORD PTR DS:[ECX+1],EDX
100023D1    83C1 05         ADD ECX,5                                ; 因为MOV EAX,DS:[xxxxxxxx]机器码只有五位,所以处理有一点不同
100023D4    EB 18           JMP SHORT 100023EE
100023D6    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理MOV EDX, DS:[XXXXXXXX]的情况
100023DA    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
100023DD    C601 8B         MOV BYTE PTR DS:[ECX],8B
100023E0    C641 01 15      MOV BYTE PTR DS:[ECX+1],15
100023E4    8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]            ; 处理完那个跳之里类的,就写出DS:[xxxxxxxx]中的地址,地址就是eip的前一句的地址
100023E8    8951 02         MOV DWORD PTR DS:[ECX+2],EDX
100023EB    83C1 06         ADD ECX,6
100023EE    2BC1            SUB EAX,ECX                              ; 计算距离
100023F0    C601 E9         MOV BYTE PTR DS:[ECX],0E9                ; 在壳里增加完跳去API的代码后,填入要jmp返回程序的代码
100023F3    83E8 05         SUB EAX,5
100023F6    5F              POP EDI
100023F7    8941 01         MOV DWORD PTR DS:[ECX+1],EAX             ; 填入返回地址
100023FA    5E              POP ESI
100023FB    33C0            XOR EAX,EAX
100023FD    5B              POP EBX
100023FE    83C4 10         ADD ESP,10
10002401    C2 0C00         RETN 0C
10002404    3D 1D8B0000     CMP EAX,8B1D                             ; 判断是否为MOV EBX,DS:[xxxxxxxx]
10002409    75 7E           JNZ SHORT 10002489                       ; 如果不是则跳
1000240B    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理MOV EBX,DS:[xxxxxxxx]的情况
1000240F    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
10002412    C601 8B         MOV BYTE PTR DS:[ECX],8B
10002415    C641 01 1D      MOV BYTE PTR DS:[ECX+1],1D
10002419  ^ EB C9           JMP SHORT 100023E4
1000241B    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理mov ebp,ds:[xxxxxxxx]的情况
1000241F    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
10002422    C601 8B         MOV BYTE PTR DS:[ECX],8B
10002425    C641 01 2D      MOV BYTE PTR DS:[ECX+1],2D
10002429  ^ EB B9           JMP SHORT 100023E4
1000242B    3D 15FF0000     CMP EAX,0FF15                            ; 判断是否为CALL DS:[xxxxxxxx]
10002430    7F 3D           JG SHORT 1000246F                        ; 如果大于则跳
10002432    74 2C           JE SHORT 10002460                        ; 等于就跳去处理CALL DS:[xxxxxxxx]
10002434    2D 358B0000     SUB EAX,8B35                             ; 这里处理否为MOV ESI,DS:[xxxxxxxx]
10002439    74 15           JE SHORT 10002450                        ; 相等则跳
1000243B    83E8 08         SUB EAX,8                                ; 这里用另一种方式判断是否为MOV EDI,DS:[xxxxxxxx]
1000243E    75 49           JNZ SHORT 10002489                       ; 如果不是则跳
10002440    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理MOV EDI,DS:[xxxxxxxx]的情况
10002444    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
10002447    C601 8B         MOV BYTE PTR DS:[ECX],8B
1000244A    C641 01 3D      MOV BYTE PTR DS:[ECX+1],3D
1000244E  ^ EB 94           JMP SHORT 100023E4
10002450    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理MOV ESI,DS:[xxxxxxxx]的情况
10002454    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
10002457    C601 8B         MOV BYTE PTR DS:[ECX],8B
1000245A    C641 01 35      MOV BYTE PTR DS:[ECX+1],35
1000245E  ^ EB 84           JMP SHORT 100023E4
10002460    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理CALL DS:[xxxxxxxx]的情况
10002464    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
10002467    C601 FF         MOV BYTE PTR DS:[ECX],0FF
1000246A  ^ E9 71FFFFFF     JMP 100023E0
1000246F    3D 25FF0000     CMP EAX,0FF25                            ; 判断是否为JMP DS:[xxxxxxxx]
10002474    75 13           JNZ SHORT 10002489                       ; 如果不是则跳
10002476    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]            ; 处理JMP DS:[XXXXXXXX]的情况
1000247A    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
1000247D    C601 FF         MOV BYTE PTR DS:[ECX],0FF
10002480    C641 01 25      MOV BYTE PTR DS:[ECX+1],25
10002484  ^ E9 5BFFFFFF     JMP 100023E4
10002489    5F              POP EDI
1000248A    C743 04 1527000>MOV DWORD PTR DS:[EBX+4],2715
10002491    5E              POP ESI
10002492    83C8 FF         OR EAX,FFFFFFFF
10002495    5B              POP EBX
10002496    83C4 10         ADD ESP,10
10002499    C2 0C00         RETN 0C
看完后总结一下,先把JMP API的代码跳到壳里去,IAT的处理除了mov eax,ds:[xxxxxxxx]有点不同之外,其它的都是先填入EAX的值(也就是jmp mov ebp之类的),然后写入要跳的地址,地址就是当前EIP的前一句的地址也就是eip-4,处理完就填入要返回的地址。
分析完毕我们写上自己的代码;
1000237A   /E9 025E0000     JMP 10008181
1000237F   |90              NOP
10002380   |90              NOP
10002381   |90              NOP
10002382   |3D 2D8B0000     CMP EAX,8B2D
10002387   |893A            MOV DWORD PTR DS:[EDX],EDI
10002389   |0F8F 9C000000   JG 1000242B
1000238F   |0F84 86000000   JE 1000241B
10002395   |3D 158B0000     CMP EAX,8B15
1000239A   |7F 68           JG SHORT 10002404
1000239C   |74 38           JE SHORT 100023D6
1000239E   |3D A1000000     CMP EAX,0A1
100023A3   |74 1B           JE SHORT 100023C0
100023A5   |3D 0D8B0000     CMP EAX,8B0D
100023AA   |0F85 D9000000   JNZ 10002489
100023B0   |E9 5C5D0000     JMP 10008111
100023B5   |90              NOP
100023B6   |90              NOP
100023B7   |C601 8B         MOV BYTE PTR DS:[ECX],8B
100023BA   |C641 01 0D      MOV BYTE PTR DS:[ECX+1],0D
100023BE   |EB 24           JMP SHORT 100023E4
100023C0   |E9 4C5D0000     JMP 10008111
100023C5   |90              NOP
100023C6   |90              NOP
100023C7   |C601 A1         MOV BYTE PTR DS:[ECX],0A1
100023CA   |8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]
100023CE   |8951 01         MOV DWORD PTR DS:[ECX+1],EDX
100023D1   |83C1 05         ADD ECX,5
100023D4   |EB 18           JMP SHORT 100023EE
100023D6   |E9 365D0000     JMP 10008111
100023DB   |90              NOP
100023DC   |90              NOP
100023DD   |C601 8B         MOV BYTE PTR DS:[ECX],8B
100023E0   |C641 01 15      MOV BYTE PTR DS:[ECX+1],15
100023E4   |8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]
100023E8   |8951 02         MOV DWORD PTR DS:[ECX+2],EDX
100023EB   |83C1 06         ADD ECX,6
100023EE   |2BC1            SUB EAX,ECX
100023F0   |C601 00         MOV BYTE PTR DS:[ECX],0
100023F3   |33C0            XOR EAX,EAX
100023F5   |90              NOP
100023F6   |5F              POP EDI
100023F7   |8941 01         MOV DWORD PTR DS:[ECX+1],EAX
100023FA   |5E              POP ESI
100023FB   |33C0            XOR EAX,EAX
100023FD   |5B              POP EBX
100023FE   |83C4 10         ADD ESP,10
10002401   |C2 0C00         RETN 0C
10002404   |3D 1D8B0000     CMP EAX,8B1D
10002409   |75 7E           JNZ SHORT 10002489
1000240B   |E9 015D0000     JMP 10008111
10002410   |90              NOP
10002411   |90              NOP
10002412   |90              NOP
10002413   |90              NOP
10002414   |90              NOP
10002415   |90              NOP
10002416   |90              NOP
10002417   |90              NOP
10002418   |90              NOP
10002419   |90              NOP
1000241A   |90              NOP
1000241B   |E9 F15C0000     JMP 10008111
10002420   |90              NOP
10002421   |90              NOP
10002422   |90              NOP
10002423   |90              NOP
10002424   |90              NOP
10002425   |90              NOP
10002426   |90              NOP
10002427   |90              NOP
10002428   |90              NOP
10002429   |90              NOP
1000242A   |90              NOP
1000242B   |3D 15FF0000     CMP EAX,0FF15
10002430   |7F 3D           JG SHORT 1000246F
10002432   |74 2C           JE SHORT 10002460
10002434   |2D 358B0000     SUB EAX,8B35
10002439   |74 15           JE SHORT 10002450
1000243B   |83E8 08         SUB EAX,8
1000243E   |75 49           JNZ SHORT 10002489
10002440   |B8 3D8B0000     MOV EAX,8B3D
10002445   |E9 C75C0000     JMP 10008111
1000244A   |90              NOP
1000244B   |90              NOP
1000244C   |90              NOP
1000244D   |90              NOP
1000244E   |90              NOP
1000244F   |90              NOP
10002450   |B8 358B0000     MOV EAX,8B35
10002455   |E9 B75C0000     JMP 10008111
1000245A   |90              NOP
1000245B   |90              NOP
1000245C   |90              NOP
1000245D   |90              NOP
1000245E   |90              NOP
1000245F   |90              NOP
10002460   |E9 AC5C0000     JMP 10008111
10002465   |90              NOP
10002466   |90              NOP
10002467   |90              NOP
10002468   |90              NOP
10002469   |90              NOP
1000246A   |90              NOP
1000246B   |90              NOP
1000246C   |90              NOP
1000246D   |90              NOP
1000246E   |90              NOP
1000246F   |3D 25FF0000     CMP EAX,0FF25
10002474   |75 13           JNZ SHORT 10002489
10002476   |E9 965C0000     JMP 10008111
1000247B   |90              NOP
1000247C   |90              NOP
1000247D   |90              NOP
1000247E   |90              NOP
1000247F   |90              NOP
10002480   |90              NOP
10002481   |90              NOP
10002482   |90              NOP
10002483   |90              NOP
10002484   |90              NOP
10002485   |90              NOP
10002486   |90              NOP
10002487   |90              NOP
10002488   |90              NOP
10002489   |5F              POP EDI
1000248A   |C743 04 1527000>MOV DWORD PTR DS:[EBX+4],2715
10002491   |5E              POP ESI
10002492   |83C8 FF         OR EAX,FFFFFFFF
10002495   |5B              POP EBX
10002496   |83C4 10         ADD ESP,10
10002499   |C2 0C00         RETN 0C
然后在空地上再写一段:
10008111    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
10008115    51              PUSH ECX
10008116    8BCE            MOV ECX,ESI                              ; 填入代码到程序中
10008118    3C A1           CMP AL,0A1
1000811A    74 34           JE SHORT 10008150                        ; 对eax=a1的情况进行处理
1000811C    90              NOP
1000811D    9C              PUSHFD
1000811E    66:8BD0         MOV DX,AX
10008121    66:C1E0 08      SHL AX,8
10008125    8AC6            MOV AL,DH
10008127    9D              POPFD
10008128    66:8901         MOV WORD PTR DS:[ECX],AX                 ; 写入EAX的值
1000812B    8D46 06         LEA EAX,DWORD PTR DS:[ESI+6]
1000812E    8B5424 18       MOV EDX,DWORD PTR SS:[ESP+18]            ; 因为前面ECX入栈了,所以这里是esp+18
10008132    90              NOP
10008133    90              NOP
10008134    90              NOP
10008135    90              NOP
10008136    90              NOP
10008137    90              NOP
10008138    8951 02         MOV DWORD PTR DS:[ECX+2],EDX             ; 填入DS:[XXXXXXXX]中的值
1000813B    59              POP ECX
1000813C    66:C701 0000    MOV WORD PTR DS:[ECX],0                  ; 把原来填入代码给清空掉
10008141    C741 02 0000000>MOV DWORD PTR DS:[ECX+2],0
10008148  ^ E9 9EA2FFFF     JMP 100023EB                             ; 处理完跳回去
1000814D    90              NOP
1000814E    90              NOP
1000814F    90              NOP
10008150    8801            MOV BYTE PTR DS:[ECX],AL                 ; 对0A1进行处理
10008152    8D46 05         LEA EAX,DWORD PTR DS:[ESI+5]
10008155    8B5424 18       MOV EDX,DWORD PTR SS:[ESP+18]
10008159    8951 01         MOV DWORD PTR DS:[ECX+1],EDX
1000815C    59              POP ECX
1000815D    C601 00         MOV BYTE PTR DS:[ECX],0
10008160    90              NOP
10008161    90              NOP
10008162    C741 01 0000000>MOV DWORD PTR DS:[ECX+1],0
10008169    83E9 01         SUB ECX,1
1000816C  ^ E9 7AA2FFFF     JMP 100023EB                             ; 处理完毕跳回去
10008171    90              NOP
10008172    90              NOP
10008173    90              NOP
10008174    90              NOP
10008175    90              NOP
10008176    90              NOP
10008177    90              NOP
10008178    90              NOP
10008179    90              NOP
1000817A    90              NOP
1000817B    90              NOP
1000817C    90              NOP
1000817D    90              NOP
1000817E    90              NOP
1000817F    90              NOP
10008180    90              NOP
10008181    8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]            ; 这里把IAT部分放到程序里
10008185    81EA 40435F00   SUB EDX,5F4340                           ; 这里就是把壳的IAT地址放到我们前面新加的段里,注意,这里的值,可能每次载入后有所不同
1000818B    90              NOP                                      ; 第二次我们要手工处理一下,每二次正常过的话这里是5c4010,我们改成5C4004,并在这里下断
1000818C    90              NOP                                      ; 后面的我就用脚本来处理
1000818D    90              NOP
1000818E    895424 14       MOV DWORD PTR SS:[ESP+14],EDX
10008192    90              NOP
10008193    90              NOP
10008194    90              NOP
10008195    90              NOP
10008196    90              NOP
10008197    8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]
1000819B  ^ E9 E2A1FFFF     JMP 10002382
100081A0    90              NOP
向下可以找到处理完IAT的跳:
在上面也下个断,然后写脚本:
var value
var edivalue
var sedi
 
mov value,c
 
mov edivalue,edi
and edivalue,ff000000
mov sedi,edivalue
 
run
 
lbl1:
   eoe lbl2
   cmp eip,100021E7                             //判断有没有处理完IAT
   je lbl2
   mov edivalue,edi                                 //这里粗略的处理分界线
   and edivalue,ff000000
   cmp edivalue,sedi
   jne lbl3                                      //如果地址的前两位不同就认为是不同
   add value,c                                         
 
lblsub:
   sub edx,value
   cmp edx,5C479C                                //这里对上面的粗略后留下的部分处理完
   je lbl4
   cmp edx,5C4B0C                               //找到的地址+8
   je lbl4
   cmp edx,5c4c40                                  //找到的地址+8
   je lbl4
 
lblsub1:
   run
   jmp lbl1
 
lbl2:
   ret
 
 
lbl3:
   mov sedi,edivalue                               //发现有所不同就设定一个分界线
   add value,8
   jmp lblsub
 
lbl4:
   add edx,4                                            //这里也用于设定分界线
   sub value,4
   jmp lblsub1
写完运行一下脚本,这样就可以得到很完整的程序,然后DUMP和FIXDUMP一下程序就可以运行了。
好了,脱壳完毕!
注意一下:程序最好不要在xp 下脱,因为那样,脱了后的文件在其它平台上可能会有问题.
第二,这个壳处理IAT不是很好,所以当获取IAT失败里也不会有什么提示,这一点要我们自己去注意.
抓一下成功的IAT来看看:
Greetz:
 Fly.Jingulong,yock,tDasm.David.ahao.UFO(brother).alan(sister).all of my friends and you!
 
By loveboom[DFCG][FCG]
Email:bmd2chen@tom.com
 
使用LordPE和Import REC脱壳 本博客用到的资源链接放在博客末尾。 LordPE是一款能够抓取内存映像的用来脱壳的软件,它能够把一个进程的内存数据给Dump下来,然后保存为文件。 光了解一个软件的用处用起来如果出问题还是会比较头疼,所以这里简单说一下LordPE软件的原理。 该软件其实也是调用了系统的API。它首先调用CreateToolhelp32Snapshot函数来获取一个系统中的进程的快照。然后再用Module32... 阅读详情

相关推荐

英雄王座源码

有需要英雄王座二次开发的朋友联系本人

外挂、破解软件理论与实战

外挂、破解软件理论与实战

weixin_45565886的博客 9948

WIM文件挂载工具 WINPE必备

WIM文件挂载工具 WIM文件挂载工具

外挂、pe、elf二进制逆向连载篇

外挂、pe、elf二进制逆向连载篇

qq_41671415的博客 1096

【英雄王座】大型多人网络游戏+服务端win7系统专用+客户端+GM工具+全套无毒

服务端要解压到 D:\ 1.打开 一:WIN7注册表.reg 2.打开 二:数据源.reg 3.三:RegServer.bat OK!第一次 玩就要注册上面的3个注册表 第二次玩就不用启动了! 正式开始架设! A:启动数据库.exe B:开启服务端.bat 等2分钟 我是WIN7 内存3-4G 应该可以玩吧! OK!打开客户端 开始游戏.bat 进游戏吧! 新建立的任务 摁 R 键人物才会跑 账号 123456 123456 dong 123456 admin 123456

[3D检测系列-PV-RCNN] PV-RCNN实战指南:从论文解析到代码调试全流程

本文提供了PV-RCNN在3D目标检测领域的实战全流程指南。文章深入解析了其Point-Voxel融合的核心思想,并详细演示了从环境搭建、数据准备、代码复现到模型训练与调试的具体步骤,特别针对常见的报错问题给出了解决方案,帮助开发者高效掌握这一经典算法。

weixin_29189381的博客 480

【转】脱壳工具

脱壳工具http://www.pediy.com/tools/unpacker.htm 文件类型侦测工具 peid 0.94

学习........ 4392

基于Apache SeaTunnel构建CDC数据同步管道

Apache SeaTunnel是一个数据集成开发平台,其发展经历了几个重要阶段:ETL时代(90年代):面向结构化数据库的数据同步,用于构建数据仓库。MPP和分布式技术流行:使用技术如Hive进行数据仓库的构建。此阶段主要使用mapreduce程序进行数据搬运和转换。数据湖技术流行:重视数据集成,强调先同步数据至数据湖仓储,再进行业务面向的转换和设计。CDC,即变更数据捕获,是一种捕获数据库变更事件(如插入、更新、删除)的技术。

weixin_54625990的博客 2172

claude code源码万字深入分析

临时把当前整段对话重新总结一遍。

2301_78856868的博客 759

SUMO从入门到精通:手把手教你用开源工具完成智能网联车仿真(附Python接口教程)

本文提供了一份SUMO开源交通仿真工具的完整实战指南,从环境搭建、基础仿真到Python接口TraCI的深度应用。重点讲解了如何利用SUMO的高度可定制性进行智能网联车仿真,包括实现动态信号优先等核心算法,并介绍了与网络仿真器集成以构建高保真车联网通信环境的方法。

weixin_28327051的博客 541

论文记录:Affine Formation Maneuver Control of Multiagent Systems

多智能体编队控制仿真记录 实现功能:平移/旋转/尺寸缩放/shear,见截图 注意:本仿真图只是起到了演示效果,中间过程速度产生突变,实际中是不允许的。需要进行速度规划,这一点论文中仿真图更为贴合实际。 参考论文:Zhao, S. (2018). Affine Formation Maneuver Control of Multiagent Systems. IEEE Transactions on Automatic Control, 63(12), 4140–4155. 突然发现有个博主写得很好,参考:

W1H1J1的博客 2108

从datasheet看国产触摸调光IC的工程取舍

EC2103-7518作为一颗功能专一的台灯触摸调光IC,在BOM成本、PCB面积、调试工时上相比传统多芯片方案有明显优势,适合LED护眼学习台灯、直播摄影桌面补光灯、化妆镜LED镜前灯、酒店客房床头触摸阅读灯、家用桌面氛围落地小台灯等场景。EC2103-7518作为LED双色温触摸控制芯片,通过CW(白灯,14脚)和WW(暖灯,11脚)两个逻辑输出脚实现四种色温模式循环:白光→暖+白→白+暖→暖光。触摸调光IC的核心是触摸算法。我的实测是:72小时持续点亮测试,触摸响应一致,未出现寄存器漂移导致的失灵。

ELITECHIP1的博客 140

7-1 链式基数排序 (20 分)

7-1 链式基数排序 (20 分) 实现链式基数排序,待排序关键字n满足1≤n≤1000,最大关键字数位≤5。 输入样例: 第一行输入待排序个数n(1≤n≤1000),再输入n个数(n的数位≤5)。 10 278 109 63 930 589 184 505 269 8 83 输出样例: 输出每趟分配-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每行结尾有空格。 930 63 83 184 505 278 8 109 589 269 505 8 109 930 63 26

OwemShu的博客 4240

高通410随身WiFi SP970-V13实测:频段网速与去云控刷机指南

随身WiFi作为移动网络共享设备,其核心在于基带芯片与频段支持。高通410(MSM8916)集成LTE Cat4基带,支持多频段,功耗低且社区资源丰富,成为入门级随身WiFi的热门方案。通过频段锁定与去云控优化,可显著提升网速与稳定性,适用于租房、出差等临时网络场景。本文以SP970-V13为例,分享频段分析、网速实测与刷机去云控的实操经验。

weixin_29171129的博客 321

从GWAS到单细胞:利用seismic包精准定位疾病相关的关键细胞亚群与驱动基因

本文详细介绍了如何利用seismic包将GWAS与单细胞测序数据结合,精准定位疾病相关的核心细胞亚群与驱动基因。通过创新的统计算法和实战案例,帮助研究者从遗传汇总数据中挖掘关键生物学机制,提升疾病研究的精准度和效率。

weixin_29215815的博客 442

044、镜头脏污与异物检测:产线 AOI 检测方案与 ISP 脏污补偿

文章摘要(148字) 本文针对镜头生产中的脏污检测问题,提出产线AOI检测与ISP补偿结合的解决方案。产线端采用明场、暗场、偏振三通道联合检测技术,将油污漏检率从8.3%降至0.2%。ISP端通过RAW域局部梯度分析和频域补偿算法,动态修复产线漏检的微小脏污。作者结合实战案例,详细分析了传统灰度阈值法的局限性,并给出多模态检测的代码实现要点,强调必须建立"产线拦截+终端补偿"的双重防护机制。

sundong_81的博客 230

Pi Agent 本地智能体实战:从安装到自定义 Skills 的完整指南

在AI编程工具日益丰富的今天,智能体(Agent)的本地化部署与可扩展性成为开发者关注的核心。与依赖云端沙箱或封闭IDE插件的方案不同,本地优先的智能体通过常驻后端服务与轻量桌面端结合,让用户同时获得控制权与灵活性。其核心价值在于Skills机制——一种将任意脚本或命令行工具封装为可复用能力的设计哲学,使得智能体不再是黑盒,而是可被用户编排的胶水平台。无论是代码审查、日志分析还是CI流水线中的自动化任务,基于Tool Call的计划-执行-检查循环都保证了每一步的可追溯性。从环境配置中的Python版本兼容

weixin_28223453的博客 126

uniapp - 实现 App 端 “半屏幕“ 连续扫码功能,页面只有半个屏幕是扫码框并且可持续连续扫码获取数据(不使用官方 uni.scanCode API,因为无法连续扫码!)详细示例源码插件教程

uniapp app端实现半屏幕扫码,uniapp 扫一扫半个屏幕,uniapp 扫一扫,uniapp持续扫码实现,uniapp怎么自定义扫码和连续扫码,uni-app App端半屏连续扫码,uniapp 扫一扫半个屏幕,uniapp自定义扫码页面样式,实现连续扫码功能(uniapp),uniapp - 实现 App 端 "半屏幕" 连续扫码功能,页面只有半个屏幕是扫码框并且可持续连续扫码获取数据(不使用官方 uni.scanCode API,因为无法连续扫码!)详细示例源码插件教程。

✅ 精选推荐文章 1万+

RK3568/T527/T536嵌入式芯片选型实战指南

嵌入式SoC选型本质是系统级工程决策,而非单纯比拼CPU主频或NPU算力。理解ARM Cortex-A55架构下不同芯片的内存带宽分配、外设接口物理层设计(如MIPI-CSI独立PHY、PCIe Gen2/Gen3通道能力)及功耗热分布特性,是保障边缘AI设备稳定量产的关键。USB 3.0信号完整性、DDR PHY校准窗口、BootROM加载机制等底层差异,直接决定原理图设计容错性、Linux设备树适配难度与EMC一次通过率。面向工业视觉、智能网关、低功耗传感等典型场景,需结合真实负载(如batch siz

weixin_34280237的博客 351

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RTL8201F百兆以太网硬件设计避坑指南:原理图与PCB实战解析

在嵌入式系统设计中,为MCU扩展以太网接口是常见需求,而PHY芯片作为物理层收发器,决定了链路稳定性与传输性能。理解PHY与MAC之间的MII/RMII接口时序、时钟方向以及网络变压器的信号耦合原理,是硬件工程师进行原理图设计的基础。本文围绕RTL8201F这一典型百兆PHY芯片,从选型对比、供电与时钟设计、MAC接口连线到PCB布局,系统梳理了实际项目中容易忽略的细节。结合LAN8720、DP83848等常见方案的特点,帮助读者快速建立正确的硬件设计思路。更重要的是,通过分享两次打板实测中遇到的晶振不起振

weixin_34032621的博客 475

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

PD受电芯片选型实战:协议、功率与热管理三重博弈

USB PD受电芯片是快充系统的核心枢纽,其本质远超简单协议转换——它集成了实时协议状态机、动态功率调度与精密热管理功能。理解PD协议演进(如PD3.1 EPR、PPS)、PDO协商机制及VDM扩展能力,是保障多设备兼容性的基础;而功率路径设计需统筹VBUS处理、DC-DC效率与PCB热扩散,直接决定实际可承载功率;热与EMI则通过电感选型、HFSS仿真、SW节点布局等物理层手段影响长期可靠性。在华为SuperCharge适配、云快充协同、Type-C数据/充电复用等典型场景中,芯片选型必须兼顾协议灵活性、

weixin_30235225的博客 416

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

超小型32位MCU:从封装到选型的全面解析

在嵌入式系统设计中,MCU(微控制器)是核心组件,其小型化趋势正深刻改变终端产品的形态。随着工艺与封装技术的进步,32位MCU在极小的尺寸内实现了高性能、低功耗与高集成度,使可穿戴设备、智能传感器等场景受益匪浅。这一演进的核心在于平衡封装尺寸、引脚数量、功耗预算与成本,通过QFN、CSP等封装工艺和内部时钟、低功耗外设的优化,实现了系统级的“减法设计”。无论是替代传统8位MCU,还是支撑边缘节点AI推理,超小型32位MCU都展现出巨大的工程价值。本文从封装技术、芯片架构、内核选择到选型实操与供应链风险,系统

weixin_34377919的博客 298

输入输出外挂总结

转载自:http://blog.youkuaiyun.com/f_zyj/article/details/51473493 还有这一篇:http://blog.youkuaiyun.com/yujuan_mao/article/details/8119529 ACM模版 适用于正整数 template class T> inline void scan_d(T &ret) {

riba2534的博客 612

游戏外挂基本原理及实现[转贴]

游戏外挂基本原理及实现[转贴]游戏外挂基本原理及实现游戏外挂已经深深地影响着众多网络游戏玩家,今天在网上看到了一些关于游戏外挂编写的技术,于是转载上供大家参考   1、游戏外挂的原理   外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服务器内存的哦,呵呵。其实修改服务器也是有办法的,只是技术太高一般人没有办法入手而已。(比如请GM去夜总会、送礼、收黑钱

islq's space 8396

AcProtect 1.41 外壳分析

【目 标】: 应作者要求,这里不贴上软件名【工 具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F 【任 务】:分析外壳 【操作平台】:Windows 2003 server 【作 者】: LOVEBOOM[DFCG][FCG][US]【相关链接】: ......【简要说明】: 脱ACPROTECT的壳并不多,以前最多只

loveboom's Reverse Enginering 1万+
上一篇: Alex-protect外壳完全分析
下一篇: asprotect v2.0 stolen code fix
bmd2chen
博客等级 码龄23年 34粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值