05
具体分析
从这里可以发现是有upx壳的,我们使用dump工具直接dump就行了
接下来继续拖入反汇编工具观察方法
首先通过观察有个编辑框被隐藏了呃呃呃
然后被隐藏的编辑框还有个双击方法
大体的把这个程序看看,发现有个注册成功的字符串,这些一看就是注册成功要走的逻辑
继续看如果满足以上条件都不会执行注册成功的那行代码
寻找[ebx+304h]赋值的这块代码,这里我编写了了个脚本
def FindCode(start,end):
for addr in range(start,end):
str2=GetOpnd(addr,1)
str=GetOpnd(addr,0)
if str in ["[ebx+304h]","[eax+304h]","dword ptr [eax+304h]","dword ptr [ebx+304h]"]:
print (hex(addr))
print (str)
if str2 in ["[ebx+304h]","[eax+304h]","dword ptr [eax+304h]","dword ptr [ebx+304h]"]:
print (hex(addr))
print (str2)
for seg in Segments():
if SegName(seg)=="UPX0":
FindCode(seg,SegEnd(seg))
通过查看可以发现这个地方就是我们需要的地方,当上面字符串比较相等,那么就不会赋值为0x3c4,这里的函数大体意思就是读取一个文件里面的内容然后比较字符串
下面给出路径和比较字符串的截图,X盘??不暴力怎么玩@.@
直接使用Winhex给他整了一波
生成txt可以同个.bat脚本来写要不然太累
然后这就是效果图,隐藏的编辑框出来了嘿嘿
接下来找[ebx+308h]吧,这里308不能等于320D就OK了,不知道230D是啥的看校验成功的图
赋值的就下面两个地方,给他赋值为230D的地方是按钮点击触发的函数
通过看这些代码知道这里必须要cl=1才能满足上面的条件,这里我使用栈回溯
回到上一层发现edx给了ecx,但是edx的值又是上层函数给的继续栈回溯
上一层函数发现又回到了cl继续寻找吧
这里对这个函数使用交叉引用,别问我为什么,我每个函数其实都是到ida里面交叉引用看的,没用什么收获才进行下一次栈回溯
很幸运的是发现两个可以给cl赋值为1的,函数名是右键双击才会调用,呵呵哒
继续寻找[ebx+310h],这里我没要让他赋值成为0F94h,所以下面这句话就是关键点了
并且这个方法是在窗体上鼠标移动就会触发
现在我们是要让这个地方不跳转
通过脚本去获取所有的地址发现,这个函数调用的时候会在[ebx+2DC]找到0x47的位置调用,可能这个函数就是我们需要的
上面赋值的是在时钟函数里面调用的
这个时钟函数是在图片每走过一个方向后执行一次,执行完所有的方向又会重新置1这里我是调试出来的。
第一个
第二个
第三个
第四个
所以我们要第三次的时候让其先赋值为10
然后第二次的时候让其赋值为0F94h,但是这个时候有个条件不满足,[ebx+30Ch]值等于9
同样使用脚本跑,发现这里是为其赋值的
是一个编辑框双击函数
之前没用没注意,那个编辑框不能输入。😓右键点击直到等于29D就行,就会调用下面的函数设置编辑框可以点击了,这个函数的触发要双击painel
现在触发双击的函数
首先校验编辑框2的内容,长度为8且第2个字符为_第6个为,
然后又校验编辑框1字符串长度为3的倍数
接下来寻找[ebx+318h]和[ebx+314h]让他们相等
经过观察[ebx+318h]的初始值是0,但是点击图片的时候会增加
[ebx+314h]的值来自于这一块的switch分支
下面继续找[ebx+31Ch]
这里只要不左键点击按钮就ok了
到这里所有的条件都匹配了,成功了