-
-
[原创]CM分析
-
发表于: 2016-11-2 10:56 2583
-
由于比较忙,写的比较简短 将大概流程说下吧
使用的工具是OD与IDA
追码的时间比较长,因为他设计了许多函数来对字符串做了些处理,同时本人能力也有限,读的过程比较慢。
首先打开程序直接结束,下ExitProcess断点,追到关键跳部分处有je跳,将其nop,保存文件后程序正常执行,然后输入假码下GetWindowTextW断点,单步走时发现程序起了一个可疑的线程,不管线程的执行,单步走,发现取了假码的长度,然后字符串需要有p,b这两个字符,否则提示失败。而且字符串长度6时提示太短,7时提示太长。然后搜索字符串发现oh,good,congratulations!字符串是通过SendMessage函数发送的
消息传递的参数应该为40B,于是我猜测真正的验证在刚才起的线程里验证,然后逆向分析了整个函数,简短说下程序思路,首先malloc了一个数组1~9,还有a~z,然后将a~z -32转换成大写A~Z
接下来将假码第3~6共4个做一次比较,然后把假码的字母部分全部改成大写。我通过改内存值得到3~6的15PB,然后将输入错误次数作为参数,用strcpy(1~9,假码[已输入错的次数])进行拼接,在执行比较时我改动了内存的值来强行比较成功,中间其实它有部分判断(比如拿假码最后一个字符串的UNICODE的最后一位来进行运算),调向失败的我都改了标志位跳过去了,只是到关键比较那里改动内存的值。得到了第1,2位的值应该是1,2,最后的字符串值应该是8 ,然后输入1215PB8发现失败了,原来是忘记把PB改成小写的了(因为中间有转换成大写,而且一开始是判断有没有pb这2个小写字符),于是重启程序改成1215pb8成功。由于这个程序通过输入次数来获取注册码,所以每次分析出错都要重载程序来重新追码,这也是作者拉长时间线的一个思路吧
这CM是昨天做的,今天才写解析,因为比较忙的问题,挺多函数的分析流程都没写,而且也有部分函数我是遗忘的了(因为写此分析时全靠记忆写的),就只能写的比较简短了。
使用的工具是OD与IDA
追码的时间比较长,因为他设计了许多函数来对字符串做了些处理,同时本人能力也有限,读的过程比较慢。
首先打开程序直接结束,下ExitProcess断点,追到关键跳部分处有je跳,将其nop,保存文件后程序正常执行,然后输入假码下GetWindowTextW断点,单步走时发现程序起了一个可疑的线程,不管线程的执行,单步走,发现取了假码的长度,然后字符串需要有p,b这两个字符,否则提示失败。而且字符串长度6时提示太短,7时提示太长。然后搜索字符串发现oh,good,congratulations!字符串是通过SendMessage函数发送的
消息传递的参数应该为40B,于是我猜测真正的验证在刚才起的线程里验证,然后逆向分析了整个函数,简短说下程序思路,首先malloc了一个数组1~9,还有a~z,然后将a~z -32转换成大写A~Z
接下来将假码第3~6共4个做一次比较,然后把假码的字母部分全部改成大写。我通过改内存值得到3~6的15PB,然后将输入错误次数作为参数,用strcpy(1~9,假码[已输入错的次数])进行拼接,在执行比较时我改动了内存的值来强行比较成功,中间其实它有部分判断(比如拿假码最后一个字符串的UNICODE的最后一位来进行运算),调向失败的我都改了标志位跳过去了,只是到关键比较那里改动内存的值。得到了第1,2位的值应该是1,2,最后的字符串值应该是8 ,然后输入1215PB8发现失败了,原来是忘记把PB改成小写的了(因为中间有转换成大写,而且一开始是判断有没有pb这2个小写字符),于是重启程序改成1215pb8成功。由于这个程序通过输入次数来获取注册码,所以每次分析出错都要重载程序来重新追码,这也是作者拉长时间线的一个思路吧
这CM是昨天做的,今天才写解析,因为比较忙的问题,挺多函数的分析流程都没写,而且也有部分函数我是遗忘的了(因为写此分析时全靠记忆写的),就只能写的比较简短了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
看原图
赞赏
雪币:
留言: