不考虑时间效率,直接rep movsb实现:
3BFE CMP EDI,ESI
72 09 JB $+0Bh
8D740E FF LEA ESI,[ESI+ECX-1]
8D7C0F FF LEA EDI,[EDI+ECX-1]
FD STD
F3:A4 REP MOVSB
FC CLD
共16字节。
[……]
不考虑时间效率,直接rep movsb实现:
3BFE CMP EDI,ESI
72 09 JB $+0Bh
8D740E FF LEA ESI,[ESI+ECX-1]
8D7C0F FF LEA EDI,[EDI+ECX-1]
FD STD
F3:A4 REP MOVSB
FC CLD
共16字节。
[……]
在前面的文章里,我们通过使用UPX Stub中的代码加以手工修改PE文件导出表得到了3280byte的目标DLL(点击此处),又通过重新编译LZMA SDK将目标缩小到2970byte(点击此处)。今天我们继续精简,通过修改源代码来进一步缩小目标文件的大小。
首先我们可以看到原来LZMA解压在不加其他功能情况下的声明是:
int LzmaDecode(CLzmaDecoderState *vs, const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, unsigned char *outStream, SizeT[……]
一年前我曾写过一篇《手写PE文件,打造史上最小LZMA解压DLL》,最近因为涉及毕业设计,重新开始研究PE,同时也需要提供LZMA压缩功能。
对原来的程序观察后发现,UPX使用的LZMA代码并不是最优化的编译,原因是局部变量全部使用ESP寻址,而Intel x86对寄存器寻址有个ESP例外,需要多占用一字节的指令。于是重新翻出LZMA SDK,使用VC6编译出2409字节的代码(原来是2694字节)。
另外一个问题就是原来开头写的sub esp, 3e80是不对的。Windows分页机制规定,栈分配是逐页进行的,当当前栈位于页顶端时访问上面的页会引发栈空间分配,但跨页访问即认为访问越界。显[……]
因程序需求,需要在VB中调用LZMA解压数据,经过N天研究出此成果~
什么是LZMA:LZMA应该是目前世界上数一数二的压缩算法——压缩时相同的时间得到压缩比最高,解压时速度极快且几乎不占内存。如果你对LZMA算法并无耳闻,那么7z总听说过吧。。没错,LZMA即7z作者发明的,7z使用的算法。什么?7z也没听说过?这样吧,你在网上下的软件,比如旺旺、暴风影音、人人桌面,它们的安装程序都是清一色的NSIS,打包的压缩算法是LZMA。。
用到的工具:
文件、内存编辑器:winhex
汇编器、调试器:ollydbg
upx shell
参考的资料:
看雪论坛《加密与解密》[……]