看雪2016 7

运行效果

动态调试程序,直接运行后触发异常

查看堆栈,在不远处找到SEH处理程序位置,并在函数内部下断

选择yes让程序来进行异常处理,然后会断在SEH内部。接着进行动态调试,直到找到关键代码处。

这里创建了4个线程,每个进去看一看,经测试,另外的线程是用来反调试的,要patch掉。在第一个函数下断,单步跟踪,首先输出了"请输入验证码",然后以另一个函数地址作为参数进行调用。

在这个被作为参数的函数内部下断,执行后什么都没发生。

继续单步跟踪,下面又会遇到主函数中遇到过的触发异常的函数

和之前类似,继续跟踪,又到了关键代码

经过动态分析,这里rdts指令用来反调试,可以轻松patch掉,sub_403DC4函数需要进行输入,check即是检验函数,点进去看看,都是一些全局变量的检查,必须分析之前的函数才能知道这些全局变量的变化情况了。

 

进入sub_40284B函数,大概是这么个意思

以我们输入的每个字节作为key对一段数据进行运行,进入加密函数内部

上半部分要求字符集为所有数字和字母,然后转换位一个数值

下半部分将这个数值累加到一个全局变量中,然后调用ch_num次next_step函数,最后反转ck1,但这些全局变量的初始值是什么呢?使用交叉引用,可以定位到初始化的地方

在initt函数中对两个全局变量进行了初始化,这里用到了博弈论的算法,本质上是取数和最大的问题

回到加密函数中,这里还留了一个next_step函数,逆向结果如下

整理一下得到的信息,首先外面一个大循环,每次取一个字符,将这个字符转换为数值,作为循环次数ch_num,执行next_step。即每次在同一方向取ch_num个数,然后var[0],var[1]交替着加入取的数,然后反转方向。结合验证函数,要求最后的结果和初始化中所求最大和与最小和相同。所以必须求得搜索路径,这是常规解法,或者对值进行穷举。

不过我的算法太渣,虽然算法本身不难,但由于每次取数会进行两次反转,不知道该咋求解。得去学习一个,再来实现这个过程。。。凉了

猜你喜欢

转载自blog.csdn.net/qq_35713009/article/details/86603748
今日推荐