吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 8441|回复: 48

[原创逆向图文] 某个qr的dll的分析

  [复制链接]
hktkzyz 发表于 2017-3-25 16:36 | 显示全部楼层 |阅读模式

本帖最后由 hktkzyz 于 2017-3-27 18:08 编辑

首先的首先,我了解和学习逆向是从恒大那里学来的,这就够了,我对恒大最大的支持。
首先的其次,真是好久不来论坛了,连到也没签,因为忙太多家里的事情。而且确实也没有学习和研究分析相关的问题,表示有点尴尬。

ok,最近看别人的二维码软件,就自己也写了一个。当然我知道,网络上太多免费的了,咱这不也是为了学习一下嘛。所以别笑话me。
找了一个例子,发现调用的dll原来是某个公司的demo,据我了解,qr的二维码应该是公布源码的吧。他应该最多也只是重新写了一下函数,使更方便调用。这样就拿来卖钱?不过这是人家的事,we do not care。而且没有人家这个demo,很多人也还可能不知道具体怎么写。
先说说demo的dll,出来的二维码2个特征,1是内容text最后多出来MW6 Demo字样,当然二维码也是相应的变化。2是二维码上图案上有MW6 Demo字样。
再说说网上逆向的,有个重要函数QRGetActualSize功能失效,看名字就知道这个函数的目的是得到二维码图案的尺寸,这样你才能够设置合适的二维码尺寸。所以他这个功能失效后,只能用判断像素的方法(从白底里找黑色的像素,左上角,右下角,循环找像素,效率自然可想而知)来确定二维码图案的尺寸。另外他导出矢量的功能我好想忘了有没有,咱不说了。
最后说说,真的好久不弄这个了,很多东西都忘了,之所以发这个过程,其实也是想帮自己回忆一下这方面知识。有啥说的不对不准确的地方,希望大家指出来,互相交流才能进步。

好吧,进入正题:忘了说了,没壳,高手请绕过
游客,如果您要查看本帖隐藏内容请回复

QQ图片20170325163035.png     19.png
再看看修改过的 原1.    ok,2个问题都解决了。真的以为就over了吗,如果这么简单,我也就不会再来复习od怎么用了。我的神呀,花了2天时间才回忆起部分功能怎么用。
转入正题,我们来复制一下结果或导出一下结果,先用位图方式ok没问题。Then我们用矢量试试,
336.png

问题出来了。我复制矢量,粘贴到写字板,结果是www.b。聪明的你大概能得出结论吧。位图格式没问题,矢量有问题,问题就是少了8个字福,为什么是8个,大家数数,aidu.com正好8个,那么还有哪个是8个呢?MW6 Demo,是的,就是他。表示逆向不完整。这就是我之前说的要注意一下取文本长度这个函数。
好了今天先到这里吧,一会下班要去看孩子。下次说说处理那少字符串的问题。

-----分割线,下面是第二天-----

前言
1、感谢恒大的鼓励和大家的阅读,是我继续学习和完成的动力。
2、抱歉周日没开电脑,在家陪孩子,今天补上。
3、上次忘了把软件和dll附件,今天补上,软件是我的,dll我发的demo原版,所以没有任何问题。如要使用的,您自己或按我的去分析就好。不希望直接拿去使用。

4、纠正上次写的一个错误。上次说第一个找到的关键字串那里(地址是10003BE0,子程序入口是10003BD0),可以无视,是不对的。因为他是来自两个调用,QRRender+255这个说了可以无视。但10003ECD这里没说。我们ctrl+g10003ECD,向上找是哪个子程序调用的,发现是10003CA0,也就是QRCopyToClipboard+63,QRSaveAsWMF+0D2, QRSaveAsBMP上次说的这3个函数都要调用的子程序这里。这就说通了,3个主要函数调用10003CA0这个子程序,然后先给他附加上demo的字符串,然后用gdi进行绘制,再然后到10003ECD call调用 10003BD0这个子程序,而根据上次的分析(这里面函数很多是setbkcolor settextalign settextcolor这些,一看就知道是文本颜色对齐什么的)可以印证,这里就是在图片上来加MW6 demo字样的。
正文:

