飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4891|回复: 10

小菜鸟关于S**的一点点心得

[复制链接]
  • TA的每日心情
    擦汗
    2019-3-8 22:25
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2014-5-4 21:41:19 | 显示全部楼层 |阅读模式
    本帖最后由 尿尿不洗手 于 2014-5-4 21:44 编辑

    因为想练习一个脱壳,无意翻到一篇老帖,帖子中提到了S**+bpm法快速定位注册码验证位置。由于本人比较菜,在群里问了下前辈们,前辈不吝赐教,给出了解释,在这里写下一点点自己的心得体会,给我这样的新手作为参考。

    由于在论坛水的比较少,所以不知道在哪个板块发帖比较好,如果发错了地方希望版主帮帮忙,在此谢过。
    来到PYG感觉非常热闹,大牛们在群里非常活跃,给我这种小菜长见识了,希望以后在这里学习更多知识,我也会把自己学到的东西分享
    给像我一样的新手。废话太多了,下面进入正题。


    1.什么是S**+bpm法?

        尽尘缘前辈说,所谓S** 只在内存中会出现真注册码的情况下才会有效。就是在一次注册验证后内存中搜索假码、假码附近有真码。
    我自己的理解为:我输入假码123456qwe  点击验证,之后马上在内存中搜索123456qwe,找到假码的内存地址,在内存地址处下内存写入断点,就断在了关键位置。。


    理解是这样没错,要用实例来验证才会有说服力,所以刚刚和妹子看完超凡蜘蛛侠的首映就赶回来做实验,顺便提一句,这电影比我预期的要差。有TM偏题了。
    自己写个小程序来测试是否有效。代码写的丑,见谅。


    1. #include <stdio.h>
    2. #include <string.h>
    3. int main()
    4. {
    5.         bool bPassed=0;
    6.         char test[20]={0};
    7.         do
    8.         {
    9.                 scanf("%s",&test);
    10.                 if (!strcmp(test,"pass"))
    11.                 {
    12.                         
    13.                         printf("success!\n");
    14.                         bPassed = 1;
    15.                 }
    16.         } while (!bPassed);
    17.         return 0;
    18. }
    复制代码

    编译,载入OD,F9,输入1234567,回车。 在OD里ALT+M,CTRL+B,输入1234567果断找到了,无图无**,

    q1.jpg

    在内存地址下个硬件写入断点,重新输入qwerty,回车,断下了。一看,在系统领空,ALT+K,看看调用堆栈,
    q2.jpg

    即可定位到scanf函数,再往下就到了验证对错的地方了。S**真好用。

    有了S**,我就在想,我是写软件的人该怎么破这个方法。小菜灵机一动,想到,如果把验证放在一个函数里,每次调用这个函数,错误了直接返回,那么函数的堆栈也就回收了,不就可以解决这个问题了吗
    继续改造代码如下


    1. #include <stdio.h>
    2. #include <string.h>
    3. bool yanzheng()
    4. {
    5.         char test[20]={0};
    6.         scanf("%s",test);
    7.         if(!strcmp(test,"pass"))
    8.         {
    9.                 return 0;
    10.         }
    11.         return 1;
    12.         
    13. }
    14. int main()
    15. {
    16.         bool bPassed=0;
    17.         //char test[20]={0};
    18.         do
    19.         {
    20.                 //scanf("%s",&test);
    21.                 if (!yanzheng())
    22.                 {
    23.                         
    24.                         printf("success!\n");
    25.                         bPassed = 1;
    26.                 }
    27.         } while (!bPassed);
    28. //        printf("Hello World!\n");
    29.         return 0;
    30. }
    复制代码

    继续刚才的姿势,发现虽然调用一次验证函数,堆栈回收了,但是堆栈里面的值还是会保存,即搜索内存里的假码依旧可以搜索的到。还有,函数每次分配给字符串的地址都一样,即我第一次输11111,第二次输22222,都会用同同一段内存。
    有图:

    第一次, q3.jpg

    第二次, q4.jpg

    想到的方法失效,怎么办?再来,用堆分配内存试试,代码如下:
    1. <font size="2" color="#000000">#include <stdio.h>
    2. #include <string.h>
    3. #include <windows.h>

    4. bool yanzheng2()
    5. {
    6.         char *pStr=new char[20];
    7.         ZeroMemory(pStr,20);
    8.         scanf("%s",pStr);
    9.         if(strcmp(pStr,"pass"))
    10.         {
    11.                 delete [] pStr;
    12.                 return 0;
    13.         }
    14.         delete []pStr ;
    15.         return 1;
    16.        
    17. }
    18. int main()
    19. {
    20.         bool bPassed=0;
    21.         char test[20]={0};
    22.         do
    23.         {
    24.                 if (yanzheng2())
    25.                 {
    26.                         printf("success!\n");
    27.                         bPassed = 1;
    28.                 }
    29.         } while (!bPassed);
    30.         return 0;
    31. }</font>
    复制代码



    继续刚才的姿势,预测一下结果先:是否搜得到假码?找到了地址能否断的下来?第一次, Q5.jpg 记下地址0027069C
    第二次, Q6.jpg 0027069C
    发现依旧可以找得到,且地址相同。。


    S大 法好厉害的说。。。通杀。。


    以上是一点小小的心得,谢谢大家。


    PYG19周年生日快乐!

    该用户从未签到

    发表于 2014-5-4 21:53:16 | 显示全部楼层
    不错 ~

    我也常用这个方法 倒不是为了追明文 而是下断点来定位程序读取输入的注册码

    现在的加密如果还搞明文比较 那只能说是作者估计免费了
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-8 22:25
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-5-4 21:56:07 | 显示全部楼层
    Nisy 发表于 2014-5-4 21:53
    不错 ~

    我也常用这个方法 倒不是为了追明文 而是下断点来定位程序读取输入的注册码

    也是为了学习找关键注册判断的地方。。小菜才学的小伎俩让Nissy姐姐见笑了,哈哈
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-8 22:25
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-5-4 23:31:07 | 显示全部楼层

    就当是对自己的一个总结笔记,前辈看了就一笑而过吧
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2014-5-5 09:31:38 | 显示全部楼层
    膜拜会写程序,自己调试的。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 1482 天

    [LV.10]以坛为家III

    发表于 2014-5-5 10:51:57 | 显示全部楼层
    不错,又一种方法。
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-8 22:25
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-5-5 10:52:52 | 显示全部楼层
    吾爱学习 发表于 2014-5-5 09:31
    膜拜会写程序,自己调试的。

    大牛又来取笑人家

    点评

    真心的,我不会写程序。只会最简单的hello world  详情 回复 发表于 2014-5-5 11:01
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2014-5-5 11:01:55 | 显示全部楼层

    真心的,我不会写程序。只会最简单的hello world
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2014-5-8 12:06:22 | 显示全部楼层
    我完全看不懂  没有基础该怎么办?
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表