【文章标题】: VA_X inline Pathcing
【文章作者】: yangjt
【作者邮箱】: yangjietao123@163.com
【作者主页】: http://blog.sina.com.cn/yangjt
【作者QQ号】: 325002492
【软件名称】: VA_X
【加壳方式】: Armadillo
【操作平台】: Win Vista+ Win XP
【前   传】: BRD 51的时候很过分……
【修改说明】: 自己做起来才发现不是那么回事……本着认真负责的态度……我来重写这篇文章^_^
--------------------------------------------------------------------------------
【详细过程】
原理就是Hook ArmAccess.dll输入表里的VirtualProtect,因为解码后程序会N次调用到这个函数……所以我们把它给改到我们的代码上,然后就可以为所欲为了……(^_^)当然中间还需要处理Arm的CRC校验。所以如何处理……请听我慢慢说来
First Step:
prepare
  patch 代码前要做一些准备工作
  用PeEditor把程序的.text段和.adata段的属性加上可写属性,因为代码需要对这两段进行SMC,如果不能写就会出现页保护错误
  之后OllyICE打开程序,下那个经典的断点VirtualProtect,锁定程序解码ArmAccess.dll时对其区段进行的页保护设定
  这段代码长成这个样子:
  

引用:
  1F25A53C   .  C745 B8 04000>mov     dword ptr [ebp-48], 4
  1F25A543   .  EB 07         jmp     short 1F25A54C
  1F25A545      C745 B8 02000>mov     dword ptr [ebp-48], 2
  1F25A54C   >  8B55 E0       mov     edxdword ptr [ebp-20]
  1F25A54F   .  8B45 F4       mov     eaxdword ptr [ebp-C]
  1F25A552   .  0342 0C       add     eaxdword ptr [edx+C]
  1F25A555   .  8945 A8       mov     dword ptr [ebp-58], eax
  1F25A558   .  8B4D E0       mov     ecxdword ptr [ebp-20]
  1F25A55B   .  8B51 08       mov     edxdword ptr [ecx+8]
  1F25A55E   .  8955 B0       mov     dword ptr [ebp-50], edx
  1F25A561   .  8D45 BC       lea     eaxdword ptr [ebp-44]
  1F25A564   .  50            push    eax                              ; /pOldProtect
  1F25A565   .  8B4D B8       mov     ecxdword ptr [ebp-48]          ; |
  1F25A568   .  51            push    ecx                              ; |NewProtect
  1F25A569   .  8B55 B0       mov     edxdword ptr [ebp-50]          ; |
  1F25A56C   .  52            push    edx                              ; |Size
  1F25A56D   .  8B45 A8       mov     eaxdword ptr [ebp-58]          ; |
  1F25A570   .  50            push    eax                              ; |Address
  1F25A571   .  FF15 7030291F call    dword ptr [<&KERNEL32.VirtualPro>; \VirtualProtect
  
  查一下MSDN就不难发现0x02是PAGE_READONLY,顺便也看下PAGE_EXECUTE_READWRITE,嗯……这个值是0x40
  好下面让我们继续分析
  1F25A545      C745 B8 02000>mov     dword ptr [ebp-48], 2
  这句代码很诡异……因为它的作用……很显然嘛,把页保护属性装载到某个神秘的地方,这句不Patch到最后Hook ArmAccess.dll里的VirtualProtect就要出错。
  把0x02Patch成0x40就OK啦~~嗯……第一部分工作完成……保存此处修改……休息下眼睛^_^
  
  
  
  第二部分开工咯~~
  patch 代码要写到.adata 段
  original:
  1F259A2C  |.  A1 04A1291F   mov     eaxdword ptr [1F29A104]
    
  patch:
  
引用:
  call @patch
    
    
  @patch:
  mov     eaxdword ptr [1F29A104];恢复原始句
  pushad
  mov ds:Var1,eax
  mov [eax+572ec],//push @@1&ret 的机器码
  mov [eax+572ec],//push一不够两次
  popad
  ret
  ////////////////////////////////////////////////
  @@1:
  pushad
  mov eax,ds:Var1
  mov [eax+572ec],8B10C483//恢复var1+572ec处的机器码
  mov [eax+572F0], 5DE5
  mov dword ptr [eax+441FD], 28306D68//push @@2&ret 的机器码
  mov word ptr [eax+44201], 0C31F//push一不够两次
  add eax, 572EC
  mov ds:Var2, eax//存入Var2
  popad
  push ds:Var2//这里直接jmp ds:Var2咋样?
  retn
  //////////////////////////////////////////////////////
  @@2:
  pushad
  mov eax,ds:Var1
  mov dword ptr [eax+441FD], 33504233/////fix code
  mov word ptr [eax+44201], 7C41////////////fix code
  mov dword ptr [eax+6E124], 1F2830C5/////Offset @@3Hook VirtualProtect
  add eax, 441FD
  mov ds:Var2, eax/////重新保存Var值
  popad
  mov dword ptr [ebp-4], EA0CDE28//recover 4th CRC5 to normal
  mov dword ptr [ebp-C], C47B06E4//recover 4th CRC4 to normal
  mov dword ptr [ebp-10], 9BEFF589//recover 4th CRC3 to normal
  mov dword ptr [ebp-14], A0901CA0//recover 4th CRC2 to normal
  mov dword ptr [ebp-18], 0BB997E9//recover 4th CRC1 to normal
  push ds:Var2, eax//jmp ds:Var2
  retn
  //////////////////////////////////////////////////////
  @@3:
  pushad
  pushfd
  cmp     dword ptr [MigrateDevColor+1072F0h], 0///////1EDC8550 ; Exported entry  17. MigrateDevColor 
  je next
  ;1EECF840    6A FF           push    -1
  ;
  ;1EECF840    33C0            xor     eax, eax
  ;1EECF842    40              inc     eax
  ;1EECF843    C3              retn
  ;
  ;mov eax,1
    mov     dword ptr [1EECF840], C340C033///find call witch call it and patch it with bin code of 'mov eax,1'
    mov     byte ptr [EditControlW+0C1EFh], 0EBh/// Exported entry  11. EditControlW
    mov     byte ptr [EditControlW+0C245h], 0EBh//p.s.这里地址可能不一样……要自己找的……
    mov     byte ptr [EditControlW+0C282h], 0EBh
    mov     byte ptr [EditControlW+0C2A3h], 0EBh
    mov     byte ptr [EditControlW+0BF93h], 0EBh
   next:
    popfd
    popad
    jmp VirtualProtect
  
  比如拿1727做实例就应该这样写代码
  
引用:
  0x1F2A7360:
    mov     eaxdword ptr [1F2BE104]
    pushad
    mov     dword ptr [1F2A7500], eax
    mov     dword ptr [eax+572EC], 2a738768
    mov     dword ptr [eax+572F0], 0C31F
    popad
    jmp     1F27DA31
    pushad
    mov     eaxdword ptr [1F2A7500]
    mov     dword ptr [eax+572EC], 8B10C483
    mov     dword ptr [eax+572F0], 0C35DE5
    mov     dword ptr [eax+441FD], 2A73C868
    mov     word ptr [eax+44201], 0C31F
    add     eax, 572EC
    mov     dword ptr [1F2A7504], eax
    popad
    jmp     dword ptr [1F2A7504]
    pushad
    mov     eaxdword ptr [1F2A7500]
    mov     dword ptr [eax+441FD], 33504233
    mov     word ptr [eax+44201], 7C41
    mov     dword ptr [eax+6E124], 1F2A7422
    add     eax, 441FD
    mov     dword ptr [1F2A7504], eax
    popad
    mov     dword ptr [ebp-4], 8A86794A
    mov     dword ptr [ebp-C], 0xC2123907
    mov     dword ptr [ebp-10], 0xA5BA06EE
    mov     dword ptr [ebp-14], 56F72581
    mov     dword ptr [ebp-18], 6109DF09
    jmp     dword ptr [1F2A7504]
    pushad
    pushfd
    cmp     dword ptr [1EDD0EE0], 0
    je 1F2A7453
    mov     dword ptr [1EEE4800], 0C340C033
    mov     byte ptr [1ED552FF],0EB
    mov     byte ptr [1ED55355],0EB
    mov     byte ptr [1ED55392],0EB
    mov     byte ptr [1ED553B3],0EB
    popfd
    popad
    jmp dword ptr[1F2B7070]
  
  
--------------------------------------------------------------------------------
【经验总结】
  @@3的部分可以用自己的方法代替,比如说用y3y3y3的方法,和我以前所写过的方法,最后Patch完了别忘了jmp 
  btw:不能使用SetEnvironmentVariable的方法=.=当然脱了壳以后可以Set下面这两个
  "DAYSLEFT"
  "DAYSINSTALLED"
  至于VirtualProtect,这个API Armadillo自己就用到的,可以jmp dword ptr[.....]
  在这里说明下……那个4th CRC是用ArmaCRC找出来的,文件在附件里

  附带附件为Patch,直接打上即可。算是一个礼物吧……不收费啦~~
  祝天下所有的父亲节日快乐哈~~
  后传:构建和谐社会,人人有责……^_^
  
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年06月21日 12:43:52
上传的附件 ArmaCRC.rar [解压密码:pediy]
visual.assist-patch.rar