小菜鸟关于S**的一点点心得
本帖最后由 尿尿不洗手 于 2014-5-4 21:44 编辑因为想练习一个脱壳,无意翻到一篇老帖,帖子中提到了S**+bpm法快速定位注册码验证位置。由于本人比较菜,在群里问了下前辈们,前辈不吝赐教,给出了解释,在这里写下一点点自己的心得体会,给我这样的新手作为参考。
由于在论坛水的比较少,所以不知道在哪个板块发帖比较好,如果发错了地方希望版主帮帮忙,在此谢过。
来到PYG感觉非常热闹,大牛们在群里非常活跃,给我这种小菜长见识了,希望以后在这里学习更多知识,我也会把自己学到的东西分享
给像我一样的新手。废话太多了,下面进入正题。
1.什么是S**+bpm法?
尽尘缘前辈说,所谓S** 只在内存中会出现真注册码的情况下才会有效。就是在一次注册验证后内存中搜索假码、假码附近有真码。
我自己的理解为:我输入假码123456qwe点击验证,之后马上在内存中搜索123456qwe,找到假码的内存地址,在内存地址处下内存写入断点,就断在了关键位置。。
理解是这样没错,要用实例来验证才会有说服力,所以刚刚和妹子看完超凡蜘蛛侠的首映就赶回来做实验,顺便提一句,这电影比我预期的要差。有TM偏题了。
自己写个小程序来测试是否有效。代码写的丑,见谅。
#include <stdio.h>
#include <string.h>
int main()
{
bool bPassed=0;
char test={0};
do
{
scanf("%s",&test);
if (!strcmp(test,"pass"))
{
printf("success!\n");
bPassed = 1;
}
} while (!bPassed);
return 0;
}
编译,载入OD,F9,输入1234567,回车。 在OD里ALT+M,CTRL+B,输入1234567果断找到了,无图无**,
在内存地址下个硬件写入断点,重新输入qwerty,回车,断下了。一看,在系统领空,ALT+K,看看调用堆栈,
即可定位到scanf函数,再往下就到了验证对错的地方了。S**真好用。
有了S**,我就在想,我是写软件的人该怎么破这个方法。小菜灵机一动,想到,如果把验证放在一个函数里,每次调用这个函数,错误了直接返回,那么函数的堆栈也就回收了,不就可以解决这个问题了吗
继续改造代码如下
#include <stdio.h>
#include <string.h>
bool yanzheng()
{
char test={0};
scanf("%s",test);
if(!strcmp(test,"pass"))
{
return 0;
}
return 1;
}
int main()
{
bool bPassed=0;
//char test={0};
do
{
//scanf("%s",&test);
if (!yanzheng())
{
printf("success!\n");
bPassed = 1;
}
} while (!bPassed);
// printf("Hello World!\n");
return 0;
}
继续刚才的姿势,发现虽然调用一次验证函数,堆栈回收了,但是堆栈里面的值还是会保存,即搜索内存里的假码依旧可以搜索的到。还有,函数每次分配给字符串的地址都一样,即我第一次输11111,第二次输22222,都会用同同一段内存。
有图:
第一次,
第二次,
想到的方法失效,怎么办?再来,用堆分配内存试试,代码如下:<font size="2" color="#000000">#include <stdio.h>
#include <string.h>
#include <windows.h>
bool yanzheng2()
{
char *pStr=new char;
ZeroMemory(pStr,20);
scanf("%s",pStr);
if(strcmp(pStr,"pass"))
{
delete [] pStr;
return 0;
}
delete []pStr ;
return 1;
}
int main()
{
bool bPassed=0;
char test={0};
do
{
if (yanzheng2())
{
printf("success!\n");
bPassed = 1;
}
} while (!bPassed);
return 0;
}</font>
继续刚才的姿势,预测一下结果先:是否搜得到假码?找到了地址能否断的下来?第一次,记下地址0027069C
第二次,0027069C
发现依旧可以找得到,且地址相同。。
S大 法好厉害的说。。。通杀。。
以上是一点小小的心得,谢谢大家。
不错 ~
我也常用这个方法 倒不是为了追明文 而是下断点来定位程序读取输入的注册码
现在的加密如果还搞明文比较 那只能说是作者估计免费了 Nisy 发表于 2014-5-4 21:53
不错 ~
我也常用这个方法 倒不是为了追明文 而是下断点来定位程序读取输入的注册码
也是为了学习找关键注册判断的地方。。小菜才学的小伎俩让Nissy姐姐见笑了,哈哈
强!!!
GGLHY 发表于 2014-5-4 22:41
强!!!
就当是对自己的一个总结笔记,前辈看了就一笑而过吧
膜拜会写程序,自己调试的。 不错,又一种方法。 吾爱学习 发表于 2014-5-5 09:31
膜拜会写程序,自己调试的。
大牛又来取笑人家{:3_160:} 尿尿不洗手 发表于 2014-5-5 10:52
大牛又来取笑人家
{:3_160:}真心的,我不会写程序。只会最简单的hello world
我完全看不懂没有基础该怎么办?
页:
[1]
2