1、上次说道lstrcatA函数这里,我们处理了1000EB84这里的字串(Mw6 Demo),然后发现图片和扫描结果中都没有demo字样了。实际上我们处理的是“添加字串”这个问题,因为我们修改的内存所以图片中的字样也解决了(可以证明他是用的同一个常量字串,也就是内存中1000EB84这里)。现在重新载入原dll。搜索MW6 Demo字样,一共6个,上次我们分析到第2个,然后看第3个,为了不耽误时间,定位后,我看子程序的头一句(到底该叫什么呢),在提示窗口看到这是QRRENDER函数的入口,上次说过,这个函数不知道该怎么用,有知道的谢谢告诉我一下。所以这里再次不管他了。
2、再看第4个找到的字串。地址在10004d89,我们看到也是个lstrcatA函数,看来作者是使用同一方法来demo。先看下前后函数,上面是一个gdi的(大家都知道啥意思吧,咱不管他),下面是一个lstrlenA取字串长度的,上次说过,这两个函数要着重看一下(lstrcatA附加字串,因为demo的就是多出了demo字样;lstrlenA取长度,因为上次说过,制作的矢量二维码缺少字串)ok。我们再看这个子程序的入口,提示来自QRgetactualsize,有印象吧,是的,上次说过,见过一个有问题的逆向,就是这个函数不管用了(获取的尺寸都是0)。导致制作二维码时需要采用循环像素的方法来确定大小尺寸(如果不让客户设置前景色背景色还好,也就是只有黑白还好,那样判断颜色就方便,如果让客户设置前景色背景色,那后续的像素循环判断,麻烦可想而知)。好了废话不说了,先记住这里,我们还是先去找矢量生成错误的问题。(这里就又涉及到一个习惯,我们在一个处理问题的路途上,突然发现了另外一个问题,该怎么办?我个人习惯,如果这个问题不足以影响我之前的问题,那么我先记下它,先去处理原本的问题,回头再返回来看他。如果认为他对于你之前的问题起着决定性的作用,比如本来你要找水喝来解渴,然后找水路上,发现这里立着一个牌子说,前方的路上已经没有水了,您需要换条路买个冰糕来解渴,这时就没必要非去找水了,好吧,比喻不太形象。)
3、再看第5个找到的字串。可以看到如出一辙。我也知道我有些啰嗦了,所以,这里不说了,至于这个函数QRgetactualrc我也不懂怎么用,参数是一个行、一个列。这个函数不知道该怎么用,有知道的谢谢告诉我一下。所以这里再次不管他了。
4、再看第6个找到的字串。同上。函数时QRGetPatternData,这个函数不知道该怎么用,有知道的谢谢告诉我一下。所以这里再次不管他了。
5、好了,看来所有的关键字后我们发现,并没有涉及到导出矢量这里直接相关的,唯一能发现的是:1)确实有取文本长度的函数,2)导出bmp和导出矢量和复制矢量在同一个函数里,而且还有有附加字串和图片添加文本的过程。3)、导出bmp没事,但矢量就有问题。
那么可能问题出现在:1)、导出矢量和复制矢量,在调用10003CA0这个过程之前的代码中。2)、就在10003CA0这个过程中,只是导出bmp没有涉及到。
好了,我不罗嗦在去分析第一种可能所涉及到的代码了(其实我开始确实以为是在这些代码里,要不为嘛导出bmp没事,可是结果看了好久没看出什么来)。我们返回来再仔细看10003CA0这个过程。在作者处理完10003ECD(在图片上加字串)这个过程后,往后看,有好多未知的跳转,虽可疑,但不大,先继续看,哈,看到了吧,第一个函数就是lstrlenA.

                               
登录/注册后可看大图
后面接着的函数是设置文本对齐颜色什么的,怎么和图片那个加字串有点像呢,我也不知道(回头调试看看)。Call上是一个je跳转。接下来怎么做都知道了,不过我想说的是,先看看这个call。首先,10003fbftest eaxeax,注意下面说的我自己也不是很完全肯定,说的不准确您给指出:
调试时,此时eax的值为1Test来测试寄存器eax的值,test其实是逻辑位与运算,也就是add1add1结果为1ZF(Zero Flag)零标志,当运算结果为0时置1,否则置0。我们结果为1,则zf0zf0时,不相等就跳转,即jnz的话就跳转。不熟悉的朋友就记住test1,1就会jnz跳,je不跳。Test00就是je去跳,jne不跳。
所以我们这里je就不会跳转,因此执行下面的代码。即lstrlena函数。先把参数100138E4压入,现在我们看到的是一个空字符穿,推测没错的话,他应该就是我们要制作二维码的字符串,然后计算出这个长度。10003FC8没看懂,知道的告诉一下。然后把100138E4movecx,然后 sub ecx 8ok。如果认识这个英语单词subtraction,就清楚了。所以说老外学编程真的很容易。从ecx里减8.也就是原字符串长度减8,所以一切都清楚了。你可以改eax的值为0,或者je改为jne,或者8改为0.然后我们测试。我们用上次修改过的“原1”改,保存成“原2”。测试。

                               
登录/注册后可看大图

