欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

pediy06_00535

<span class="pediy"><span class="pediy">

[part 6 ](区段处理)
; =========================================================================================
; 返回到  Ch e c k s u m - C h e c k i n g 之后的位置
; 有个稍微快一点的方法解决注册
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
003B073A    E8 4A2A0000     call    003B3189 ; nop掉然后置eax =1即可
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
003B076C    66:3D 0100      cmp     ax, 1
003B0775   /0F84 E9000000   je      003B0864    ; j,否则Over
003B087B    8D85 D85C4000   lea     eaxdword ptr ss:[ebp+405CD8]
003B08F8    BE E4D34100     mov     esi, 41D3E4
003B0902    03F5            add     esiebp    ; esi -> 块表
; esi:
;-----------------------
003B7B17  00001000    ; VOffset
003B7B1B  00006000    ; RSize
003B7B1F  0000F342    ; VSize
003B7B23  E0000021    ; Flags
003B7B27  00017000   ; 一样....
003B7B2B  00001000
003B7B2F  00000FB8
003B7B33  C0000041
;-----------------------
003B090E    833E 00         cmp     dword ptr ds:[esi], 0    ; 区块解码结束了?
003B0916   /0F84 7E060000   je      003B0F9A                        ; 结束就走人
003B0921    8B9D DCD34100   mov     ebxdword ptr ss:[ebp+41D3DC]   ; ImageBase
003B092C    031E            add     ebxdword ptr ds:[esi]    ; ebx -> 指向一个Section
003B0945    8B4E 04         mov     ecxdword ptr ds:[esi+4]    ; ecx -> Size
003B0952    83F9 00         cmp     ecx, 0
003B0955   /75 4E           jnz     short 003B09A5    ; 长度非零,处理--->
((((((((((((((((((((((((((((((((((((((((((((((((((((
; 跳过处理大小为零的Section
003B096E    83C6 10         add     esi, 10
003B0976  ^\EB 91           jmp     short 003B0909
))))))))))))))))))))))))))))))))))))))))))))))))))))
003B09EE    D1E9            shr     ecx, 1    ; ecx /2
003B09F5    66:8B85 2DD6410>mov     axword ptr ss:[ebp+41D62D]
003B0A01    66:35 2111      xor     ax, 1121
003B0A37    66:C1C8 02      ror     ax, 2
003B0A40    66:05 1A00      add     ax, 1A
003B0A49    66:05 A100      add     ax, 0A1
; 计算key
003B0A84    66:3103         xor     word ptr ds:[ebx], ax
003B0A8C    66:48           dec     ax
003B0A93    43              inc     ebx                              ; 指向下一byte
003B0A99    43              inc     ebx                              ; 移动指针
003B0AC7    49              dec     ecx
003B0ACD    83F9 00         cmp     ecx, 0
003B0AD0  ^\75 AD           jnz     short 003B0A7F
; 循环解码
003B0B09    8B46 0C         mov     eaxdword ptr ds:[esi+C]    ; flag
003B0B11    83E0 01         and     eax, 1    ; 隐藏着什么标记呢?
003B0B30    83BD F81D4200 0>cmp     dword ptr ss:[ebp+421DF8], 1
003B0B37   /0F85 60030000   jnz     003B0E9D    ; 不知道,nj
003B0B6A    83F8 01         cmp     eax, 1
003B0B6D    0F85 25030000   jnz     003B0E98; 还是不知道,nj,$$#@%@#$
003B0C18    60              pushad
003B0C23    8B46 04         mov     eaxdword ptr ds:[esi+4]; RSize
003B0C2B    83F8 00         cmp     eax, 0
003B0C33   /0F84 03020000   je      003B0E3C    ; RSize==0就不分配空间了
003B0C43    8B46 08         mov     eaxdword ptr ds:[esi+8]    ;VSize
003B0C73    6A 04           push    4
003B0C75    68 00100000     push    1000
003B0C7A    50              push    eax
003B0C7B    6A 00           push    0
003B0C7D    FF95 13CF4100   call    dword ptr ss:[ebp+41CF13]        ; 分配空间存放Section
                                    0012FF74   003B0C83  /CALL to VirtualAlloc from 003B0C7D
                                    0012FF78   00000000  |Address = NULL
                                    0012FF7C   0000F342  |Size = F342 (62274.)
                                    0012FF80   00001000  |AllocationType = MEM_COMMIT
                                    0012FF84   00000004  \Protect = PAGE_READWRITE
