zoukankan      html  css  js  c++  java
  • 【续篇】再次调戏勒索软件大黑客

    首先为什么说再次调戏呢,因为这个大黑客之前已经被调戏过了一次,如果各位看官不知道以前是如何调戏的,可以转到调戏勒索软件大黑客围观

    为什么会写这篇文章呢,因为这个叫Xiaoba的大黑客显然不服输,很快他开发了新的勒索软件,然后再次大肆传播

    1.png

    笔者呢,最近也闲着,而且继上次调戏后可能觉醒了”攻”的一面,这个叫Xiaoba的大黑客,重新树立了自信再次发上了他的”新作品”,要么他就是觉得不服,觉得上次只是失误才让他的勒索软件那么快沦陷,这次不知道从哪找了那么多信心想要”Play Again”,那么他就是一个纯粹的”抖M”在被调戏中找到了莫名的快感,不管怎么样,我还是觉得调戏下自信心膨胀的大黑客比steam上喜加一好玩多了。

    当然,纯粹调戏大黑客就没啥意思了,所以这次的内容,除了用最简单的办法干掉大黑客的勒索软件,写出OneKey Cracker 一键破解软件,然后联系大黑客让他认识到IT界的险恶外,我们简单科普一些逆向与反逆向还有反反逆向的知识。一起见识下现在幼儿园小朋友都会做的“一键加壳”“一键加花”在某些反破解手段上有多么的不耐艹。

    简单来说就是让XiaoBa大黑客死也死个明白。

    那么回到主题,我们把再次把这款勒索软件下载下来

    2.png

    我们将软件拷贝到虚拟机中,运行一下,很快,出现了如下界面

    3.png

    现在,使用ollydbug加载这个软件,很快提示这个软件被加壳过了

    4.png

    我们使用ExeInfos看看

    5.png

    遗憾的是,ExeInfo也无法查到这个壳的特征,我们打开sections看看

    6.png

    可以看到,有两个Section Name被修改为了XiaoBa,当然,以这个大黑客的智商要写壳还得过100年吼,应该是使用其它壳加壳并且多次加花指令,为了找点“我是大黑客”的自信,把壳的Section Name用某些工具自行修改了一下,以显示自己的牛逼。

    不过没关系,我们直接运行这个勒索软件,用附加的方法来查看这个壳

    7.png

    然后和上一次一样,我们换汤不换药,继续查找这个“宇宙第一语言先有易语言后有易语言”的神奇易语言作品的字符串比对特征值

    8B5424048B4C240885D2750D

    8.png

    很快,在内存映像中找到了结果,我们在汇编窗口中跳转到这个地址,然后下断点

    9.png

    之后随便输入一个密码,点击开始解密,很快,断点被断了下来,我们观察堆栈,直到出现所谓的“密码”

    10.png

    很快,在第二次执行到断点的时候,我们抓到了密码

    11.png

    执行跟随,看看ret到哪里

    12.png

    如果没记错的话,这个特征码应该和上次的没什么不一样,我们只需要比对一下这段代码在内存中的哪一个位置就可以了

    通过比对,发现在内存中存在2处这个比对。

    13.png

    14.png

    那不就和上次一样么,我们尝试修改这里的代码,看看能不能破解成功。

    15.png

    很快,这款勒索软件缴械投降,这部就和上次一样换汤不换药么,大黑客还以为换了个强点的壳就能够阻止逆向分析,实际上并没有卵用,实际上就算是SE VMP之类的强壳,如果没有专门使用其SDK对一些关键的代码进行反调试虚拟化,结果还是一样的,当然以这个勒索软件作者的智商,要理解到这一点恐怕还早。

    16.png

    17.png

    这次的破解代码几乎可以和上次的代码共用,都不用改,就是进程名从xiaoba.exe换成wannadie.exe

    #include<Windows.h>
    #include<tlhelp32.h>
    #include<iostream>
    #include<fstream>
    #include<stdio.h>
    #defineEXEJ_EXENAME &quot;WannaDie.exe&quot;
    static unsignedchar constbin[]={0x83,0xf8,0x00,0xb8,0x00,0x00,0x00,0x00,0x0f,0x94,0xc0,0x89,0x45,0xf8,0x8b,0x5d,0xfc,0x85,0xdb,0x74,0x09};
    static unsignedchar constcrkbin[]={0x33,0xc0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
    voidMESSAGE(char *s)
    {
             MessageBox(NULL,s,&quot;&quot;,MB_OK);
    }
    int main()
    {
             char buffer1k[1024];
             unsigned int oft=0;
             int bfound=FALSE;
             HANDLE procSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
             if(procSnap == INVALID_HANDLE_VALUE)
             {
                       MESSAGE(&quot;无法枚举进程 &quot;);
                       return 0;
             }
             //
             PROCESSENTRY32 procEntry = { 0 };
             procEntry.dwSize =sizeof(PROCESSENTRY32);
             BOOL bRet =Process32First(procSnap,&procEntry);
             while(bRet)
             {
                       if (strcmp(procEntry.szExeFile,EXEJ_EXENAME)==0)
                       {
                                bfound=TRUE;
                                break;
                       }
                       bRet =Process32Next(procSnap,&procEntry);
             }
             if (!bfound)
             {
                       MESSAGE(&quot;未找到目标进程 &quot;);
                       return 0;
             }
             CloseHandle(procSnap);
             HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, procEntry.th32ProcessID);       
             if (!hProcess)
             {
                       MESSAGE(&quot;无法打开目标进程 &quot;);
                       return 0;
             }
             DWORD oldProtect,fw,p=1;
             while(oft<0x7fffffff-sizeof(buffer1k))
             {
                       VirtualProtectEx( hProcess,(LPVOID)oft, sizeof(buffer1k), PAGE_EXECUTE_READWRITE, &oldProtect );
                       ReadProcessMemory( hProcess,(LPVOID)oft, buffer1k, sizeof(buffer1k), NULL);
                       for (intsoft=0;soft<sizeof(buffer1k)-sizeof(bin);soft++)
                       {
                                if(memcmp(buffer1k+soft,bin,sizeof(bin))==0&&!(p--))
                                {
                                         WriteProcessMemory(hProcess,(LPVOID)(oft+soft-sizeof(crkbin)),crkbin,sizeof(crkbin),&fw);
                                         if (fw==0)
                                         {
                                                   break;
                                         }
                                         if(fw==sizeof(crkbin))
                                         {
                                                   MESSAGE(&quot;破解成功!请点击开始恢复文件&quot;);
                                                   CloseHandle(hProcess);
                                                   return0;
                                         }
                                }
                       }
                       //VirtualProtectEx( hProcess,(LPVOID)oft, sizeof(buffer1k), oldProtect, NULL );
                       oft+=(sizeof(buffer1k)-sizeof(bin));
             }
             MESSAGE(&quot;未找到破解特征&quot;);
    }

    18.png

    19.png

    破解结束.

    当然,要是读者觉得使用ollydbg实在太复杂的话,我专程将这个软件的破解方式用pedoll写了一个脚本,挂载这个脚本后,很轻松就能把这个勒索软件的密码给扒出来.

    20.png

    21.png

    显然这次这个大黑客还是不长记性,在一些没毛用的地方下功夫,我们继续,看到这个软件是不是把邮箱换了个,继续挂载PeDoll,吧这货的邮箱账号密码继续扒出来,因为我们只需要抓数据包,只要使用PeDoll hook这个软件的send函数就可以了

    22.png

    然后点击重新生成key,很快,一堆发往25端口的带有账号和密码的数据包被dump了下来

    23.png

    使用base64解出他的账号,呦呵,换号了呀

    24.png

    再解出他的密码

    25.png

    上次发帖有人说图片模糊看不清,那这次我用文字打出来让大家一起看看

    账号:TheYuCheng@yeah.net

    密码:Illuminati666

    大家可以用foxmail登录自行玩耍,当然,如果你刚好是勒索软件受害者的话,在这个邮箱里可以找到你的密码.

    26.png

    最后,我们给这个勒索软件大黑客打个招呼,上次调戏后不知道有没有把我拉黑,感谢他再一次把自己的账号和密码告诉我们.惊不惊喜,意不意外?

  • 相关阅读:
    题解 LNOI2014 LCA
    题解 P3413 【SAC#1
    题解 P3372 【【模板】线段树 1】(珂朵莉树解法)
    题解 P2610 【[ZJOI2012]旅游】
    题解 CF911D 【Inversion Counting】
    题解 CF1037D 【Valid BFS?】
    bootstrap常用部件下载
    sql获取上月同期
    VSS配置
    SQL中的union,except,intersect用法
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/7866059.html
Copyright © 2011-2022 走看看