先说一下,这个东西我没完全搞出来,就差最后一步,后面看弄出来了再加进来。这个程序几乎不符合任何开发原则,用户很难使用,而且还缺文件,所以这就是一个为出题而出题的程序罢了,需要开脑洞,我们需要学的仅仅是分析和猜测这些疑难杂症的能力而已。
程序本体
就长这样,没有任何别的信息了,所以我们直接拉PEiD看信息
脱壳
这里有一个壳,UPX的原理其实就是压缩程序后再执行程序的时候先解压再执行,所以程序必定是压缩的,ida静态分析不合适,什么都看不到,因此使用dbg。
既然是可以使用PEiD自带的插件来脱壳,但是会出现找不到程序入口点的错误,这里需要修复。所以我们手动脱一下,根据信息运行到程序入口点为止。这里程序必须要先解压,壳的入口和出口一般是pushad和popad,总之在已知有壳的情况下,看到开始程序有不认识的出入口就去百度,脱壳有个简单的esp方法,因为esp指向栈顶,同时也是低地址,直接设定物理断点,必然在壳出栈后指向正常程序的开头
在内存窗口根据esp下低地址物理断点,然后f9到断点,第一个jmp上方就是popad
壳在这里结束,下方就是解压的程序,现在试一试,应该能查到“注册”了
然后我们要将现在这帮东西给dump出来,dump是保留现有的整个程序架构,并不是壳不存在了,而是壳现在无法对已经解压的程序起任何作用,程序本身是完整的,有全新的入口。再往下面走一步,到真正的入口然后dump
这时dump出来的程序需要修复一下,否则仍然无法找到入口。
OK,脱壳结束,现在可以进行分析了,Delphi程序,老样子,准备好darkde。
这里明显看到,有个edit2,但是我们打开程序没有,说明我们首先需要还原这个。
首先,我们还是从爆破开始,找到“注册”的位置,往上面看居然有四个跳转,但现在没什么用,全改成nop也没有用,所以我们要先去看这几个跳转是什么。首先从je开始看,这个的要求是“不能等于”,分别有304、308、31C
还原隐藏框
首先看304,搜索一下,由于是比较,所以我们要格外关注mov。可以看到这个属于FormCreate,也就是创建窗口的方法,这里看不出东西来,那就往上面拉。
这里找到个文件路径,有没有可能这个文件路径就是那个edit2,在这下面创建一个,没有x盘的,把x改成c就行,保存不了就再dump一遍,ctrl+p只能保存代码修改,数据不行。同时还要注意,308、30C、314全都有初始值,说明这些是用作TF判断的数值;318和304是输入eax,说明这是需要我们手动修改用作数字或者字符匹配比较的部分。
然后就成功出现了一个新框框
原因在于tcontrol是可视组件,integer整数,那么set left top自然就是说明组件位置。所以这里的文件路径其实就是一个可视组件,我们找不到,但是DFM里面能看到,说明这里需要我们手动添加。
激活隐藏框
当我们还原了这个框后会发现,没法输入东西,往txt文件里面写东西也没有显示,所以我们需要去看看这个框是否存在一个激活机制注意这里有一个双击事件,不要忘了我们还在看304,往下面看
这里是第一个影响304的跳转,跳转前没有比较指令说明比较在函数中发生,这个地方存在的位置是StrCmp,我们前面知道这时字符比较。接着看下一个
这也是个跳转,可视组件内部的Boolean,说明是个对错判断。
但是现在并没有说明这个判断是哪个框的,只是知道,双击要在字符判断之后。
暂时保留一下
接下来我们看308由于实际比较的是230D,所以我们重点看这个mov,这个属于注册按钮,是一个mouse down事件,只需要鼠标任意键按下触发,要求是不等于,所以需要跳过这步
我们知道308的初始值是28E,前面讲了,这个的逻辑是:
首先在进行其他进程的时候要先点这个注册按钮,否则就会判断是否已经点击了3次(第一个跳转),如果是否就失败,点击了注册后就会跳过,但是必须要点满三次及以上再进行其他操作(28E+6,三次点击0-3-6),这个结果会被储存,不会减少。也就是说,点注册3次以上就能跳过等于。
到这里不要跑,这鸡贼的藏了个308在这下面,因为不是23D0所以容易忽略,但这个也是个事件。
panel的双击事件,不知道到底有什么用,但是想要触发里面的东西必须使308等于29D,注意edx有一次循环的延迟,308起始28E,差16-1=15,每次加3,共五次点击才能保证308等于29D,自然的,29D大于294
所以实际上我们需要点击注册按钮5次,然后再双击图片框,注意是框不是图片,只能点空白位置
这个2f0到底是个什么东西,不知道,查一下呗
v
前面两个位于表单创建中,是一个可视控件
第三个也是在form create里面,结构和双击框框是一样的,方法是关闭
后面两个全部位于edit2双击事件里面,这说明这个东西和edit2有关,由于我们之前知道,这个输入框是没办法操作的,那么我们在完成了前面的操作后尝试点一下?好像还是没有用,接着看31C呢
只有一个那就简单了,注册按钮的点击事件,click特指左键按下释放过程。一旦点击了就会将3e7丢进31位置,31c位置不能等于3e7就说明这个按钮不能点。
但是上面要求我们点击5次注册按钮去触发某个东西,怎么办,右键点就行了。
那么我们右键点5次注册,再双击一下框,果然edit2被解锁了,可以开始输入东西。
不要问我为什么,脑洞猜的,猜对了就行。
name和serial格式
接下来是两个jne,先去看看310,要求要等于f94
两个mov都在里面,所以可能都有用。很明显,这个在mousemove事件中,所以去到这个事件中查看一下
我已经意识到要发生什么了
我们可以通过搜索知道这些ds分别代表什么:
- 2E0是image3,比较eax,也就是ebp+C,jle小于E2则跳;比较edx,小于12C则跳
- 没跳过就给310放入10,跳过初始就是0
- 2DC是image2,比eax,jge大于17跳;比edx,小于2C跳
- 310不等于10就跳,所以上面不能跳过mov 310,10,2E0的跳全都要反过来,要大于
- 30C等于9就跳,由于初始就等于9,所以要去找30C
这里面就一个可能有变换的,这一步是在edit2双击事件中,由于不确定eax是怎么来的,所以这里面要一步一步追
在我们把edit2激活之后,注意前面任何地方不能留断点,只能在这个地方留,双击edit2框框就进入到这里面,然后步过看结果就行,我们输入abc和a1b2c3
OK,这里很明显就是字符判断了
这一步eax=6,按照往期经验来看有没有可能是长度,换几个不同长度的字符试试果然是。不符合直接跳,所以长度需要等于8,由于我们需要看下面的过程,所以这个地方调试可以直接修改跳转逻辑,进到下面的过程,记录下结果即可,jne-je。
这里出现了一个字符比较eax+1=1和‘_’,所以是第二个字符必须为‘_’。同样的,修改跳转信息,接着看下一个跳转位置:
一样的,eax+5=3,第6个字符必须为‘,’,再改后往下看:
这里出现了我们的用户名abc,接着往下走
这一块东西,做了个加3除3,结果测试edx是否为0,idiv是求余数,403B88这个函数获取的是abc的长度,所以这段的意思就是要求用户名长度是大于等于0的3的倍数
OK这就是备受关注的30C,只要满足上面的所有条件,最终就是9+1=10,就不等于9了,不会被跳过,所以这里其实是用户名和serial格式的校验。
好了,两个没有判断没有问题,可以保证最终310变成F94,当然还有个前提是鼠标位置。
总结一下:
- 用户名是3的倍数,serial是“1_345,78”
- 输入后双击edit2
- 然后是经过了反复实验对比数值的鼠标位置,不放过程了,就是断点然后拿鼠标从不同地方进入程序框框试。
- 出现图片3时从右下角进来
- 出现图片2时从左下角进来
注册
最后一步314和318
首先看314
还是鼠标移动事件取决于30C,30C分别为0123,314分别为41 3D 34 DF
然后是318
318则分别归属于四个图片的点击事件,每一个结构都是一样的:
两个按下增加318数值的,bl很熟悉了,0和1分别对应左右键,没有0?那个test就是判断是否为0
先程序试一试,啥都没有,原来这个鸡贼的在314判断下面还有个用户名判断
这个不在事件里面,只是个将30C结果写出来的东西,好让我们直接判断314的值,同时可以确定我们之前的操作是否正确。不要这个可以断点直接看,调试会非常麻烦,因为这家伙的东西都是套娃,断这里会跟着断前面的步凑。熟悉吧,这个403C98不就是前面我们看到304字符比较用的函数,2FC属于edit1,所以用户名必须为ajj,才能显示30C的值。所以最好管一下。
根据上面318的点击增加值要等于314
- 图1左键+2,右键+11
- 图2左键+3,右键+13
- 图3左键+5,右键+17
- 图4左键+7,右键+1B
已知314=3D,那么我们就拿这几个数字来凑,看看怎么加能得3D
第四张图片左键1次,右键2次,得到318:
OK到这里本来注册按钮就该变成“注册了”,但是并没有,经过查看,最终314和318变成了???,而且并没有进行比较,因为我在比较跳转位置下的断点并没有被触发,原因未知,也没有报异常,只知道它在004278EA后变成0,76D6456A后变成???。后面实在是搞不懂了,先学着吧,后面万一有灵感了呢。