1.peid查壳,程序无壳,运行程序发现没有什么按钮之类的,直接输入用户名和序列号就会显示出wrong。
2.od载入搜索关键字wrong定位关键代码段(本来想用ida载入程序的,但是ida载入程序搜索不到关键字符串)
3.在od中定位关键字符串之后本来想在ida中通过快捷键g跳转到关键位置处的,但是发现od载入的imagebase是0xca00000,而ida载入的imagebase是0x400000
重新载入ida手动加载程序,修改加载的imagebase为0xca0000,
然后跳转到关键位置0xca1cd0处,使用f5大法。
所以关键函数就是sub_CA1740了,这里只需要对这个函数进行分析就好了。
这个函数的大体思路就是经过一系列的if条件判断,判断成功之后会返回1(成功的标志)
4.下面开始对这个函数进行分析
1)最开始输出长度为4,通过od动态调试得到的答案
2)
CString::GetAt(0); 就是把 一个 CString 对象里 的字符串 中的第一个字符,把它的ASCII 值 送返回来。 v3保存的是位置,判断输入的字符是否在a~z之间
3)将除了第一个字符的字符做比较,如果第2-第4个字符和第一个字符相等,则直接跳到退出窗口。
4)这一步又构成一个循环,将v1+1,跳转到label_7,这里的功能就是说输入的字符不能有重复的
5)变量v51存放的是输入的序列号,v51-12存放的是输入序列号的长度,长度要为11,然后输入序列号的第五位要位‘-’
6)对name的第一位进行变换,v50存放的是输入的name变量
7)对输入的name第二位进行变换
8)GetBuffer:
该函数功能:获取指定缓冲区里的内容大小的指针,从而进行修改,例如:char *p=NULL; p=variable(变量).GetBuffer(m_strWrite.GetLength());
列:
CString s( "abcd" );//定义一个CString s并且初始化为abcd
LPTSTR p = s.GetBuffer( 10 );//定义一个指针指向LPTSTR并接受GetBuffer所返回的地址
lstrcpy( p, _T("Hello") ); // directly access CString buffer//使用Istrcpy将Hello]复制到该buffer中
afxDump << "CString s " << s << "\n";这时候s="Hello";
将v52处的字符和v51处的字符进行比较,v51存放的是输入的序列号。现在需要弄清楚v51处存放的值是多少。
GetBuffer(&v52)使变量52指向了某个字符串的位置。0x0101D3E8
itow_s()函数的作用就是将输入0x0101D3E8处的值设置位V7+v9(这里使通过od动态调试分析得到的结果)
这里算是有思路了,就使将变换之后的name和serial进行比较,看是否满足条件。
9)下面对name的第二位和第三位进行变换
10)然后进行相似的比较操作:
11)当满足所有的条件的时候,就能够得到正确的答案了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-1-17 14:22
被wwzzww编辑
,原因: