运行分析
PE分析
32位,未知程序和壳 点击Scan/t按钮外部扫描,发现是C++程序
静态分析&动态调试
选中该函数(地址:401048 - 401172) Edit -> Functions -> Delete function 然后再选中该函数,按P键创建函数
按F5,反编译成功 分析主函数,注释如上图,还需要知道sub_401173、sub_40119B和sub_40120C函数功能
分析sub_401173,发现其作用是初始化变量dword_401AF0
动调sub_40119B函数,发现函数作用是根据Name决定0xCC和0xDD位置和个数 看一下结果,结合题目为snake,猜测为16*16的贪吃蛇地图
动调sub_40120C函数,其作用是模拟贪吃蛇的轨迹,具体如下: 1、贪吃蛇初始长度为1,蛇头位置为0x99 2、提取Serial每一位进行&3计算,得到结果转化为蛇头上下左右行为 0 -> 16 -> ↑ 1 -> -16 -> ↓ 2 -> -1 -> ← 3 -> 1 -> → 3、每吃到一个0xCC,蛇身+1,蛇头不能撞到蛇身,必须吃完0xCC,最后再吃0xDD,即可弹窗成功
算法分析
from ctypes import * def sub_40119B ( ) : global dword_401B00global dword_401700v2 = c_uint8( 0 ) for i in Name: v2. value = ( v2. value + ord ( i) ) & 0xff n = 0 v5 = c_uint8( 0 ) for i in range ( len ( Name) ) : v5. value = ( v2. value ^ ord ( Name[ i] ) ) v2. value -= v5. valuedword_401B00[ v5. value] | = 0xCC i = c_uint8( 0 ) i. value = v5. value ^ v2. valuewhile 1 : v5. value = v5. value - i. valueif ( dword_401B00[ v5. value] != 0xCC ) : break i. value = i. value - 1 dword_401B00[ v5. value] = 0xDD v5. value = i. valuewhile ( dword_401B00[ v5. value] == 0xCC or dword_401B00[ v5. value] == 0xDD ) : v5. value = v5. value - 1 dword_401B00[ v5. value] = 0x99 dword_401700 = v5. valuedef sub_40120C ( ) : global mapsglobal Serialfor i in range ( 0 , 16 ) : maps. append( dword_401B00[ 16 * i: 16 * ( i+ 1 ) ] ) addr_CC = [ ] for y in range ( 0 , 16 ) : for x in range ( 0 , 16 ) : if maps[ y] [ x] == 0xCC : addr_CC. append( [ x, y] ) addr_DD = [ ] for x in range ( 0 , 16 ) : for y in range ( 0 , 16 ) : if maps[ y] [ x] == 0xDD : addr_DD. append( [ x, y] ) addr_99 = [ ] for x in range ( 0 , 16 ) : for y in range ( 0 , 16 ) : if maps[ y] [ x] == 0x99 : addr_99. append( [ x, y] ) for i in range ( len ( addr_CC) - 1 , - 1 , - 1 ) : y = addr_99[ 0 ] [ 1 ] - addr_CC[ i] [ 1 ] x = addr_99[ 0 ] [ 0 ] - addr_CC[ i] [ 0 ] if y >= 0 : Serial += '1' * yelse : Serial += '0' * ( - y) if x >= 0 : Serial += '2' * xelse : Serial += '3' * ( - x) addr_99[ 0 ] = addr_CC[ i] y = addr_99[ 0 ] [ 1 ] - addr_DD[ i] [ 1 ] x = addr_99[ 0 ] [ 0 ] - addr_DD[ i] [ 0 ] if y >= 0 : Serial += '1' * yelse : Serial += '0' * ( - y) if x >= 0 : Serial += '2' * xelse : Serial += '3' * ( - x) if __name__ == '__main__' : Name = 'c' Serial = '' dword_401B00 = [ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ] maps = [ ] sub_40119B( ) sub_40120C( ) print ( Name + '的Serial为:\n' + Serial)
因为未限制Name个数,所以假设Name长度为1,这样比较简单 验证成功