如何用md5来验证程序本身的正确性?

wingfootedtiger 2006-01-19 03:22:15
我尝试用md5来验证程序本身的正确性,似乎无法处理了,困惑如下

if (MD5_File("Project1.exe")=="7c3c679b480475eddbb6bd077edeb4bb") ShowMessage("ok");
else ShowMessage("Error");

每次编译后,md5码都变化了,如何预知最后的md5码是多少,怎么办呢?
...全文
478 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
CityHost 2006-01-23
  • 打赏
  • 举报
回复
PE文件自带一个简单的CRC校验,BCB里Project Options->Advanced Linker->Advanced->Calculate Checksum打开,然后在需要的校验的地方用CheckSumMappedFile函数检验就行了,虽然不是很安全,但是也还可以能将就的用.
david430 2006-01-23
  • 打赏
  • 举报
回复
可以尝试用MD5和DES算法相结合的办法来弄弄
alloutoflove 2006-01-23
  • 打赏
  • 举报
回复
偶前面说的破解方法就是楼上那种, 单纯靠判断MD5检测不行, 加密工作,任重道远啊...(解密工作, 任重道远啊..........)
loakia 2006-01-22
  • 打赏
  • 举报
回复
如shadowstar(CodeFast.very fast...)所说,我有一个这样的思路:将程序分成两截,分开校验。

1、定义一个数组:unsign char arr[72]={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11.....} //64个0x11,前32位放前半截的MD5,下一个32位放后半截的MD5,最后8位放位移量。


2、编译连接得exe文件,用winhex取位移量。
3、计算前后两部分md5。
4、用winhex将MD5及位移量回填入exe.
5、大功成矣!



weill 2006-01-22
  • 打赏
  • 举报
回复
此外,我也许又要给楼主来些凉水了。
天网就有类似的代码,不过,还是让人给破了,破的方法很简单:
将指向打开本身程序的代码指向别的名称,如果你没特别的办法的法,只要改一下字串就OK。
(不知你看明白没,嘿嘿)
weill 2006-01-22
  • 打赏
  • 举报
回复
我个人的做法,供楼主参考。
1、对于一个程序来说,其实,用winhex打开后,你会发现其头部有很多部位是无关紧要的,比如This program must be run under Win32字串后一些紧接着的8个"00",你爱改不改,而我们所见的多数未加壳的程序的这部分都是很相似的,所以,你完全可以把程序的MD5码的值写在此处。
2、正如上面朋友所说,把整个程序的MD5算出来然后写入程序在原则上是很难办到的,会进入一个死环,除非你有预见性或预见算法(我是办不到的)。
3、所以,只要你从This program must be run under Win32字串后一些紧接着的8个"00"后开始计算程序的MD5码,你的任务就能轻松实现了。
4、不过,这个方法,对于高手或知情人来说也许就容易破解了。同理,你可以把MD5码藏在更难找的地方,如自个定义的字串预留空间中,只要你计算时不计算这个空间的变化就可以了。(这个方法实现起来难一些,但完全可以办到)。
netying 2006-01-21
  • 打赏
  • 举报
回复
顶!
loakia 2006-01-21
  • 打赏
  • 举报
回复
这是个好贴,一定要用力的顶!
netsys2 2006-01-20
  • 打赏
  • 举报
回复
记得结题,并提交FAQ。
netsys2 2006-01-20
  • 打赏
  • 举报
回复
不要用MD5对整个文件做效验。

这样是不行的,

如果那个MD5_File()函数的代码你没有,就另外换一个:


可以不用DLL来认证,方法是:

1)定义全局变量

char MYCRC[16]={0x11,0x11,0x11,0x11...};//16个0x11

2)找一个CRC算法,简单点就直接是摸二加

3) 代码:

fopen(EXE文件),只读打开
BYTE crc = 0;
for(int i=0;i<filelen;i++)
crc = crc ^ filedata[i];

if( crc != MYCRC[0] )
{
ShowMessage("crc error");
return;
}

4) 编译OK,得到EXE文件。

5)另外新建立一个工程,名字叫getcrc.prj,专门统计某个文件的摸二加值,代码参考:
fopen(EXE文件),只读打开
BYTE crc = 0;
for(int i=0;i<filelen;i++)
crc = crc ^ filedata[i];


6)用UTRLEDIT或者其他HEX编辑器打开你的EXE文件,

寻找一串0x11,0x11,0x11...的东西

找到后把第一个0x11和第二个0x11都改为你用getcrc.exe得到你的EXE文件的CRC值。
------------
大功告成!
痞子酷 2006-01-20
  • 打赏
  • 举报
回复
在程序本身中是不行的,因为:EXE一变化,md5来验证跟着变化,而md5来验证一变化,EXE也跟着变化,进入死循环。
我的建议:
写一个DLL,在这个DLL中定义好md5来验证,这个DLL可以用16进制程序打开编辑你弘定义的md5来验证字符串,也许能实现。
shadowstar 2006-01-19
  • 打赏
  • 举报
回复
要验证自己,但程序又包含了验证串,所以要验证的话必须除去串所在位置。

代码类似于:

function VerifySelf: Boolean;
const
CodePosition = 1234;
var
Stream: TStream;
MD5: TMD5;
Code, EmptyCode: array[0..15] of Byte;
begin
Stream := TMemoryStream.Create;
MD5 := TMD5.Create;
ZeroMemory(EmptyCode, 16);

Stream.LoadFromFile(Application.ExeName);
Stream.Position := CodePosition;
Stream.Read(Code, 16);
Stream.Position := CodePosition;
Stream.Write(EmptyCode, 16);

MD5.EncodeStream(Stream);

Result := Code = MD5.Code;
end;
alloutoflove 2006-01-19
  • 打赏
  • 举报
回复
只要你的加密算法复杂, 把MD5的变种形式写入到其它文件或者以GUID等形式写入注册表等,都可以有效地防止的,没有破解不了的,只是时间问题,如果你只是单单计算程序的MD5码并验证而不加其它手段的话,很容易被破的.
wingfootedtiger 2006-01-19
  • 打赏
  • 举报
回复
都是红星老大啊,先谢谢各位.
问题是这样的,我希望通过md5来验证程序没有被修改,所以想验证程序本身.
如果执行程序验证dll的md5值的话,破解者一样可以先改dll里的内容,然后再算出dll的md5,最后修改执行程序中md5值,这样似乎没用了.

各位老大可有什么好的思路?
constantine 2006-01-19
  • 打赏
  • 举报
回复
一修改过就变了
还有MD5_File应该是返回16位数组吧,我用多的就是,要用md5print转一下才是32位的字符串
cczlp 2006-01-19
  • 打赏
  • 举报
回复
把MD5码写到其它文件中.
lurel 2006-01-19
  • 打赏
  • 举报
回复
关注
wingfootedtiger 2006-01-19
  • 打赏
  • 举报
回复
加dll也想到了,就是想验证本身的md5值,似乎没办法,各位可有什么好的办法?
ccrun.com 2006-01-19
  • 打赏
  • 举报
回复
这个似乎不太好办吧。再加一个Dll还好说点。

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