参考的看雪的一位大佬的https://bbs.pediy.com/thread-259972.htm
此文意义
主要是想自己写病毒分析,并加强逆向分析技术,和反汇编能力,其次该文章会分很多天才会写完,记录每天的分析
逆向过程
先打开ida看了看,这下面有很多错误的,因为一开始静态分析的
进入第一个函数看看,看起来挺简单的,不过在这里面有调用了几个函数,我尝试的跟了进个进去后,发现大部分是初始化
再次回到主函数时,去看调用函数的参数,code?我一开始以为是shellcode,虽然可以按C转为代码,但我最终还是没有去按,不过后面想了一下,以前有大佬说过,数据不一定要放到数据段里,也有些人把数据放在代码段里面。一般放在一个函数的结尾,这里显然就是了
随后打开od看看
这里有三个函数连续调用了,经过自己的调试后,发现是把穿进去的参数copy到一个堆里面,然后我们来看panda,00405360这个函数,这是代码
00405360 /$ 55 push ebp 00405361 |. 8BEC mov ebp,esp 00405363 |. 83C4 E8 add esp,-0x18 00405366 |. 53 push ebx ; panda.0040F7B8 00405367 |. 56 push esi 00405368 |. 57 push edi 00405369 |. 33DB xor ebx,ebx ; panda.0040F7B8 0040536B |. 895D E8 mov [local.6],ebx ; panda.0040F7B8 0040536E |. 895D F0 mov [local.4],ebx ; panda.0040F7B8 00405371 |. 895D EC mov [local.5],ebx ; panda.0040F7B8 00405374 |. 894D F4 mov [local.3],ecx 00405377 |. 8955 F8 mov [local.2],edx ; xboy 0040537A |. 8945 FC mov [local.1],eax ; orther string 0040537D |. 8B45 FC mov eax,[local.1] 00405380 |. E8 37EDFFFF call panda.004040BC 00405385 |. 8B45 F8 mov eax,[local.2] ; panda.004037D8 00405388 |. E8 2FEDFFFF call panda.004040BC 0040538D |. 33C0 xor eax,eax 0040538F |. 55 push ebp 00405390 |. 68 4A544000 push panda.0040544A 00405395 |. 64:FF30 push dword ptr fs:[eax] 00405398 |. 64:8920 mov dword ptr fs:[eax],esp 0040539B |. 837D FC 00 cmp [local.1],0x0 0040539F |. 75 0A jnz short panda.004053AB 004053A1 |. 8B45 F4 mov eax,[local.3] 004053A4 |. E8 9BE8FFFF call panda.00403C44 004053A9 |. EB 77 jmp short panda.00405422 004053AB |> 8D45 EC lea eax,[local.5] 004053AE |. 8B55 F8 mov edx,[local.2] ; panda.004037D8 004053B1 |. E8 26E9FFFF call panda.00403CDC ; local5=local2;but local2=0 004053B6 |. 8D45 F0 lea eax,[local.4] 004053B9 |. E8 86E8FFFF call panda.00403C44 004053BE |. 8B45 FC mov eax,[local.1] 004053C1 |. E8 06EBFFFF call panda.00403ECC 004053C6 |. 8BF0 mov esi,eax 004053C8 |. 85F6 test esi,esi 004053CA |. 7E 4B jle short panda.00405417 004053CC |. BB 01000000 mov ebx,0x1 004053D1 |> 8B45 EC /mov eax,[local.5] ; encrypt?? 004053D4 |. E8 F3EAFFFF |call panda.00403ECC ; caculate string length 004053D9 |. 50 |push eax 004053DA |. 8BC3 |mov eax,ebx ; panda.0040F7B8 004053DC |. 5A |pop edx ; 0012FFB4 004053DD |. 8BCA |mov ecx,edx 004053DF |. 99 |cdq 004053E0 |. F7F9 |idiv ecx 004053E2 |. 8BFA |mov edi,edx 004053E4 |. 47 |inc edi 004053E5 |. 8B45 EC |mov eax,[local.5] 004053E8 |. 0FB64438 FF |movzx eax,byte ptr ds:[eax+edi-0x1] ; xboy div 0xA;edx ^ local1 004053ED |. B9 0A000000 |mov ecx,0xA 004053F2 |. 33D2 |xor edx,edx 004053F4 |. F7F1 |div ecx 004053F6 |. 8B45 FC |mov eax,[local.1] 004053F9 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-0x1] 004053FE |. 33D0 |xor edx,eax 00405400 |. 8D45 E8 |lea eax,[local.6] 00405403 |. E8 24EAFFFF |call panda.00403E2C ; 将两个参数加密后的字符串存入申请的堆里 00405408 |. 8B55 E8 |mov edx,[local.6] 0040540B |. 8D45 F0 |lea eax,[local.4] 0040540E |. E8 C1EAFFFF |call panda.00403ED4 ; 将加密后的长度计算出来 00405413 |. 43 |inc ebx ; panda.0040F7B8 00405414 |. 4E |dec esi 00405415 |.^ 75 BA jnz short panda.004053D1 00405417 |> 8B45 F4 mov eax,[local.3] 0040541A |. 8B55 F0 mov edx,[local.4] ; ntdll.7C92E64E 0040541D |. E8 76E8FFFF call panda.00403C98 ; local3=encrypt(arg1,arg2) 00405422 |> 33C0 xor eax,eax 00405424 |. 5A pop edx ; 0012FFB4 00405425 |. 59 pop ecx ; 0012FFB4 00405426 |. 59 pop ecx ; 0012FFB4 00405427 |. 64:8910 mov dword ptr fs:[eax],edx 0040542A |. 68 51544000 push panda.00405451 0040542F |> 8D45 E8 lea eax,[local.6] 00405432 |. BA 03000000 mov edx,0x3 00405437 |. E8 2CE8FFFF call panda.00403C68 0040543C |. 8D45 F8 lea eax,[local.2] 0040543F |. BA 02000000 mov edx,0x2 00405444 |. E8 1FE8FFFF call panda.00403C68 00405449 . C3 retn
经过自己的分析后,发现把两个参数先进行取余,再进行xor,然后生成字符串***武汉.....这些字符串并copy到0x0DF000C,并判断这里面应该还有检验两个字符串是否相等的函数(这是自己猜测的,因为生成一个先前有的字符串拿来干嘛?但我不知道在哪校验,也跟进去看了看,但只发现了调用了临界区,猜测是另外一个线程在校验(猜测)????),但里面还有些细节没有搞明白,所以看了上述大佬的部分分析