Afkayas.2
:这个CM 和上一个Afkayas.1 类似,但是算法有一点点不同,并且这里还需要去除一个Nag
逆向算法
首先还是通过关键的字符串的进行定位,不会的看我的上一篇文章。
然后前面还是一样len(UserName) * 88888 + ascii(UserName[0])
但是的去尝试的时候发现密码不是这个。
我们接着往下看。
发现这里有一个新的数字,当尝试这个数字的时候,发现就是需要的PassWord
所以我们就需要跟进这个计算出这个数据的call
这里 我们跟进的时候发现,好像是这么的简单。
我们重新分析,因为上面好想有点点错误。。。
这里是将上面计算出来的值+2
然后往下:
将上面计算出来的值*3 然后再减2
然后减去-(-15)也就是+15
经过这些计算最后就得到了PassWord
后面就是一个cmp
中间用到了很多浮点数来计算,然后又转整数
我们用python来实现一下:
1 | UserName = input("请输入你的用户名:") |
去除Nag
这个是我破的第三个程序,我也不会。还好有大佬些的帖子:
https://bbs.kanxue.com/thread-249719.htm
这里我们知道在call 后就会调用这个Nag窗口。
:
在程序载入到入口点之后的第一个push也就是VBHeader的位置,数据窗口跟随。
这里当一下搬运工:
TVBHeader结构定义
1 | Signature array[1..4] of char; //00H签名,必须为VB5! |
其对应每个字节的含义如下表
offset | 含义 |
---|---|
00H | VB5! |
04H | |
06H | 语言链接库名 |
14H | |
22H | 04代表msvbvm50.dll版本 |
24H | 语言标识 |
28H | |
2CH | 00000000表示非由sub_main启动 |
30H | 指向ProjectInfo结构 |
34H | |
36H | |
38H | |
3CH | |
40H | |
44H | 只有2个FROM |
46H | 引用的OCX DLL文件个数为0 |
48H | |
49H | |
4AH | |
4CH | Ptr 0040126C |
50H | 若没有引入的ocx,dll文件,此指针无效 |
54H | 指向tProjectDescriptionTable的指针 |
58H | ProjectExename |
5CH | ProjectTitle |
60H | HelpFile |
64H | ProjectName |
4CH : Ptr 0040126C
就可以在头的位置+4C
然后在数据窗口输入刚才的地址+4C,找到form GUI描述表的指针
因为是指针所以这里存放的是地址。我们跟随一下:
这些16进制下面有横线的就说明他们双击某个函数的入口点。
我们跟进看看【大小端绪】:00406868 0040117C
接着会来到一块有规律的数据区域,每一个小块的数据是每一个窗体的信息,其中00和01是窗体的序号 而10是第一个窗体的启动标志。
:[这里抄个图]
所以 我们只要把第一个窗体数据块的00改成10 然后把第二个窗体的数据块的10改成00,或者将窗体的序号调换。即可去除neg。
就发现去除了Nag