版本:2006beta2
工具:odbg
用ODBG载入QQ,下断bp CreateFileA
按下F9,发生第一次中断,堆栈情况如下
0012ECD0 00403948 /CALL 到 CreateFileA 来自 QQ.00403946
0012ECD4 00C08C48 |FileName = "C:/Program Files/Tencent/QQ/QQ.exe"
0012ECD8 80000000 |Access = GENERIC_READ
0012ECDC 00000001 |ShareMode = FILE_SHARE_READ
0012ECE0 00000000 |pSecurity = NULL
0012ECE4 00000003 |Mode = OPEN_EXISTING
0012ECE8 00000820 |Attributes = ARCHIVE|COMPRESSED
0012ECEC 00000000 /hTemplateFile = NULL
0012ECF0 0012FDEC
0012ECF4 005442E8 QQ.005442E8
直接F9,发送第二次中断,堆栈情况如下
0012FD54 0040373E /CALL 到 CreateFileA 来自 QQ.00403738
0012FD58 00C08C98 |FileName = "C:/Program Files/Tencent/QQ/QQInfo.dat"
0012FD5C 80000000 |Access = GENERIC_READ
0012FD60 00000001 |ShareMode = FILE_SHARE_READ
0012FD64 00000000 |pSecurity = NULL
0012FD68 00000003 |Mode = OPEN_EXISTING
0012FD6C 00000820 |Attributes = ARCHIVE|COMPRESSED
0012FD70 00000000 /hTemplateFile = NULL
0012FD74 00000000
0012FD78 005442E8 QQ.005442E8
暂停,转到C:/Program Files/Tencent/QQ/目录下,用UE打开QQInfo.dat,发现内容只有48bit,其实就是
QQ.exe的效验码,那么可以猜到第一次CreateFileA打开C:/Program Files/Tencent/QQ/QQ.exe的目的了。
基本情况应该是打开C:/Program Files/Tencent/QQ/QQ.exe计算其效验值,然后从C:/Program Files/Tencent/QQ/
QQInfo.dat读取原来的效验码,两者不等则over;
目标明确,现在没必要知道它采用的效验算法是什么,只需找到两者比较后的关键jmp修改之;
直接alt+F9(或Ctrl+F9,F8)返回,重复3次后到达
0040189E E8 35180000 call QQ.004030D8
004018A3 85C0 test eax,eax //这里
004018A5 75 18 jnz short QQ.004018BF
004018A7 6A FF push -1
004018A9 57 push edi
004018AA 6A 04 push 4
004018AC E8 FBFA0600 call <jmp.&MFC42.#1199_AfxMessageBox>
下一个jnz跳过call <jmp.&MFC42.#1199_AfxMessageBox>,它就是我要找的,其实这个call QQ.004030D8
就相当于call QQfileCheck();可以把这个call nop掉提高启动速度,关键的跳转还是要改的,jnz short QQ.004018BF 改为jmp short QQ.004018BF ,保存文件完工。