首页
社区
课程
招聘
[讨论]软件中有哪些隐藏明文字符串的方法
发表于: 2016-8-6 15:21 18378

[讨论]软件中有哪些隐藏明文字符串的方法

2016-8-6 15:21
18378

新手请教:
玩了一段时间的CrackMe,有些是明文直接出现的。就像这样的,直接通过字符串搜索就能定位关键位置进行破解。
有些是通过字符串搜索,什么有用的信息也搜不到。像这样的。


那么问题来了
如何去隐藏字符串=。=
百度也没百度到相关的内容,只是自己想了个笨方法:申请一片空间,然后用内联汇编挨个往里边填字符。

_asm
  {
    lea esi, a;
    mov byte ptr[esi], 101;
    inc esi;
    mov byte ptr[esi], 114;
    inc esi;
    mov byte ptr[esi], 114;
    inc esi;
    mov byte ptr[esi], 111;
    inc esi;
    mov byte ptr[esi], 114;
    inc esi;
    mov byte ptr[esi], 33;
    inc esi;
    mov byte ptr[esi], 0;
  }
for (int i = 0; i < wcslen(_Text); i++)
		_Text[i] -=10 ;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (19)
雪    币: 33
活跃值: (643)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个不难 只是感觉隐藏的意义不大 先加密字符串 得到数组 然后像下面这样

        char str_buff[100]={0};
        str_buff[0] = 0x33;
        str_buff[2] = 0x35;
        str_buff[1] = 0x34;
        MessageBox(0,str_buff,0,0);
2016-8-6 18:14
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我也想到一个笨方法,比如你有这些字符串:
char szStr1 = "hello world";
char szStr2 = "lz 最帅";
char szStr2 = "二楼很漂亮";
然后把这些字符串单独提取到一个文件中,假设是mystr.cpp,导出一个函数string getStrByID(int nStrID)

string getStrByID(int nStrID)
{
   //读取一个二进制文件
   //把二进制转成明文,然后通过字符串编号返回
}
2016-8-6 19:19
0
雪    币: 1787
活跃值: (345)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
。。直接上vmp,用SDK保护下字符串就可以了。
2016-8-6 23:25
0
雪    币: 325
活跃值: (563)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
楼主换个思路,字符串是啥?不就是一个以0结尾的一维char(unicode为wchar)数组吗?既然是数组,再怎么重组、拆分、加密等等是不是就有很多方法了啊
2016-8-7 18:45
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有空间的话用2进制来写吧,哈哈哈
2016-8-7 20:43
0
雪    币: 756
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
这么一想的话,想怎么重组确实方法多了 但是还是想知道大家的主流方法是啥
2016-8-7 21:31
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我觉得楼主的方法就可以啊。字符串属于常量啊,比如一个字符串"哈哈哈哈哈",只要在代码中出现了,编译的时候就会编译到常量区了。如果一个一个Asii码(Unicode码)的填,局部变量的话,就会保存在栈上,如果不运行的话,一般调试器是解析不出来的应该。
2016-8-8 10:21
0
雪    币: 756
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
可以是可以,但是放在OD一看反汇编代码就看到了一串代码:给new出来的空间里填数据,拽回也太显眼了=。=
另外就是:这样一个一个填ASCII写代码也好累啊,还得对着ASCII表一个一个查
2016-8-8 11:14
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
或者用楼上大家说的加密的方法,先将字符串加密好,在运行时解密。这样OD查看字符串的时候只能查看到加密的内容。再有你可以加壳啊给程序。
2016-8-8 11:37
0
雪    币: 56
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
检索字符串的方式是对于直接引用字符串的 比如push string_addr; 所以只要想办法让string_addr常量不是指向字符串的就可以了 这里免不了要使用过渡变量
2016-8-8 23:57
0
雪    币: 272
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
1、只要你的程序能被debug,再复杂的加密也能够被找到正确的字符串。
2、如何不被debug,目前比较好的方式是加壳,把关键的代码放到vm里面保护,这样可以防止大部分的debug。
3、壳不是万能,所以终极大法是把字符串放在服务端,不要做到客户端,如果可以的话。
2016-8-9 09:27
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
13
http://bbs.pediy.com/showthread.php?t=209250
2016-8-9 16:07
0
雪    币: 202
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
楼主隐藏字符串的主要动机是软件保护,不要让人通过字符串定位到代码。这个,其实还是一个复杂的问题,组合、编码、或者加密,运行时还原,这种方法对静态反汇编是很有效的,以下找不到。但对于动态内存搜索,通过内存断点定位代码,你咋办?
2016-8-10 10:34
0
雪    币: 756
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
额,,没考虑那么多,就是想加密一下字符串,不让他在调试环境中以明文出现=。=
2016-8-10 16:33
0
雪    币: 16
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
既然是固定的文本,事先加密好成Byte的数据,里面在填充几个\0这些,在赋值给全局变量。。。以前我是这样做的,程序写个解密的方法。。。
2016-8-20 16:41
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
2016-8-20 18:26
0
雪    币: 704
活跃值: (228)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
19
用  RC4或者  AES  加密解密啊。

2017-4-14 09:37
0
雪    币: 2347
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
写代码的时候就写密文然后给一个DecodeFunc  不知道是否可行
2017-4-15 10:20
0
雪    币: 215
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
龙幽 楼主换个思路,字符串是啥?不就是一个以0结尾的一维char(unicode为wchar)数组吗?既然是数组,再怎么重组、拆分、加密等等是不是就有很多方法了啊
豁然开朗,谢谢指点!
2018-2-9 00:13
0
游客
登录 | 注册 方可回帖
返回