首页
社区
课程
招聘
[原创]内网通3.4.3045 去广告码算法分析
发表于: 2019-4-15 20:52 33083

[原创]内网通3.4.3045 去广告码算法分析

2019-4-15 20:52
33083

软件挺好用, 就是老弹广告, 好在作者提供了去广告码可以去除广告

16字节分为4个DWORD

第一个随意, 第二个是固定值 0x8A19B75F, 第三个DWORD是自己的ID值, 第四个DWORD是到期时长


生成算法如下:

随便输入任意字符串, 提示无效的广告码, 从提示入手
Spy一下, 确定软件应该是duilib开发的界面, 在软件目录下有res文件夹, 找到
res\ShiYeLine\value\string.xml 我们查找对应的提示文本, 看到
	<String Id="IDS_REMOVE_ADVERTISEMENT_SUCCESS_FORMAT">开通成功,到期时间为:%s。</String>
	<String Id="IDS_REMOVE_ADVERTISEMENT_CODE_EMPTY">请输入免广告码。</String>
	<String Id="IDS_REMOVE_ADVERTISEMENT_CODE_INVALID">无效的免广告码。</String>
	<String Id="IDS_REMOVE_ADVERTISEMENT_CODE_ADDED">免广告码已添加过。</String>

	<String Id="IDS_REMOVE_ADVERTISEMENT_SUCCESS_FORMAT">开通成功,到期时间为:%s。</String>
	<String Id="IDS_REMOVE_ADVERTISEMENT_CODE_EMPTY">请输入免广告码。</String>
	<String Id="IDS_REMOVE_ADVERTISEMENT_CODE_INVALID">无效的免广告码。</String>
	<String Id="IDS_REMOVE_ADVERTISEMENT_CODE_ADDED">免广告码已添加过。</String>

