好久没来发帖了 , 这几天在清理硬盘, 顺便就发一个 , 仅做交流 , 欢迎大牛指正
易语言写的辅助, 外壳是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);
......
|