Visual AssistX 10.9.2302分析练手记

Visual AssistX 10.9.2302分析练手记【附最绿色非替换和谐方案】

缘起

​ Visual AssistX是广大Windows平台下C++开发人员的必备辅助工具,从Visual Studio 6.0开始就我就开始使用这款插件工具,不知不觉这款工具就成了我在开发过程中不可或缺的工具之一,一直伴随至今。

Visual AssistX 10.9.2302分析练手记_第1张图片

大过年的,如果不出去玩,不参加聚会,其实是一个很好的看看书、思考人生,以及写代码的机会。由于近段时间VSCode用的比较多,Visual Studio相反好久没用也没更新了,想写个ShellCode框架(zaolunzi....)于是重新开启了VisualStudio,并升级到2015版本。看了一眼VAX,好久没更新了,于是更新到了最新版本,结果试用到期,然后就有了这篇文章。

分析思路及过程

一般来说,破解的过程其实就是根据线索按图索骥的过程,这跟探案(没有探过,就模仿侦探小说里的感觉吧)有点像,首先看下,Visual Assist给出的线索是什么

Visual AssistX 10.9.2302分析练手记_第2张图片Visual AssistX 10.9.2302分析练手记_第3张图片

弹了一个窗体,提示试用到期,要注册码注册,Cancel后又弹出一个MessageBox样的东西。看到窗体就想到如下API(自行脑补:A/W or Ex):DialogBoxParam、CreateDialogParam、CreateDialogIndirectParam,甚至是CreateWindow,看到MessageBox呢,就不用多说了,常规思路马上下个断点瞅瞅看,注意这个断点一般思路都是在API函数头,但是其实很多时候,设置到函数尾效果更好,比如我就设置在ret处。第一个用到技巧就是栈回溯,回溯的思想其实就是一个类似倒带找线索的过程。在这个过程中,如果程序逻辑比较简单,单单用OD回溯就可以了,如果逻辑比较复杂,分支较多,那么这个时候可以采用动静结合(即:利用OD动态跟踪验证猜想,用IDA静态分析搞清楚逻辑关系)的分析方法。

Visual AssistX 10.9.2302分析练手记_第4张图片

很容易就断下来了,一步一步回溯,找到在VA_X.dll中调用出这个提示框的CALL。

Visual AssistX 10.9.2302分析练手记_第5张图片

看到上面有两个跳转指令:JE,可以试试能否直接跳走是否有效,考虑到应该没这么简单就没测试,拿出IDA看下这个部分的逻辑代码再说,结果,竟然找不到映射区域,看来,这段代码是动态释放出来的。

Visual AssistX 10.9.2302分析练手记_第6张图片

遇到这种情况,大概率就猜想代码做了类似:混淆、加密、压缩等处理手段,不过不论如何,目前在内存里面的代码还是可读性比较好的,那么就简单了,让它展开后DUMP出来即可,这个时候,OD自带的工具各种掉链子,还是用Scylla靠谱,抓到DUMP,这下就对的上了。

Visual AssistX 10.9.2302分析练手记_第7张图片

使用X看下有哪个Call调用这个,同时看下OD的栈上,看是从具体哪个Call调用过来的,回溯一层后,发现了这个有趣的地方:

Visual AssistX 10.9.2302分析练手记_第8张图片

这里有个JE条转指令,让EnableWindow还有设置Active的都不生效,这可能就是失效后,VA组建全部都灰的原因吧(我猜,也没测试这里),同时还看到这个堆栈穿参里面的提示语,感觉快到地方了,咱们继续跟。

Visual AssistX 10.9.2302分析练手记_第9张图片

继续跟,往前走,发现是在函数sub_1F2BEF20里面调用的,此函数还挺长,还是用IDA分析偷个懒,F5看下程序逻辑吧:

Visual AssistX 10.9.2302分析练手记_第10张图片

Visual AssistX 10.9.2302分析练手记_第11张图片

Okay,已经确认这个框就是由这个函数弹出来的,另外第二个MessageBox亦是如此。这个时候,如果对注册算法感兴趣的话就可以看下弹出注册码错误的相关调用了,这里就不跟了,先看下调用此函数的函数在哪儿,继续往前走,让栈回溯,原来是这里,如下图。

Visual AssistX 10.9.2302分析练手记_第12张图片

还能看到试用的License,感觉希望就在眼前啊,再看看这个是隶属于哪个函数体里的,往上翻一翻,原来是这个,sub_1f2c5c90,又是一个好长的函数,赶紧用IDA瞅瞅看,嗯,关键点就在这里了(不细说了,按照文章跟到这里的童鞋自然知道,对伸手党SayNo)。看完这个函数的逻辑后,发现一个跳转就可以解决问题了。于是手工改下,发现有效。那就做一个简单内存补丁吧。

解决方案

做内存补丁方法挺多的,如果有代码洁癖的话,DLL劫持貌似是一个很不错的方式,静态上不修改任何原始文件,只用放到同级目录下即可,有好多模块都可以做这种劫持,我看msimg32.dll挺顺眼,就用这个吧。

Visual AssistX 10.9.2302分析练手记_第13张图片

Visual AssistX 10.9.2302分析练手记_第14张图片

下载链接:https://download.csdn.net/download/albertli/10950204

你可能感兴趣的:(逆向C++)