这道题当时木有干出来,之后看了大佬的文章才恍然大悟。
程序的大致流程如下:
经过艰难的动态调试之后发现函数sub_402E40和sub_402F80都是简单的赋值,没有经过加密。
我测试的数据是 11
经过函数sub_4012233加密之后是 EP4=
而正常的base64加密11是MTE=,里面肯定有猫腻,F7进去函数看看
可以看到base64的编码表,验证了我的猜测,肯定与base64有关,只不过经过了改编。
继续往下调,又发现了一个不一样的编码表
把两个编码表对照一下不难发现MTE=,EP4=,是按照下面的一一对应的。
加密过程已经搞定了,接下来该分析程序的关键点了,而且我发现这个编码表用完之后,会一个一个字节的被置0。这是真的sao,给分析增加难度。
进入判断函数找到关键点
可以看到函数sub_402160也跟base64有关
通过od调试可知,最终比对的数据我们可以记录下来是
[0x8, 0x3b, 0x1, 0x20, 0x7, 0x34, 0x9, 0x1f, 0x18, 0x24, 0x13, 0x3, 0x10, 0x38, 0x9, 0x1b, 0x8, 0x34, 0x13, 0x2, 0x8, 0x22, 0x12, 0x3, 0x5, 0x6, 0x12, 0x3, 0xf, 0x22, 0x12, 0x17, 0x8, 0x1, 0x29, 0x22, 0x6, 0x24, 0x32, 0x24, 0xf, 0x1f, 0x2b, 0x24, 0x3, 0x15, 0x41, 0x41]
一共四十八位,这些数据又代表什么哪?我猜是base64编码表的下标,先实验一下看对不对
import string
def main():
t = [0x8, 0x3b, 0x1, 0x20, 0x7, 0x34, 0x9, 0x1f, 0x18, 0x24, 0x13, 0x3, 0x10, 0x38, 0x9, 0x1b, 0x8, 0x34, 0x13, 0x2, 0x8, 0x22, 0x12, 0x3, 0x5, 0x6, 0x12, 0x3, 0xf, 0x22, 0x12, 0x17, 0x8, 0x1, 0x29, 0x22, 0x6, 0x24, 0x32, 0x24, 0xf, 0x1f, 0x2b, 0x24, 0x3, 0x15, 0x41, 0x41]
t1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
t2 = '0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm+/='
print len(t)
out = ''
for i in t:
out += t1[i-1]
print out
map1 = string.maketrans(t2,t1)
out = out.translate(map1)
print out.decode('base64')
print 'end.'
if __name__ == '__main__':
main()