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了

到这里所有的条件都匹配了,成功了

posted @ 2020-06-24 08:43  NATIVE99  阅读(196)  评论(0编辑  收藏  举报