首页
社区
课程
招聘
想做加壳软件,有个问题不能解决
发表于: 2006-10-20 10:11 3883

想做加壳软件,有个问题不能解决

2006-10-20 10:11
3883
我想把程序的Import表取消,并把所有 API call全部先经过我的函数处理后再调用,函数主要是LoadLibrary,再GetProcAddress。

如何判断哪个call是调用的是API?
如何知道该call调用哪个API名称(字符串)?
如果我不把API名放在加壳后的程序中,而只是把API的地址放在加壳后的程序中,那么是否会有跨平台的问题?(因为不同的系统dll的实际函数地址不同)

如果采用存储API地址,是否应该先加载该程序,再读取API的地址呢?

太多问题了,不知道写过加壳软件的高手门是如何处理IAT的?

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
2
@第一种方法
你可以把 api name 使用对称算法,转换成其他的值存储.比如 crc32
base64,md5 等等, dll 名字要使用可逆加密算法存储.
@第二种通过暴力搜索代码节,如果遇到一条指令的操作数是在输入表中(
即类似这样的 call [api] 和 mov reg,[api], jmp [api] 的指令) 把他们都改为 call my_api_proxy ( 被修改的指令肯定大于等于 5 个字节,仔细想想,呵呵),call my_api_proxy 的 VA 和对应的 api 加密保存,用于在 my_api_proxy 中查询转发,注意替换的指令最好有限制, 比如只替换 系统 api, 或只替换 call [api], 和 jmp [api] 形式,因为逆无法确定一些引入是符号还是函数.
如果目标程序没有使用特殊方法使用 api(比如内嵌汇编之类的特殊方法调用), 这样就可以把 输入表丢弃了.

我只是简单的描述了一下.实际操作还有很多的东西需要注意一下

2006-10-20 16:20
0
雪    币: 12639
活跃值: (3137)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
确实有这个问题
原来call API要写成call[&API]形式就多了一个字节.
2006-10-21 09:03
0
游客
登录 | 注册 方可回帖
返回
//