透明色 发表于 2014-6-16 18:45

*nf的***辅助的破解分析

好久没来发帖了 , 这几天在清理硬盘, 顺便就发一个 , 仅做交流 , 欢迎大牛指正

易语言写的辅助, 外壳是vmp的 , 打开之后界面如下:
http://bbs.pediy.com/attachment.php?attachmentid=90001&thumb=1&d=1402913758

使用好几个版本的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:      ; 二次包补丁地址
10034577       8B4408 14       mov eax,dword ptr ds:
1003457B       3D FFFFFF2F   cmp eax,0x2FFFFFFF
10034580       0F85 86000000   jnz mDll.1003460C
10034586       391D A0DF0810   cmp dword ptr ds:,ebx
1003458C       75 63         jnz short mDll.100345F1

其中这个esi 就是用户账户的剩余时间 ,eax 是一个识别码 ,只补丁寄存器就可以了

http://bbs.pediy.com/attachment.php?attachmentid=90002&thumb=1&d=1402913758
补丁第三组数据 , 程序显示剩余时间 , 可以运行了 , 但是 有几分钟 又会提示 失败.程序退出

除了第一个包之外 , 其它的都在 验证的线程里面 , 这种情况应该是验证线程sleep之后 , 再次进行验证导致的

这里笔者又偷懒了 , 使用xuter看一下线程, 有一个入口有 mlib.dll 里面的 很可疑 , 把它挂起 ,就可以了



实际的分析过程还是挺复杂的 , 分析记录写了不少 ,
有点意思的就是验证线程控制主线程的方式 ,猜测应该是 PostMessage自定义的消息来实现的, 使用api 跟踪发现 ,
   确实有一堆 0x600 以上的 消息 , 而windows的窗体的消息 一般都是 在0x400 以下的
实际跟踪一下 确实如此 , 具体没有再做分析

之后是写代码 ,使用dll注入, 第一个断点处 补丁数据 , 启动自己的线程 等待验证dll
载入, ,设置第二个断点 , 补丁数据之后 , 等几分钟把验证线程挂起 ,搞定

注意 :程序使用了动态基址 , dll载入的地址是可变的

帖一部分代码吧


LONG WINAPI VectoredHandler( PEXCEPTION_POINTERS ExceptionInfo)
{
static TCHARresult;
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);
......

心断空 发表于 2014-6-16 20:04

膜拜楼主是大牛

Passerby 发表于 2014-6-16 20:58

在追解密位置的地方 好像直接忽略了这部分 楼主求补

关键精华所在的技术 感觉心痒痒。{:301_992:}

Passerby 发表于 2014-6-16 21:02

我觉得找解码位置的方法 是用未解密的封包数据进行内存搜索找到后,下断往下走几段路

应该就到解码处不知道大牛我这个思路对嘛?

透明色 发表于 2014-8-10 23:24

本帖最后由 透明色 于 2014-8-10 23:26 编辑

Passerby 发表于 2014-6-16 21:02
我觉得找解码位置的方法 是用未解密的封包数据进行内存搜索找到后,下断往下走几段路

应该就到解码处不 ...
下条件断点 recv或者 recvfrom, 条件是数据的长度 . 之后 下硬件读写就可以了

这个程序主程序是 E 的 , 之前不懂易 , 所以看到它的反汇编 , 直接晕菜 , 最近几天玩了下易 , 如果是再搞的话 , 就不准备用补丁数据的方法了, 直接补丁汇编 就可以了 ,

很多网络验证, 通常是只加密 ,不混淆的 , 补丁数据是一种好方法{:1_926:}
页: [1]
查看完整版本: *nf的***辅助的破解分析