Ok。矢量的内容内容不少了。
不知不觉一上午过去了,好吧我效率太低。昨天看walkingdead看到3点了。我就想不明白,为啥这个剧评分那么高,我觉得编剧弱爆了,里面的行为和思路都太多不合理,节奏也慢。而且也没有一个好看的女主,还有里面的婴儿居然用过假人来代替,而且镜头那么明显,忘了哪一集,美剧里出现这种镜头我笑了半天。Amc要不是弄这么一个好题材,我觉得都永远不会认识这个电视台。我看这个剧的唯一理由就是想知道为何评分高,但是题材确实好,hbo应该来拍一个。
好了扯多了。做到这一步后,我们做二维码,内容不断的累加,比如1111…..,发现到后来二维码尺寸会超出我的图片框。经过测试,QRgetactualsize函数并没有失效,只是随着内容的变化,有时候不准确,下一步进行研究,弄好了贴出来。当然大家已经知道了,在上面分析的第2点中,我们提到了这个函数的过程其中也有lstrcatA函数和lstrlenA函数,所以您也分析一下,看能不能解决。

QR 二维码识别制作.zip (438.75 KB, 下载次数: 2)

QRen.zip (34.02 KB, 下载次数: 3)


-----分割线,下面是第二天的下午,分析尺寸出错问题-----
1、大家用那个“原2”测试,输入第33个“1”的时候,图片尺寸就出问题了。
11出问题.png
如图。ok。上面也说了,问题出在这个函数QRgetactualsize,这次需要我们调试一下这个dll,你不调试也可以,我只是想说一下调试的方法。我们把“原2”放进od,提示要启动loaddll,确定。运行。进入模块的入口。od下方会提示“初始化结束。”菜单里:调试--》调用dll输出--》,我们看到了这个dll的所有的函数,选择QRgetactualsize,然后反汇编窗口中跟随(其实自动就跟随到这里了),断点,调用。这样就给这个dll的这个QRgetactualsize函数的入口断下了。关闭后我们用f8来调试。
6.png 8.png
调试前,先大概看一眼,无关的我们就不去f8,直接f4到怀疑的地方,我们看到前面几个函数都是gdi的,然后就遇到了lstrcatA附加字串,也就是那个demo,其实在第一次修改文件数据的时候(删除1000EB84 里的“MW6 Demo”),我们也看到了他下面还有一个MW6 Demo,位置是1000EB94,我们并没有理会,因为当时不删除这个并不受影响(其实如果删了,那生成出来的二维码就缺了8个字符)。ok,那我们知道了1000EB94位置的这个“MW6 Demo”是和QRgetactualsize这个相关的。我们也清除他或跳过他(我用清除。)其实你也可以看到lstrcata的第一个参数100138E4,熟悉吗,看之前发的内容,你会找到他的。对了,就是你要制作二维码的真正字串。是内存中的一个变量。
再往下看,“test al, al”      , test之前说过了,不再说了。al是什么,主要是给像我一样的新手讲一下。al是eax的低八位,即后2位,同样cl就是ecx里的低8位,寄存器窗口里的这些xxx都是32位的寄存器,顺序从左往右为 高位到低位。此时eax的后2位不为0,test 非0 非0,结果就为非0,则zf置0,则jne就会跳,所以10004f4e这里的jnz实现了跳转,那么这个里面的lstrlenA函数就没有起作用,同样下面的sub ecx 8,都没有起作用。所以这里不用改。
接着往下调试的时候,到达10004e35后,程序会跳到别的领空,然后再调试就会出错。原理我也不知道,知道的说一下。
9.png
但不管怎么样,10004f57这里我们又看到了熟悉的面孔。推测这个je依旧不能跳转,所以把下面的 sub edx 8 (-8)改为0,ok。保存一个进行测试吧。
999.png
结束语:
1、首先抱歉我的语言组织能力有些差,啰啰嗦嗦,我也知道,经常是自己知道想什么,但是表达出来可能会变点,希望您能看不明白的时候多看看,实在不行咱就留言。
2、其次这个例子当然是个简单的例子,大牛们看不上的,我的想法是让更多和我水平相仿的朋友能够获得些我经验,我就非常高兴了。
3、还是那句话,交流学习,共同进步,在获取知识的过程中收获快乐。写这个例子其实也是我收货很多。不明白之处尽管畅言。说的不对不准确的地方尽管批评指出。
777.png