003B0CC7    8985 E0D34100   mov     dword ptr ss:[ebp+41D3E0], eax ; 得到的空间
003B0CFF    56              push    esi    ; 保存 Section Table Pointer
003B0D32    8B1E            mov     ebxdword ptr ds:[esi]    ; ebx -> VOffset
003B0D39    039D DCD34100   add     ebxdword ptr ss:[ebp+41D3DC]   ; +ImageBase, 得到VA
003B0D44    50              push    eax
003B0D45    53              push    ebx
003B0D46    E8 AE620000     call    003B6FF9    ; aplib_depack_asm.解压缩到刚才VirtualAlloc得到的空间
003B0D50    83C4 08         add     esp, 8                           ; 平衡堆栈,大概用的不是stdcall
003B0D5D    8BC8            mov     ecxeax    ; 解压出来的长度
003B0D64    8B3E            mov     edidword ptr ds:[esi]    ; edi -> VOffset
003B0D93    03BD DCD34100   add     edidword ptr ss:[ebp+41D3DC]   ; +ImageBase, Get VA
; 要把解压得代码传送回去了
003B0DC6    8BB5 E0D34100   mov     esidword ptr ss:[ebp+41D3E0]; 解压缩后的数据
003B0DE3    F3:A4           rep     movs byte ptr es:[edi], byte ptr ds:[esi]     ; copy all
003B0DEF    5E              pop     esi                                           ; 恢复 Section Table Pointer
; 这里有点无聊。根本没有修改esi也没用用它,最后都popad
003B0E0C    8B85 E0D34100   mov     eaxdword ptr ss:[ebp+41D3E0]    ; 申请到的地址
003B0E29    68 00800000     push    8000
003B0E2E    6A 00           push    0
003B0E30    50              push    eax
003B0E31    FF95 17CF4100   call    dword ptr ss:[ebp+41CF17]                     ; kernel32.VirtualFree
; 满门抄斩……55555555
003B0E53    61              popad
; -------- 修正页面访问权限 ----------
003B0EAC    60              pushad
003B0EB2    8B9D DCD34100   mov     ebxdword ptr ss:[ebp+41D3DC]                ; ImageBase
003B0ECF    031E            add     ebxdword ptr ds:[esi]    ; 块表 VA
003B0EE8    8B4E 04         mov     ecxdword ptr ds:[esi+4]    ; 长度
003B0EF5    B8 74894100     mov     eax, 418974
003B0EFF    03C5            add     eaxebp    ; buffer for VirtualProtect
003B0F2E    50              push    eax
003B0F2F    6A 04           push    4
003B0F31    51              push    ecx
003B0F32    53              push    ebx
003B0F33    FF95 27CF4100   call    dword ptr ss:[ebp+41CF27]                     ; kernel32.VirtualProtect
                                    0012FF74   003B0F39  /CALL to VirtualProtect from 003B0F33
                                    0012FF78   00401000  |Address = Try.00401000
                                    0012FF7C   00006000  |Size = 6000 (24576.)
                                    0012FF80   00000004  |NewProtect = PAGE_READWRITE
                                    0012FF84   003B30A7  \pOldProtect = 003B30A7
003B0F3E    61              popad
; -------------- 移动指针,到下一个Section ------------------
003B0F83    83C6 10         add     esi, 10
003B0F8B  ^\E9 79F9FFFF     jmp     003B0909    ; 循环直到所有Sections都还原
; ------------------------------------
; 循环完成到这里,这里其实可以Dump了:
003B0F9A    90              nop
003B0FAE    8D85 D95C4000   lea     eaxdword ptr ss:[ebp+405CD9] ; 这东西很无聊,碰到好几次,猜不出来,大概是buffer
  

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功