逆向分析之定位算法的一些经验

当开始逆向分析一个300M的图像处理软件的一个功能时,才发现之前玩逆向都是小打小闹,一个多月的奋斗,终于搞定了。很希望遇到问题,因为这样才能学到新的东西,事实上确实遇到了不少问题,也学到了很多经验。

之前的逆向都是直接扔到OD就开始调试,而现在知道在虚拟机里运行,因为这么大的软件不是一两个小时就可以搞完的,在虚拟机里直接快照拍摄,就像游戏存档一样,这样可以避免每次运行软件的注册激活,避免重复之前的分析,避免内存地址动态变化等等,好处多多。

分析算法的难点之一是定位核心算法。对于有软件保护的软件就更困难了,我分析的这个软件反调试只有一个IsDebugPresent,OD插件轻松绕过。幸好没有虚拟化保护,要不然结果可能就不一样了。

既然是图片处理功能,有两个思路,一是通过跟踪图片数据找到核心算法,二是通过几个影响算法的参数找到核心算法。我一开始选择跟踪图片数据定位核心算法,在CreateFile、ReadFile上下断点,但是没找到,之后改变方法,通过定位参数来找核心算法,一路跟踪从资源文件中读到的参数,但是经过几次传递,最后却跟丢了,设了各种断点,可是都断不下来。最后又用跟踪图片数据的方法,用软件processmonitor辅助,还是下ReadFile的断点,找到了图片数据,一路跟踪图片数据,发现又跟丢了,只得到一处存储着处理结果的图片数据,找不到原图的数据,在主线程里设各种断点,都断不下来。几乎都要放弃的时候,抱着试试看的态度,在每个子线程中都下了断点,终于是断了下来。

这涉及到多线程的资源共享问题,多线程中每个子线程的栈是私有的,堆是公有的,不过可以有私有堆,寄存器也是私有的!之前对这个问题有误解,就一组寄存器怎么会是私有的呢?原来每个子线程都有自己的一组寄存器副本,每当切换线程时,寄存器都是会发生改变的,而设硬件断点就是在drx寄存器中存入目标的地址,这个drx寄存器应该只是当前线程的寄存器副本,因此这个硬件断点只在当前线程有效,当其它线程访问目标时,该硬件断点是不会触发的,这就是我之前在主线程中设断点怎么都断不下来的原因了。

断下来的这个线程是所有线程中(除主线程)运行时间最长的。但是想找到原始图片数据还是没做到。处理的算法是在子线程中执行的,通过在结果图片数据上设断点,一步一步逆向地向前推,直到分析完所有参与运算的代码。核心算法找到了,分析算法就相对简单的多了,不过涉及很多SSE扩展指令,用到xmm0-xmm7寄存器,而OD并不会显示这些寄存器的内容,分析起来十分痛苦,虽然WINDBG可以显示这些寄存器内容,但是用WINDBG分析起来同样痛苦。还好旁边的大牛帮忙写了一个插件,用着插件感觉好多了,大家有需要可以问我要。

时间: 2024-08-01 00:42:50

逆向分析之定位算法的一些经验的相关文章

Wish App逆向分析app_device_id字段生成算法

概述 本文对Wish App进行了反编译,对应用中app_device_id字段的生成算法进行了逆向分析. 使用到的工具有: 1. Apktool:获取资源文件和smali 反汇编代码 2. dex2jar:反编译apk,将其中的classes.dex转化成jar文件 3. jd-gui:打开jar文件,查看java源码 反编译环境:mac osx apk反编译获得java代码和smali反汇编代码 1. 从google play下载Wish.apk 2. 使用dex2jar把apk解包,将其中

定位算法及算法导论小结

一.电子围栏定位算法: 还是决定不做定位算法了,原因有下: 1.文献[1]中利用线性算法解决了TDOA问题(四个观测点以上),文献[2]中将AOA算法的形式也纳入进来.多个直线的交点就是待测点的位置.如果考虑单点是否在围栏内部,之前做的假设是,定位单点的算法复杂度高,但这两篇文献中说明的是:理论上是线性的,很简单.根据四个及以上观测量可将问题变成线性问题求解的后续扩展思路是,1结合新的应用场景和实际数据,得到算法应用的结果测试,像文献[3]就在车联网中应用了这个定位算法,但是实测数据我现在很难拿

TI(德州仪器) TMS320C674x逆向分析之一

一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地方,后面再慢慢修改. 二.正向开发流程 C语言开发,开发工具使用CCS(Code Composer Studio,基于eclipse开发的),有过开发经验的都会很容易上手,新建test工程,选择C674x,输出文件为ELF格式,如图所示: 编译成功后,会生成test.out文件(ELF格式). 使用

病毒木马查杀实战第016篇:U盘病毒之逆向分析

       本系列教程版权归"i春秋"所有,转载请标明出处.        本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 比对脱壳前后的程序 我们这次所要研究的是经过上次的脱壳操作之后,所获取的无壳病毒样本.其实我们这里可以先进行一下对比,看看有壳与无壳的反汇编代码的区别.首先用IDA Pro载入原始病毒样本: 图1 可以发现此时IDA Pro的Functionwindow是空的,说明很多函数没能解析出来,并且还无法切换到图形模式,而图

自制反汇编逆向分析工具 迭代第五版本 (一)

这个版本添加了几个功能,分开几篇来写. 本篇是关于这样一个功能,显示选定的条件指令与其它条件分支的关系. 它们的关系分别在初版分支形态分布图,和第二版的汇编代码对应图同样展示. 红色表示被选中的目标 蓝色表示被选定的指令的执行位置之前,可能因为条件跳转而直接跳入到被选中的条件分支内(,忽略该条件判断). 绿色表示在被选中的条件分支内,因为其它条件跳转而直接离开目前分支的代码. 紫色表示在被选中的条件分支内,无条件跳转分支并且直接离开目前分支的代码. 浅紫色表示在被选中的条件分支内,无条件跳转分支

“金山杯2007逆向分析挑战赛”第一阶段第一题分析

题目来自于如下网址: http://www.pediy.com/kssd/ 第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第一题 \ 题目 \ [第一阶段 第一题]: 现将此题目概述粘贴如下: CrackMe.exe 是一个简单的注册程序,见附件,请写一个注册机: 要求: 1. 注册机是KeyGen,不是内存注册机或文件Patch 2. 注册机可以使用ASM,VC,BC,VB,Delphi等语言书写,其他谢绝使用. 3. 注册机必须可以运行在Windows系统上. ..

Android逆向分析之Xposed的hook技术

Android逆向工程里常用到的工具除了的dex2jar,jd-gui,  Apktool之外还有一个Xposed. 这个工具是一个在不修改APK的情况下,影响其运行过程的服务框架.可以根据自己的需求编写模块,让模块控制目标应用的运行. 因为本人也是新手,对于Xposed用法还有很多的不熟悉,所以只对其hook技术进行简单的介绍,并让hook技术应用到以后的逆向分析工程中. 至于什么是hook,不了解的话就先去百度一下,这里基于菜鸟有限的经验,我只能说是一种函数拦截技术~ 首先,下载Xposed

自制反汇编逆向分析工具 迭代第四版本

上一个版本,本工具支持的第一个逆向策略,(对反汇编的函数体内的分支控制结构逆向生成cpp代码,)一直都可以正常工作,直到遇上了一个函数.这个使我的逆向策略算法失效的函数,主要的特点是它含有众多无条件跳转指令(,都是在函数体内的跳转). 为什么无条件跳转指令会使得我的第一个逆向算法失效,因为这些无条件跳转指令让函数的执行流变得不易于线性理解. 在一个没有反汇编出来的函数汇编代码中,如果无条件跳转指令很少,特殊地连一条无条件跳转指令也没有时,将汇编代码的执行流当作行文阅读,总可以找到一个特例让所有条

[CLPR] 定位算法中常见的几种思路

一. 引言 如何从一副图片中找到车牌? 这是机器视觉的一个应用. 理所当然地, 思考的角度是从车牌本身的信息入手, 为了讨论方便, 下面均以长窄型蓝白车牌为例. 下图就是这样一张车牌的基本信息. 一眼看过去, 可以得到的信息有: 长宽比 - 3.14, 字符数 - 7, 第一个字符是汉字, 第二个字符是字母, 之后为5个字母/数字混合等距排列. 同时还可以大致了解到, 一个清晰的车牌应该拥有足够多的边缘信息, 换句话说, 边缘信息足够密集地聚集在一个3.14:1的矩形中. 所以今天介绍的算法,