评分

参与人数 24威望 +1 HB +57 THX +14 收起 理由
禽大师 + 1
longge188 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
sjtkxy + 1 + 1
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
attackmyth + 2 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
一路走来不容易 + 1
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
消逝的过去 + 1
叶落花开 + 2
hnymsh + 2
bnjzzheng + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
lies + 1
爱解码 + 1
wswwj + 3 + 1 [快捷评语] - 2017,让我们17学破解!
wpsys + 1 + 1 [快捷评语] - 分享精神,是最值得尊敬的!
lx211823654 + 2 + 1 [快捷评语] - 2017,让我们17学破解!
米其林轮胎 + 2 + 1 楼主是真的用心教思路的,大家好好学学吧
wangxp + 1 + 1 [快捷评语] - 2017,让我们17学破解!
理事长 + 1 [快捷评语] - 2017,让我们17学破解!
半世浮华 + 1 [快捷评语] - 分享精神,是最值得尊敬的!
逍遥枷锁 + 2 + 1 [快捷评语] - 2017,让我们17学破解!
守护神艾丽莎 + 1 + 1 [快捷评语] - 分享精神,是最值得尊敬的!
开始学习ing + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
Shark恒 + 1 + 30 + 1 很喜欢你的教程风格,精华不在于技术是否高深,只要讲解细致、流畅,即为精华!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Shark恒 发表于 2017-3-25 18:27 | 显示全部楼层

建议大家跟着楼主的思路好好读完这篇图文教程,应该可以让很多人对“分析”二字有更深的理解。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
jackwolail 发表于 2017-3-25 20:41 来自手机端 | 显示全部楼层

好好学习,天天向上
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
爱阴湿毯 发表于 2017-3-26 07:21 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
1786363325 发表于 2017-3-26 07:53 | 显示全部楼层

好好学习,天天向上
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
风云神龙 发表于 2017-3-26 08:06 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
开始学习ing 发表于 2017-3-26 11:08 | 显示全部楼层

感谢   ,我看了看    谁然看不懂                           
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
LYQingYe 发表于 2017-3-26 16:11 | 显示全部楼层

mark 看下
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Falsse 发表于 2017-3-26 17:19 | 显示全部楼层

必须看啊  
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
wnder 发表于 2017-3-26 17:55 | 显示全部楼层

好好学习,谢谢分享!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表