欢迎来到 嗅灵易学

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

[原创]*nf的***辅助的破解分析

[原创]*nf的***辅助的破解分析

好久没来发帖了 , 这几天在清理硬盘, 顺便就发一个 , 仅做交流 , 欢迎大牛指正
易语言写的辅助, 外壳是vmp的 , 打开之后界面如下:

使用好几个版本的od, 都被anti了 , hawod倒是可以 ,不稳定 
说一个思路: 
  验证过程 部分代码被vm了 , 因此考虑用补丁数据的方法 , 使用wpe 跟踪下包 ,
  发现加密的包 主要有三个. 重点跟踪下这三个包的解密位置.
第一个包的解密位置如下:
0045EBC8      5F            pop edi                                  ;  第一个包 追出解密数据
0045EBC9      5E            pop esi
0045EBCA      5B            pop ebx
0045EBCB      8BE5          mov esp,ebp
0045EBCD      5D            pop ebp
0045EBCE      C2 0C00       retn 0xC
看一下正版的数据:
    0x31, 0x31, 0x34, 0x2e, 0x38, 0x30, 0x2e, 0x31, 0x35, 0x36, 0x2e, 0x34, 0x37, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x62, 0x36, 0x62, 0x31, 0x31, 0x35, 0x35, 0x38, 0x36, 0x38, 0x32, 0x63,
    0x39, 0x31, 0x36, 0x38, 0x63, 0x66, 0x34, 0x61, 0x37, 0x34, 0x35, 0x34, 0x65, 0x31, 0x66, 0x62,
    0x65, 0x30, 0x61, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
一堆 00 , 不晓得为什么冗余数据这么多 
补丁这一组数据之后 , 程序界面打开了 , 但是查询账户剩余时间失败 ,估计和另两个包有关 , 接着分析
软件打开之后 ,释放了两个dll , mlib.dll mdll.dll 应该是vc 写的com , 另外两个包的解析就在这里了 
第二组包 是一个ip地址 , 没意义 
解密第三组包的位置
mdll.dll
10034573       8B7408 10       mov esi,dword ptr ds:[eax+ecx+0x10]      ; 二次包补丁地址
10034577       8B4408 14       mov eax,dword ptr ds:[eax+ecx+0x14]
1003457B       3D FFFFFF2F     cmp eax,0x2FFFFFFF
10034580       0F85 86000000   jnz mDll.1003460C
10034586       391D A0DF0810   cmp dword ptr ds:[0x1008DFA0],ebx
1003458C       75 63           jnz short mDll.100345F1
其中这个esi 就是用户账户的剩余时间 ,eax 是一个识别码 ,只补丁寄存器就可以了

补丁第三组数据 , 程序显示剩余时间 , 可以运行了 , 但是 有几分钟 又会提示 失败.程序退出
除了第一个包之外 , 其它的都在 验证的线程里面 , 这种情况应该是验证线程sleep之后 , 再次进行验证导致的
这里笔者又偷懒了 , 使用xuter  看一下线程, 有一个入口有 mlib.dll 里面的 很可疑 , 把它挂起 ,就可以了
实际的分析过程还是挺复杂的 , 分析记录写了不少 ,
  有点意思的就是验证线程控制主线程的方式 ,猜测应该是 PostMessage自定义的消息来实现的, 使用api 跟踪发现 ,
     确实有一堆 0x600 以上的 消息 , 而windows的窗体的消息 一般都是 在0x400 以下的
  实际跟踪一下 确实如此 , 具体没有再做分析 
之后是写代码 ,使用dll注入, 第一个断点处 补丁数据 , 启动自己的线程 等待验证dll
载入, ,设置第二个断点 , 补丁数据之后 , 等几分钟把验证线程挂起 ,搞定
注意 :程序使用了动态基址 , dll载入的地址是可变的
帖一部分代码吧
LONG WINAPI VectoredHandler( PEXCEPTION_POINTERS ExceptionInfo) 
{
  static TCHAR  result[3000];
  int tid= GetCurrentThreadId();
  DWORD* top = (DWORD*)ExceptionInfo->ContextRecord->Esp; 
  DWORD call_from= *top;
  if (ExceptionInfo->ContextRecord->Eip == (DWORD)g_point )
  {
    outf("----断点一-----\n");
    outf("当前所在的线程 %x \n" , GetCurrentThreadId());
    BYTE*  tmp = (BYTE* )(ExceptionInfo->ContextRecord->Ebx );
    outf("第一组数据 %x \n", tmp);
    outf("ebx =  %x \n", ExceptionInfo->ContextRecord->Ebx );
    tmp-=0x1c0;
  //  bin2str( result , tmp , 0x1c0);
  //  outf("%s\n" , result);
    memcpy(tmp,g_patch,0x1c0);
    ExceptionInfo->ContextRecord->Edi = *top;
    ExceptionInfo->ContextRecord->Esp+=4;
    ExceptionInfo->ContextRecord->Eip++;
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)setPoint2(), NULL, 0, NULL);
    return EXCEPTION_CONTINUE_EXECUTION;    
  }else if( ExceptionInfo->ContextRecord->Eip == (DWORD)g_point2){
    outf("----断点二-------\n");
    outf("当前线程 %x\n" , GetCurrentThreadId());
    BYTE*  data = (BYTE* )ExceptionInfo->ContextRecord->Ecx ;
    data += ExceptionInfo->ContextRecord->Eax;
    //outf("解密数据的位置 %x \n", data);
    bin2str( result , data , 0x26);
    outf(" 三次数据 : \n%s\n" , result);
    ExceptionInfo->ContextRecord->Eax = 0x2FFFFFFF ;
    ExceptionInfo->ContextRecord->Esi = 30 ;
    ExceptionInfo->ContextRecord->Eip +=4;
  //  memcpy(data,path2,0x26);
    *(path2+0x16)-=1;
    //*g_point2 = 0x8B;
    setPoint(g_create_thread);
  ......

上传的附件 QQ图片20140616153435.jpg
QQ图片20140616180054.jpg

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

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

0 0 0 举报
复制成功