yaoyao7 发表于 2019-1-15 18:26

逆向工程核心原理样例程序调试手记

本帖最后由 yaoyao7 于 2019-1-16 08:54 编辑

今天开始重新看一遍《逆向工程核心原理》这本书,对书中的样例程序进行逆向分析,做一个简单的手记。
1,首先运行程序看看:

一个简单的验证程序,随便输入一个Name和Serial:

(有提示消息,还是消息框,说不定后面有可能用到。先留意一下,根据具体调试情况再说)

2,OD打开

OD自动定位位置,从代码中可以很明显看出这是一个VB程序(VB的汇编特征就不说了吧2333)
3,因为运行程序的时候有提示消息,先看一下程序中的字符串:

看到了可能的判断位置的字符串,跳过去

跳到字符串出现位置,发现了关键语句:VB的一个字符串判断语句,而且有一个条件转移语句
这里是调用__vbaVarTstEq()函数,比较返回值后,再由JE决定执行哪里的代码。
4,既然3中找到了__vbaVarTstEq()函数,那么它的参数肯定是在它被调用之前就已经传入了,而传入的参数应该是我们输入的字符串和经过处理的字符串,
向上找:

在函数调用上面,直接看到了两个入栈操作,推测就是__vbaVarTstEq()函数的需要的两个字符串
进入dump中查看相应的数据:

OK,找到了我们输入的serial和经过处理后的serial。
(这里需要用Address with ASCII dump来查看dump中的数据才能看到)
5,测试一下:

搞定!
(这也太简单了?!!没错,我们只是从内存中找到了明文,但是没有弄清楚处理过程。所以,接下来尝试搞定serial的处理方法:)
首先我们确定一下思路:程序需要我们输入Name和Serial,然后点击check按钮,那么点击check按钮之后就是对我们输入的字符串进行了处理和对比。
一般情况下,处理方法的一种是利用name数据进行serial生成,然后做对比。
而且,我们在输入name的时候,必须大于4个字符,这是不是也说明了什么呢?留意一下~
1,运行程序,输入name和serial后,回到OD:

程序断下,这就是check需要执行的操作。
往下翻翻,应该会有字符串相关的操作:

果然,发现了字符串存储位置,而CALL    DWORD PTR DS:则用于获取Name。
2,继续调试,发现了一个循环:

这里用EBX作为循环计数器,而且只有4次,证实了我们的猜测,serial与name是相关的,用于循环进行字符处理
看循环体:


3,循环体内部执行的就是字符串处理操作:

程序读入name的第一个字符,然后利用rtcAnsiValueBstr函数将字符转换为ASCII码进行保存

以此将name中的字符转换为ASCII码,然后加上64,然后再转换为unicode字符,所得结果就是处理之后的serial,一共取name的前四位字符进行操作。

程序很简单,调试过程也比较简单,但是感觉对于新手来说能很快地找到感觉,熟悉一下调试逆向的流程,感觉还是不错的。
顺便说下,掌握常见的程序语言的汇编形式还有常见的验证机制很重要,可以很大程度上找到逆向的切入点,也能提高调试效率。
继续学习吧~

yaoyao7 发表于 2019-1-15 18:44

传不了图了,到限制了,明天再修改完善,,,尴尬了

LVSHUO 发表于 2019-1-15 19:23

学习一下啦

暮寒 发表于 2019-1-15 21:27

感谢楼主的总结

翻书风 发表于 2019-1-15 21:35

学习一下

SHIWULUOLI 发表于 2019-1-15 22:27

虽然不看不懂,但是不妨碍我学习

清风笑竟若寂寥 发表于 2019-1-15 22:57

感谢楼主的分享

haoii123 发表于 2019-1-16 09:28

感谢楼主的分享

会成功的人 发表于 2019-1-16 11:17

感谢楼主的分享

dafs 发表于 2019-1-16 12:15

学习学习
页: [1] 2
查看完整版本: 逆向工程核心原理样例程序调试手记