作者:星痕
e-mail:jrg1982@163.com
1. 用softice载入windows(通过CTRL+D来检查softice是否已经准备好,按F5退出softice);
2. 运行winamp,选择“Winamp...”下的“Shareware”,点击“Enter Registration info”;
3. 在“Name:”中输入:Xingheng(随意),“Reg#:”中输入:12345678(随意);
4. 用CTRL+D呼出softice,下万能断点:bpx hmemcpy,按F5返回到winamp;
5. 在winamp中选择“OK”,等一等?是不是发现一个问题:“OK”按钮是无效的,不能被点击,也就是说程序已经知道了注册码是错误的。如此看来在我们输入注册码的过程中winamp已经在判断输入的注册码是否正确了,所以当我们输完注册码它已经知道注册码是错误的,因此就禁止了“OK”按钮;
6. 既然winamp是在我们输入注册码的过程中同时判断其正确性的,那么我们就不能像通常那样先输完注册码再设置断点,而是要反过来;
7. 先用 BD * 禁止刚才设置的断点(如果不这样你的任何举动都会被softice拦截下来的,不信就试一试^_^);
8. 删掉刚才输入的注册码“12345678”,接着按 CTRL+D 切换到softice,用 BE * 恢复刚才暂停的断点 bpx hmemcpy 。因为winamp会在我们输入任何注册码时判断其正确性,那么它必定要读取输入的信息,这样的话设置断点 bpx hmemcpy 一定能监视它的一举一动;
9. 在“Reg#:”中输入:1 ,winamp马上就会被softice拦截下来;
10. 用 BD * 暂停断点,然后再按F12返回到winamp的领空--问题又来了:当你按F12还没有返回到winamp的领空时程序已经判断完毕,回到winamp的控制中了。为什么呢?肯定是断点 bpx hmemcpy 设置有问题。俗话说山不转水转,既然 bpx hmemcpy 不行我们就干脆换另外的断点。winamp的注册界面是个对话框,所以我们干脆用 bpx getdlgitemtexta 试一下;
11. 重新进入winamp的注册选项,然后按 CTRL+D 切换到softice中,下断点 bpx getdlgitemtexta;
12. 在“Reg#:”中输入:1,哈哈。。。winamp马上就被softice拦截下来;
13. 用 BD * 禁止刚才设置过的断点;
14. 按F12键1次返回到winamp的领空:
。。。
0167:0041E6CF CALL [USER32!GetDlgItemTextA] <-- 获取对话框文本
0167:0041E6D5 PUSH 00 <-- 返回winamp的领空时程序停在这里
0167:0041E6D7 PUSH 00
0167:0041E6D9 PUSH 0000048C
0167:0041E6DE PUSH EBX
0167:0041E6DF CALL [USER32!GetDlgItemInt] <-- 获取对话框文本的整数值
0167:0041E6E5 MOV ESI,EAX <-- 返回值EAX中是输入注册码“1”的16进制整数值1
0167:0041E6E7 LEA EAX,[ESP+10]
0167:0041E6EB PUSH EAX <-- EAX指向输入的名字“Xingheng”
0167:0041E6EC CALL 004261E0
0167:0041E6F1 ADD ESP,04
0167:0041E6F4 CMP EAX,ESI <-- ESI=00000001,EAX=0333F395
0167:0041E6F6 JNZ 0041E703
。。。
15. 从上面的程序看出winamp通过API函数GetDlgItemTextA取得输入的文本信息,然后利用API函数GetDlgItemInt得到输入注册码“1”的16进制整数值1并将结果返回EAX中。按F10走到0167:0041E6EB PUSH EAX时用 D EAX 可以看到EAX指向输入的名字“Xingheng”,继续跟踪你会发现下面的CALL 004261E0利用“Xingheng”计算得到16进制值0333F395并和我们输入注册码“1”的16进制值相比较,用 ?0333F395 可知其10进制值是53736341,因为不等所以那个“OK”键始终不能点击喽。
16. 验证结果:重新进入winamp的注册选项,在“Name:”中输入:Xingheng,“Reg#:”中输入:53736341,现在“OK”键是不是已经可用了^_^!点击“OK”后winamp显示注册成功的消息,搞定了^_^!
新闻热点
疑难解答
图片精选