三月,阴雨而无事,身极慵倦,闲而无聊,正值赏玩《加密解密教程》颇觉有悟道之感。脑中灵光一闪,记起公司资料室有一档案管理软件,号称价值不菲,身价数以千计,其软件附密狗一只,不知其性良否?技痒,借之以习杀狗之技。
沐浴、更衣、焚香一束、心中祷告过往神灵,礼毕。安装该软件,察看其目录,Vfp6r.dll之流文件一浏无遗,该软件为visual Foxpro所写无疑。Ida pro简单跟进,文件头无它,仅foxpro常规exe头。指令良顺,无花无壳。祭出FoxTool2.2,勾选解密时生成app文件以便进一步分析.
设定存盘路径,反编译。打开程序名对应的prg文件:小狗在此:
declare integer DogRead in WIN32DLL integer, integer, string @
declare integer DogWrite in WIN32DLL integer, integer, string @
dogaddr = 0
dogbytes = 11
data = "123456"
newdog = DOGREAD(DOGBYTES,DOGADDR,@DATA)
if NEWDOG <> 0
clear dlls
declare integer DogRead in OLD32DLL integer, integer, string @
declare integer DogWrite in OLD32DLL integer, integer, string @
olddog = DOGREAD(DOGBYTES,DOGADDR,@DATA)
if OLDDOG <> 0
= MESSAGEBOX("无狗提示!",48,"信息窗口")
return
endif
endif
dogaddr = 0
dogbytes = 9
dogdata = "软件名称此名称为原软件名称,不便提供已作修改”
i = DOGWRITE(DOGBYTES,DOGADDR,@DOGDATA)
一看可知为读狗函数,OLD32DLL为叫狗文件,
declare integer DogRead in OLD32DLL integer, integer, string @
declare integer DogWrite in OLD32DLL integer, integer, string@
此为读狗函数。
这两函数改为标准api声明如下:
int WINAPI DogRead(int a,int b,char* c)
LONG WINAPI DogWrite(int a,int b,char* c)
本想用IDAPro仔细跟踪.dll实现,但转念一想,此仍事倍功半之举,打开VC2008建一标准window 工程,选建dll项,项目名设为OLD32DLL,OLD32DLL.cpp代码加入如下行:
int WINAPI DogRead(int a,int b,char* c)
{
return 0;//根据vfp的代码提示,返回0就是正确,反之为读狗失败
}
LONG WINAPI DogWrite(int a,int b,char* c)
{
/* dogaddr = 0
dogbytes = 9
dogdata = "软件名称”
i = DOGWRITE(DOGBYTES,DOGADDR,@DOGDATA)
以上代码可知写狗函数会返回写入字节数
*/
return 9;
}
项目加入一OLD32DLL.def文件,代码如下:
LIBRARY "OLD32DLL"
EXPORTS
DogRead
DogWrite
编译、连接,得到的OLD32DLL.dll覆盖软件目录下同名项,爆破完成,杀狗结束,此狗性顺良,杀之心有悲悯之念。。。。。。
后记:在本机上调试通过,将OLD32DLL.dll,如法复制至同事机器上,提示出错,百思不得其解,好在神灵有知,下午忽有灵仿,是否由于是VC2008,这个dll不是以前那种本地dll? 在同事机器上装上net framework3.5运行时支持库,一切以完美收场,事后不痛骂老比设计VC2008变态,难解心头愤恨。。。。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课