-
-
[原创]通过修改WritePrivateProfileStringA的参数值实现绿化软件
-
发表于:
2010-8-22 02:34
7581
-
[原创]通过修改WritePrivateProfileStringA的参数值实现绿化软件
为什么这么说呢?很多软件都通过这个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的参数值实现绿化软件
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课