首页
社区
课程
招聘
[原创]通过修改WritePrivateProfileStringA的参数值实现绿化软件
发表于: 2010-8-22 02:34 7584

[原创]通过修改WritePrivateProfileStringA的参数值实现绿化软件

2010-8-22 02:34
7584
为什么这么说呢?很多软件都通过这个API函数向%windir%目录里写配置文件。并且,如果写入失败的话,程序是不能退出的!只能靠任务管理器啦~

这个问题在低用户权限的时候,是不可避免的;况且,有必要非往系统目录里凑热闹么?

回正题。怎样解决?

刚开始的时候,为了避免这个,我选择把“写配置文件”Nop掉~,算是不是解决办法的办法……

隔了一段时间之后,再次碰到了这种问题。跟踪……终于发现了关键点:
向%windir%目录里写配置文件是调用kernel32.WritePrivateProfileStringA实现的。WritePrivateProfileStringA函数的参数中,lpFileName为String,初始化文件的名字。如果没有指定完整路径名,则windows会在windows目录查找文件。如果文件没有找到,则函数会创建它。

那么,指定完整路径名可以把配置文件写在当前目录。

接着,你要问怎么“指定完整路径名”?

拿我的两个例子来说吧(具体代码就不贴了):

第一个。
a.得到程序自身的完整路径;
b.进一步得到程序的完整名;
c.替换程序名的后缀为ini作为配置文件名,并传递给WritePrivateProfileString函数。默认写在系统目录。

修改办法:把a的结果直接传递给c。

第二个。
a.通过GetWindowsDirectory获得系统目录;
b.读入特定的配置文件名,与a连接;
c.得到的完整路径名作为验证配置文件创建时间的参数;
d.读入特定的配置文件名,作为读取配置文件的参数;
e.读入特定的配置文件名,作为写配置文件的参数。

修改办法:
修改GetWindowsDirectory为GetCurrentDirectory(长度不超),则b得到的结果是在当前目录;c就不必要了;d读取b的结果(离得很近);e是在关闭程序时候,b的结果已经已经破坏掉了,于是在空白处添加一段保存b的结果的“功能函数”,程序里有的,应该含有类似“rep     movs dword ptr es:[edi], dword ptr [esi]”的语句,只要维护好现场,源地址和目的地址,就可以调用,c的call正好派上用场!

怎么修改GetWindowsDirectory为GetCurrentDirectory?

1.用十六进制编辑器直接修改导入函数名;
2.这两个函数的参数都是两个,但是顺序是相反的(参API手册)!改之!

-----------------------------------
原标题是:通过WritePrivateProfileStringA实现绿化软件
修改为:通过修改API函数WritePrivateProfileStringA的参数值实现绿化软件

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
额....标题党.
2010-8-22 11:10
0
游客
登录 | 注册 方可回帖
返回
//