在IDA字符串列表中搜索 IDS_REMOVE_ADVERTISEMENT_CODE_INVALID 
定位到函数 414570
if ( v62 )
  {
    v29 = 0;
    i = 0;
    ret = sub_5EE630(&v29, (basic_string *)&strNoAdvCode, (void **)&i);
    if ( ret != 1 && v29 )
    {
      if ( ret == 2 )
      {
        string::string((basic_string *)&v50, L"IDS_REMOVE_ADVERTISEMENT_CODE_ADDED");// 免广告码已添加过。
        LOBYTE(v64) = 7;
        v8 = SkinUI::GetString((basic_string *)&v51, (basic_string *)&v50);
        LOBYTE(v64) = 8;
        string::substr((basic_string *)&v53, v8, 0, 0xFFFFFFFF);
        string::dtor((basic_string *)&v51);
        LOBYTE(v64) = 2;
        string::dtor((basic_string *)&v50);
      }
      else
      {
        string::string((basic_string *)&v50, L"IDS_REMOVE_ADVERTISEMENT_SUCCESS_FORMAT");// 开通成功,到期时间为:%s。
        LOBYTE(v64) = 9;
        SkinUI::GetString((basic_string *)&v57, (basic_string *)&v50);
        LOBYTE(v64) = 11;
        string::dtor((basic_string *)&v50);
        string::string((basic_string *)&v33, (void *)&WindowName);
        LOBYTE(v64) = 12;
        string::string((basic_string *)&v41, (void *)&WindowName);
        LOBYTE(v64) = 13;
        string::string((basic_string *)&v37, (void *)&WindowName);
        LOBYTE(v64) = 14;
        string::string((basic_string *)&v45, (void *)&WindowName);
        LOBYTE(v64) = 15;
        v9 = sub_4B0580((basic_string *)&v52, (unsigned int)i);
        LOBYTE(v64) = 16;
        if ( v9->_Myres < 8 )
          v10 = (int)&v9->Buf.pBuf;
        else
          v10 = (int)v9->Buf.pBuf;
        v11 = Format;
        if ( v59 < 8 )
          v11 = (wchar_t *)&Format;
        v12 = SkinUI::StringFormat((basic_string *)&v51, v11, v10);
        LOBYTE(v64) = 17;
        SkinUI::MsgBox(v12, v32[144], &v45, 0, &v37, &v41, &v33, 0);
        string::dtor((basic_string *)&v51);
        string::dtor((basic_string *)&v52);
        string::dtor((basic_string *)&v45);
        string::dtor((basic_string *)&v37);
        string::dtor((basic_string *)&v41);
        string::dtor((basic_string *)&v33);
        LOBYTE(v64) = 2;
        string::dtor((basic_string *)&v57);
      }
    }
    else
    {
      string::string((basic_string *)&v37, L"IDS_REMOVE_ADVERTISEMENT_CODE_INVALID");// 无效的免广告码。
      LOBYTE(v64) = 5;
      v13 = SkinUI::GetString((basic_string *)&v41, (basic_string *)&v37);
      //......
    }

if ( v62 )
  {
    v29 = 0;
    i = 0;
    ret = sub_5EE630(&v29, (basic_string *)&strNoAdvCode, (void **)&i);
    if ( ret != 1 && v29 )
    {
      if ( ret == 2 )
      {
        string::string((basic_string *)&v50, L"IDS_REMOVE_ADVERTISEMENT_CODE_ADDED");// 免广告码已添加过。
        LOBYTE(v64) = 7;
        v8 = SkinUI::GetString((basic_string *)&v51, (basic_string *)&v50);
        LOBYTE(v64) = 8;
        string::substr((basic_string *)&v53, v8, 0, 0xFFFFFFFF);
        string::dtor((basic_string *)&v51);
        LOBYTE(v64) = 2;
        string::dtor((basic_string *)&v50);
      }
      else
      {
        string::string((basic_string *)&v50, L"IDS_REMOVE_ADVERTISEMENT_SUCCESS_FORMAT");// 开通成功,到期时间为:%s。
        LOBYTE(v64) = 9;
        SkinUI::GetString((basic_string *)&v57, (basic_string *)&v50);
        LOBYTE(v64) = 11;
        string::dtor((basic_string *)&v50);
        string::string((basic_string *)&v33, (void *)&WindowName);
        LOBYTE(v64) = 12;
        string::string((basic_string *)&v41, (void *)&WindowName);
        LOBYTE(v64) = 13;
        string::string((basic_string *)&v37, (void *)&WindowName);
        LOBYTE(v64) = 14;
        string::string((basic_string *)&v45, (void *)&WindowName);
        LOBYTE(v64) = 15;
        v9 = sub_4B0580((basic_string *)&v52, (unsigned int)i);
        LOBYTE(v64) = 16;
        if ( v9->_Myres < 8 )
          v10 = (int)&v9->Buf.pBuf;
        else
          v10 = (int)v9->Buf.pBuf;
        v11 = Format;
        if ( v59 < 8 )
          v11 = (wchar_t *)&Format;
        v12 = SkinUI::StringFormat((basic_string *)&v51, v11, v10);
        LOBYTE(v64) = 17;
        SkinUI::MsgBox(v12, v32[144], &v45, 0, &v37, &v41, &v33, 0);
        string::dtor((basic_string *)&v51);
        string::dtor((basic_string *)&v52);
        string::dtor((basic_string *)&v45);
        string::dtor((basic_string *)&v37);
        string::dtor((basic_string *)&v41);
        string::dtor((basic_string *)&v33);
        LOBYTE(v64) = 2;
        string::dtor((basic_string *)&v57);
      }
    }
    else
    {
      string::string((basic_string *)&v37, L"IDS_REMOVE_ADVERTISEMENT_CODE_INVALID");// 无效的免广告码。
      LOBYTE(v64) = 5;
      v13 = SkinUI::GetString((basic_string *)&v41, (basic_string *)&v37);
      //......
    }

很明显 5EE630 就是验证广告码的函数了, 下个断点调试一下, 可以确定第二个参数是我们输入的广告码, 进去看看是怎么验证的

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-4-30 21:39 被SnowFox编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (12)
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
2
用旧版去升级就好,但有码还是要认真学习的,谢谢楼主
2019-4-19 09:21
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这就厉害了,谢谢楼主!
2019-4-25 10:46
0
雪    币: 199
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
厉害。怎么知道是AES算法的?
2019-4-25 20:41
0
雪    币: 8128
活跃值: (1980)
能力值: ( LV8,RANK:122 )
在线值:
发帖
回帖
粉丝
5
zaley 厉害。怎么知道是AES算法的?
AES 有相关的常量定义与函数形态, 通过这些确定, 有findcrypt插件可以查找, 再结合代码就确定了
2019-4-27 10:58
0
雪    币: 1212
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主反编译后怎么会有AES(**),这样的函数名呢?我也在破解一个AES算法的的东东,死活找不到AES加密的入口。。。。咋办啊
2019-5-4 18:32
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享,赞美大佬
2019-5-13 18:12
0
雪    币: 8845
活跃值: (5341)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
学习了。
2019-12-10 11:30
0
雪    币: 342
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
感谢楼主分享!
2020-2-27 10:28
0
雪    币: 342
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
用上了,终于没有烦人的广告闪烁了!
感谢楼主 
2020-2-27 10:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
没看懂,是怎么支除广告的?
2020-4-28 14:11
0
雪    币: 4538
活跃值: (3032)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢楼主分享!
2022-8-2 17:46
0
雪    币: 202
活跃值: (16)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
谢谢分享
2023-3-2 09:39
0
游客
登录 | 注册 方可回帖
返回
//