欢迎来到 嗅灵易学

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

ASProtect.SKE.2.11.Build.03.13-RES-crk对部分系统函数的处理(二)

ASProtect.SKE.2.11.Build.03.13-RES-crk对部分系统函数的处理(二)

上篇文章最后提到后面还有很多的内存分配,比如:
           00CD0000
           00CE0000
           00CF0000
           00D00000
           00D10000
           00D20000

这些地方,经过仔细的观察:
00D10000    A1 F435887C     mov     eax, [7C8835F4]
00D10005    C3              retn
7C812C8D >  A1 F435887C     mov     eax, [7C8835F4]
7C812C92    C3              retn
下面一段是系统函数kernel32.GetCommandLineA的代码,由此可知这些空间也是为对系统函数处理而分配的。
看看加壳后程序对GetCommandLineA的调用变成了:
004013C4    E8 3BEC9100     call    00D20004
00D20004    FF0424          inc     dword ptr [esp]                  ;
00D20007    36:EB 01         jmp     short 00D2000B
00D2000A    F2:             prefix repne:
00D2000B    68 0000D100     push    0D10000
00D20010    C3              retn
进去后可以看到00D20004行将返回地址加上了1,这个与修改后的代码长度有关,如:
加壳前:
  004013C4     FF15 5C504000  call    [<&KERNEL32.GetCommandLineA>]   
004013CA     A3 B88A4000   mov     [408AB8], eax
Call长度为6
加壳后:
004013C4    E8 3BEC9100     call    00D20004
004013C9    09A3 B88A4000   or      [ebx+408AB8], esp
004013CF    E8 9F060000     call    00401A73
Call长度为5
上面的代码可以看到,外壳为处理GetCommandLineA函数分配了两个空间:
00D10000  里面是系统代码
00D20000  里面处理长度问题,再跳到00D10000里。
这样看来对系统函数的处理远不止上篇文章提到的14处,外壳共处理了两次,是在两个不同的seh中处理的。
要得到所有第二批被处理过的函数,方法一样,对VirtualAlloc中断,找关键点如下:
00A8BAF1    03B3 E4000000   add     esi, [ebx+E4]
00A8BAF7    833C24 00       cmp     dword ptr [esp], 0  //还有要处理的吗?
00A8BAFB  ^ 0F87 55FEFFFF   ja      00A8B956
00A8BA8A    0383 E0000000   add     eax, [ebx+E0]
00A8BA90    EB 01           jmp     short 00A8BA93  //在该处设断,eax中可得到函数。
写个脚本将它们一网打尽:
var  VirtualAllocaddr
var  temp
        
checkver:     
  //check ollyscript's version
  cmp  $VERSION,"0.9"
  ja  start
  msg  "version bad!"
  ret
  
start:
        gpa  "VirtualAlloc","kernel32.dll"  
  mov  VirtualAllocaddr,$RESULT
                
        bp  VirtualAllocaddr    //在VirtualAlloc设断
       
continue:        
        run
        
        //is virtualalloc?
        cmp  eip,VirtualAllocaddr
        je  isVirtualAlloc
        
        //is 00A866AB?
        cmp  eip,00A866AB
        je  iskeycall1
        
        //is 00A8BA90?
        cmp  eip,00A8BA90
        je  iskeycall2
        
         //is 00A94774 write
        sto
        cmp  [00A94774],00A65EC0
        jne  fix
  jmp  continue  
isVirtualAlloc:
        rtr
   
        log  eax     
        //is 00A60000?  
        cmp  eax,00A60000
        je  bp1 
        //is 00C20000?
        cmp  eax,00C20000
        je  bp2
        jmp  continue
        
   bp1:
        bphws  00A866AB,"x"
        bphws  00A8BA90,"x"
        jmp  continue
        
   bp2:
        bpwm  00A94774,1
        jmp  continue
                
iskeycall1:
        log  [ebp-c]
        jmp  continue
        
iskeycall2:
        log  eax
        jmp  continue
                         
fix:
        mov  [00A94774],#C05EA6#
        bpmc
        jmp  continue
return:    
        bc  VirtualAllocaddr    
  ret
连同上篇的一起得到如下信息:
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C806A59 | ASCII "GetProcAddress"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 003C0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C8075CF | ASCII "LoadLibraryA"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 003D0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C8076FB | ASCII "MapViewOfFile"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 003E0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C805C30 | ASCII "FindResourceA"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 003F0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C807439 | ASCII "IsBadReadPtr"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00BB0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C8089C5 | ASCII "UnmapViewOfFile"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00BC0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C804F4D | ASCII "CloseHandle"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00BD0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C805141 | ASCII "CreateFileMappingA"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00BE0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C805135 | ASCII "CreateFileA"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00BF0000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C807494 | ASCII "IsDebuggerPresent"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00C00000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C806D02 | ASCII "GetSystemTime"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00C10000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C808AE2 | ASCII "VirtualAlloc"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00C20000
00A86EFA   当写入 [00A94774] 时设置内存断点
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C808B1C | ASCII "VirtualFree"
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00C30000
00A866AB   硬件断点 1 位于 00A866AB
           [ebp-c]: 7C806333 | ASCII "GetCurrentProcessId"

00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 77D24315 | user32.RegisterClassExA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00CD0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00CE0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 77D288E1 | user32.DialogBoxParamA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00CF0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D00000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C812C8D | kernel32.GetCommandLineA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D10000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D20000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C801EEE | kernel32.GetStartupInfoA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D30000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D40000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80B529 | kernel32.GetModuleHandleA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D50000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D60000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80E00D | kernel32.GetCurrentProcess
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D70000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D80000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C801E16 | kernel32.TerminateProcess
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00D90000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00DA0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80B357 | kernel32.GetModuleFileNameA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00DB0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00DC0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C81DC3F | kernel32.FreeEnvironmentStringsA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00DD0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00DE0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C801EEE | kernel32.GetStartupInfoA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00DF0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E00000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C811069 | kernel32.GetFileType
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E10000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E20000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C812CA9 | kernel32.GetStdHandle
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E30000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E40000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C811069 | kernel32.GetFileType
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E50000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E60000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80C6CF | kernel32.SetHandleCount
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E70000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E80000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80B529 | kernel32.GetModuleHandleA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00E90000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00EA0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C81486A | kernel32.GetEnvironmentVariableA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00EB0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00EC0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80B357 | kernel32.GetModuleFileNameA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00ED0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00EE0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C80B357 | kernel32.GetModuleFileNameA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00EF0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F00000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C812CA9 | kernel32.GetStdHandle
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F10000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F20000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C810F9F | kernel32.WriteFile
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F30000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F40000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C812BE6 | kernel32.GetCPInfo
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F50000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F60000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C81E82A | kernel32.GetOEMCP
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F70000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F80000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C809943 | kernel32.GetACP
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00F90000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00FA0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C812BE6 | kernel32.GetCPInfo
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00FB0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00FC0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C832E2B | kernel32.LCMapStringA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00FD0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00FE0000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C832E2B | kernel32.LCMapStringA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 00FF0000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 01000000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C838CB9 | kernel32.GetStringTypeA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 01010000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 01020000
00A8BA90   硬件断点 2 位于 00A8BA90
           eax: 7C838CB9 | kernel32.GetStringTypeA
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 01030000
7C809A81   断点位于 kernel32.VirtualAlloc
           eax: 01040000

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

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

0 0 0 举报
复制成功