首页
社区
课程
招聘
[旧帖] 关于利用LD_PRELOAD进行hook的问题 0.00雪花
发表于: 2016-2-2 18:15 4054

[旧帖] 关于利用LD_PRELOAD进行hook的问题 0.00雪花

2016-2-2 18:15
4054

c3cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2T1M7s2u0G2N6r3!0K6M7#2)9J5k6h3N6A6N6r3S2#2j5W2)9J5k6h3W2G2i4K6u0r3M7r3!0K6N6s2y4Q4x3V1k6D9K9g2)9J5k6s2W2G2L8X3N6Q4x3X3c8D9k6q4)9#2k6Y4m8J5k6h3I4G2j5h3c8B7K9h3&6Q4x3X3c8^5K9h3&6Y4i4K6u0V1K9r3!0G2K9#2)9J5k6h3S2@1L8h3H3`.
看到利用LD_PRELOAD在Ring3级别进行hook,就照着代码试了一下,没有成功。后来多次尝试发现,当main.c的代码为:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    if( strcmp(argv[1], "test") )
    {
        printf("Incorrect password\n");
    }
    else
    {
        printf("Correct password\n");
    }
    return 0;
}

时,便hook不成功。但是若代码为:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char a[]="test";
    if( strcmp(argv[1], a) )
    {
        printf("Incorrect password\n");
    }
    else
    {
        printf("Correct password\n");
    }
    return 0;
}

时,便可以成功hook,查了很久也没搞明白为什么,请各位大牛赐教。

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是因为a[]末尾有结束字符,而"test"后面没有?
2016-2-2 19:02
0
雪    币: 1147
活跃值: (1159)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
有可能 strcmp 被編譯器優化掉了
看一下編譯出來的 binary 吧
2016-2-3 06:14
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
"test"是const char *
char a[]是char *
类型不同,你的mock函数怎么定义的
2016-2-3 10:49
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=fuchuang;1414245]"test"是const char *
char a[]是char *
类型不同,你的mock函数怎么定义的[/QUOTE]

我试了,和这个是没有关系的。
2016-2-3 11:22
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个。。功力不够呃
2016-2-3 11:23
0
雪    币: 198
活跃值: (1032)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
一个是全局,一个是局部数据,是不是因为重定位的原因。
2016-2-3 11:46
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
目前猜可能是当参数直接"text"时,字符串是放在数据段的,会有问题。
而其它的,包括
char *a = "text";
因为函数堆栈区有指针a,所以没问题。
现在就是想知道为什么会这样,但不知道该怎么往下研究了。
2016-2-3 16:29
0
游客
登录 | 注册 方可回帖
返回