[调试逆向] [原创]数字公司卫士插件检测中一个文件解密过程

potal 2010-11-17 22:40 4255
菜鸟第一次发帖,欢迎大家拍砖
能力有限,分析得不好,而且走了很多弯路

根据360运行插件检测的过程中,有各自检测某些插件的过程,故猜想在检测过程中,插件检测是在调用特征库中的数据,所以接下来应该是找到调用的哪个dat文件,该特征库文件通过某段解密代码解密之后得到特征库的真正数据,然后进行检测。如果需要调用某个数据文件,必然用到OpenFile函数,所以用IDA载入该动态链接库,查看输入表,找到是否有OpenFile函数(确实调用过)。接下来用OD 附加360主程序,然后F9运行,进入到360主界面。Ctrl+G,输入OpenFile,Enter。在主界面中点击插件检测,程序断在了OpenFile函数的入口处,从寄存器中看到读取的文件为LibAntiSpywa.dat该数据文件,故这个数据文件就是存特征库的文件。然后Alt+F9返回程序领空,程序领空正好是在AntiAdwa.dll这个动态链接库中。至此,说明之前猜测的插件检测的插件是该动态链接库是正确的,也说明之前猜测的调用某个特征库文件也是正确的,而且找到了该文件。上述已经到OpenFile()函数处了,那么对于文件的读取函数应该不远,再断一个ReadFile(),回到程序领空。再跟踪几步,到以下代码处
03CB5369  /$  55            push    ebp
03CB536A  |.  8BEC          mov     ebp, esp
03CB536C  |.  83EC 10       sub     esp, 10
03CB536F  |.  57            push    edi
03CB5370  |.  33FF          xor     edi, edi
03CB5372  |.  57            push    edi           ; /hTemplateFile => NULL
03CB5373  |.  57            push    edi               ; |Attributes => 0
03CB5374  |.  6A 03         push    3                  ; |Mode = OPEN_EXISTING
03CB5376  |.  57            push    edi                 ; |pSecurity => NULL
03CB5377  |.  6A 01         push    1           ; |ShareMode = FILE_SHARE_READ
03CB5379  |.  68 00000080   push    80000000       ; |Access = GENERIC_READ
03CB537E  |.  FF75 08       push    dword ptr [ebp+8]                ; |FileName
03CB5381  |.  894D F8       mov     dword ptr [ebp-8], ecx           ; |
03CB5384  |.  897D F0       mov     dword ptr [ebp-10], edi          ; |
03CB5387  |.  FF15 5092D403 call    dword ptr [<&KERNEL32.CreateFile>; \CreateFileA
03CB538D  |.  83F8 FF       cmp     eax, -1
03CB5390  |.  8945 F4       mov     dword ptr [ebp-C], eax
03CB5393  |.  75 07         jnz     short 03CB539C
03CB5395  |.  33C0          xor     eax, eax
03CB5397  |.  E9 C7000000   jmp     03CB5463
03CB539C  |>  53            push    ebx
03CB539D  |.  56            push    esi
03CB539E  |.  57            push    edi                       ; /pFileSizeHigh
03CB539F  |.  50            push    eax                              ; |hFile
03CB53A0  |.  FF15 5492D403 call    dword ptr [<&KERNEL32.GetFileSiz>; \GetFileSize
03CB53A6  |.  8BD8          mov     ebx, eax
03CB53A8  |.  8D43 01       lea     eax, dword ptr [ebx+1]
03CB53AB  |.  50            push    eax                              ; /size
03CB53AC  |.  FF15 4093D403 call    dword ptr [<&MSVCRT.malloc>]     ; \malloc
03CB53B2  |.  8BF0          mov     esi, eax
03CB53B4  |.  59            pop     ecx
03CB53B5  |.  3BF7          cmp     esi, edi
03CB53B7  |.  0F84 98000000 je      03CB5455
03CB53BD  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
03CB53C0  |.  57            push    edi                   ; /pOverlapped
03CB53C1  |.  50            push    eax              ; |pBytesRead
03CB53C2  |.  53            push    ebx            ; |BytesToRead
03CB53C3  |.  56            push    esi                    ; |Buffer
03CB53C4  |.  897D FC       mov     dword ptr [ebp-4], edi           ; |
03CB53C7  |.  FF75 F4       push    dword ptr [ebp-C]                ; |hFile
03CB53CA  |.  FF15 5892D403 call    dword ptr [<&KERNEL32.ReadFile>] ; \ReadFile函数,真正的读取文件
03CB53D0  |.  85C0          test    eax, eax
03CB53D2  |.  74 79         je      short 03CB544D
03CB53D4  |.  8B46 30       mov     eax, dword ptr [esi+30]    ;dat文件偏移30处
03CB53D7  |.  69C0 98010000 imul    eax, eax, 198
03CB53DD  |.  83C0 34       add     eax, 34                ; dat文件大小,总字节数
03CB53E0  |.  3945 FC       cmp     dword ptr [ebp-4], eax
03CB53E3  |.  75 68         jnz     short 03CB544D
03CB53E5  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
03CB53E8  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
03CB53EB  |.  C745 F0 01000>mov     dword ptr [ebp-10], 1
03CB53F2  |.  897D 08       mov     dword ptr [ebp+8], edi
03CB53F5  |.  897C81 18     mov     dword ptr [ecx+eax*4+18], edi
03CB53F9  |.  397E 30       cmp     dword ptr [esi+30], edi
03CB53FC  |.  76 46         jbe     short 03CB5444
03CB53FE  |.  8D9E C0000000 lea     ebx, dword ptr [esi+C0]
03CB5404  |.  BF 80000000   mov     edi, 80              ; edi=80每次读取80个字节
03CB5409  |>  57            /push    edi                             ; 80
03CB540A  |.  8D43 80       |lea     eax, dword ptr [ebx-80]         ;每次将80字节读入之后eax到该80字节的开头处
03CB540D  |.  FF76 0C       |push    dword ptr [esi+C]               ;  3
03CB5410  |.  50            |push    eax                          ;字符串
03CB5411  |.  E8 29F7FFFF   |call    03CB4B3F                  ;  解密函数
03CB5416  |.  57            |push    edi                   ;  设置该组下一80字节
03CB5417  |.  FF76 0C       |push    dword ptr [esi+C]               ;  3
03CB541A  |.  53            |push    ebx                          ;字符串
03CB541B  |.  E8 1FF7FFFF   |call    03CB4B3F               ;第二组解密
03CB5420  |.  57            |push    edi                             ; 80
03CB5421  |.  8D83 80000000 |lea     eax, dword ptr [ebx+80]         ;  ebx之后80位
03CB5427  |.  FF76 0C       |push    dword ptr [esi+C]
03CB542A  |.  50            |push    eax
03CB542B  |.  E8 0FF7FFFF   |call    03CB4B3F                 ;第三组解密
03CB5430  |.  83C4 24       |add     esp, 24
03CB5433  |.  FF45 08       |inc     dword ptr [ebp+8]          ;上一组解密完成,组计数器自加
03CB5436  |.  8B45 08       |mov     eax, dword ptr [ebp+8]          ;
03CB5439  |.  81C3 98010000 |add     ebx, 198           ; 设置下一组需解密的198位
03CB543F  |.  3B46 30       |cmp     eax, dword ptr [esi+30]   ;组计数器与文件组大小比较
03CB5442  |.^ 72 C5         \jb      short 03CB5409     ;小于文件大小则继续

.
解密函数
03CB4B3F  /$  55            push    ebp
03CB4B40  |.  8BEC          mov     ebp, esp
03CB4B42  |.  837D 0C 01    cmp     dword ptr [ebp+C], 1
03CB4B46  |.  75 09         jnz     short 03CB4B51
03CB4B48  |.  FF75 08       push    dword ptr [ebp+8]
03CB4B4B  |.  E8 40FFFFFF   call    03CB4A90                         ;  若计数器为1调用该函数
03CB4B50  |.  59            pop     ecx
03CB4B51  |>  837D 0C 03    cmp     dword ptr [ebp+C], 3             ;  计数器位为3调用这段
03CB4B55  |.  75 0D         jnz     short 03CB4B64
03CB4B57  |.  FF75 10       push    dword ptr [ebp+10]               ;  80
03CB4B5A  |.  FF75 08       push    dword ptr [ebp+8]             ;  80位字符串
03CB4B5D  |.  E8 40FFFFFF   call    03CB4AA2
03CB4B62  |.  59            pop     ecx
03CB4B63  |.  59            pop     ecx
03CB4B64  |>  5D            pop     ebp
03CB4B65  \.  C3            retn

跳转调用真正的解密函数

03CB4AA2  /$  B8 98A2D303   mov     eax, 03D3A298
03CB4AA7  |.  E8 54410800   call    03D38C00
03CB4AAC  |.  83EC 10       sub     esp, 10
03CB4AAF  |.  53            push    ebx
03CB4AB0  |.  8B5D 08       mov     ebx, dword ptr [ebp+8]           ;  ebx为前80字符串
03CB4AB3  |.  57            push    edi
03CB4AB4  |.  33FF          xor     edi, edi                         ;  edi=0
03CB4AB6  |.  3BDF          cmp     ebx, edi
03CB4AB8  |.  74 77         je      short 03CB4B31
03CB4ABA  |.  397D 0C       cmp     dword ptr [ebp+C], edi           ;  ebp+c为80
03CB4ABD  |.  74 72         je      short 03CB4B31
03CB4ABF  |.  8A45 0F       mov     al, byte ptr [ebp+F]
03CB4AC2  |.  56            push    esi
03CB4AC3  |.  57            push    edi
03CB4AC4  |.  8D4D E4       lea     ecx, dword ptr [ebp-1C]
03CB4AC7  |.  8845 E4       mov     byte ptr [ebp-1C], al
03CB4ACA  |.  E8 B0610000   call    03CBAC7F
03CB4ACF  |.  BE 5059D603   mov     esi, 03D65950                        
;ASCII "A56667511DFF47dbA8146AD6EBF00A45"
03CB4AD4  |.  56            push    esi                             
; /s => "A56667511DFF47dbA8146AD6EBF00A45"
03CB4AD5  |.  E8 A6410800   call    <jmp.&MSVCRT.strlen>             ; \strlen
03CB4ADA  |.  59            pop     ecx
03CB4ADB  |.  50            push    eax                        ;  字符串长度20
03CB4ADC  |.  56            push    esi                              ;  字符串
03CB4ADD  |.  8D4D E4       lea     ecx, dword ptr [ebp-1C]         
03CB4AE0  |.  E8 EC620000   call    03CBADD1                ;将上述字符串拷贝
03CB4AE5  |.  33F6          xor     esi, esi
03CB4AE7  |.  397D 0C       cmp     dword ptr [ebp+C], edi
03CB4AEA  |.  897D FC       mov     dword ptr [ebp-4], edi
03CB4AED  |.  76 33         jbe     short 03CB4B22
03CB4AEF  |>  8BC6          /mov     eax, esi               ;字符串
03CB4AF1  |.  33D2          |xor     edx, edx
03CB4AF3  |.  F775 EC       |div     dword ptr [ebp-14]         ;计数器模20
03CB4AF6  |.  8BFA          |mov     edi, edx                ;
03CB4AF8  |.  397D EC       |cmp     dword ptr [ebp-14], edi       ;20与计数器比较
03CB4AFB  |.  72 15         |jb      short 03CB4B12               :小于则跳转
03CB4AFD  |.  837D E8 00    |cmp     dword ptr [ebp-18], 0       ;明码字符串A56667511DFF47dbA8146AD6EBF00A45
03CB4B01  |.  74 0F         |je      short 03CB4B12           ;等于则跳转
03CB4B03  |.  8D4D E4       |lea     ecx, dword ptr [ebp-1C]     
03CB4B06  |.  E8 48610000   |call    03CBAC53                ;校验函数
03CB4B0B  |.  8B45 E8       |mov     eax, dword ptr [ebp-18]     ;明码字符串
03CB4B0E  |.  03C7          |add     eax, edi                  ;上字符串的第n个字符   n=edi
03CB4B10  |.  EB 05         |jmp     short 03CB4B17           ;跳转至下下一句
03CB4B12  |>  B8 BC96D403   |mov     eax, 03D496BC
03CB4B17  |>  8A00          |mov     al, byte ptr [eax]          ;当前的字符,也就是第n个字符
03CB4B19  |.  30041E        |xor     byte ptr [esi+ebx], al       ;用上字符与需解密的字符进行异或操作
03CB4B1C  |.  46            |inc     esi                      ;计数器自加
03CB4B1D  |.  3B75 0C       |cmp     esi, dword ptr [ebp+C]        ;计数器与80比较
03CB4B20  |.^ 72 CD         \jb      short 03CB4AEF          ;小于80跳转继续解密

………………………..
如果该组解密完成之后,释放内存和重置寄存器等,开始下一组的解密
……………………….
最新回复 (6)
垃圾一个 2010-11-18 11:05
2
学习了,
5
guxinyi 2010-12-8 09:58
3
LZ有时间可以把检查插件的整个过程逆向出来,
GuluYZ 2010-12-8 15:46
4
印象中是一个0x198结构。union吧。
ltvictory 2010-12-8 15:46
5
插件检测的特征库文件时libspywa.dat,libspywa1.dat;不是楼主说的libantispywa.dat。
caosdun 2010-12-8 15:47
6
不错,。,,,,,,,,,,
ltvictory 2010-12-8 15:49
7
从64字节后开始,每408个字节为单位,进行解密运算。。。。
返回