首页
社区
课程
招聘
尝试着给winhex增加二进制文件比较功能
2008-12-13 16:49 17434

尝试着给winhex增加二进制文件比较功能

2008-12-13 16:49
17434
平时经常要对二进制文件进行比较,我比较喜欢使用WINHEX处理二进制文件,很希望它能够提供UE一样的二进制文件比较功能。
所以今天尝试给winhex增加这个功能。

1。首先给WINHEX增加一个按扭。使用资源黑客。

2 MENU
LANGUAGE LANG_CHINESE, 0x2
{
POPUP "文件(&F)"
{
MENUITEM "新建(&N)...\tCtrl+N", 10
MENUITEM "打开(&O)...\tCtrl+O", 11
MENUITEM "保存(&S)\tCtrl+S", 12
MENUITEM "另存为(&A)...", 13
MENUITEM "比较文件", 7878 //增加这个



2.更改winhex原先的消息处理

00474F27 |> \8BC6 mov eax, esi ; ESi等于ID
00474F29 |. E8 CE24F9FF call 004073FC


改成

00474F27 |> \8BC6 mov eax, esi ; ESi等于ID
00474F29 E8 B66F0B00 call 0052BEE4


bp GetOpenFileNameA,运行.来到这里的代码处.

004271EC |. 8B0D 50395300 mov ecx, dword ptr [533950] ; 123.00541A1E
004271F2 |. 66:8B09 mov cx, word ptr [ecx]
004271F5 |. 8B17 mov edx, dword ptr [edi]
004271F7 |. A1 74375300 mov eax, dword ptr [533774]
004271FC |. E8 CF3A1000 call 0052ACD0
0052ACD0 /$ 0FB7C9 movzx ecx, cx
0052ACD3 |. 41 inc ecx
0052ACD4 |. 51 push ecx ; /n
0052ACD5 |. 52 push edx ; |String2
0052ACD6 |. 50 push eax ; |String1
0052ACD7 |. E8 90C0EDFF call <jmp.&kernel32.lstrcpynA> ; \lstrcpynA
0052ACDC \. C3 retn

EDX指向最近打开的文件完整路径名
EAX=[533774]=00548D6C
把文件的路径复制到了00548D6C位置.
往下翻翻,发现这个地址00548B6C始终指向最新打开的完整文件路径。

增加以下代码:

0052BEDD . 63 6D 70 00 ascii "cmp",0
0052BEE1 00 db 00
0052BEE2 00 db 00
0052BEE3 00 db 00
0052BEE4 $ 60 pushad
0052BEE5 . 3D C61E0000 cmp eax, 1EC6
0052BEEA . 75 2B jnz short 0052BF17
0052BEEC . 68 DDBE5200 push 0052BEDD ; /FileName = "cmp"
0052BEF1 . E8 CEACEDFF call <jmp.&kernel32.LoadLibraryA> ; \LoadLibraryA
0052BEF6 . 85C0 test eax, eax
0052BEF8 . 74 1D je short 0052BF17
0052BEFA . 68 DDBE5200 push 0052BEDD ; /ProcNameOrOrdinal = "cmp"
0052BEFF . 50 push eax ; |hModule
0052BF00 . E8 4753EDFF call <jmp.&kernel32.GetProcAddress> ; \GetProcAddress
0052BF05 . 85C0 test eax, eax
0052BF07 .^ 0F84 0A60FFFF je 00521F17
0052BF0D . 6A 00 push 0
0052BF0F . 68 6C8B5400 push 00548B6C
0052BF14 . FFD0 call eax //调用dll里的函数cmp
0052BF16 . 61 popad
0052BF17 > E8 E2B4EDFF call 004073FE
0052BF1C . C3 retn


我自己写了一个dll,用来实现文件比较。编程老是学不会,见笑了。


Unit1 in 'Unit1.pas' {Form1}; //增加一个窗体

procedure cmp(file1,file2:pchar);stdcall;
begin
form1:=tform1.Create(nil);
form1.Edit1.Text:=file1;
form1.Edit2.Text:=file2;
form1.Show ;
end;
exports cmp;


窗体里的代码:

procedure myprint(p1,p2:pbyte); //比较and输出
var
x1,y1:integer;
x2,y2:integer;
i:byte;
begin
x1:=10;
y1:=10;

x2:=410;
y2:=10;
i:=0;
try
while true do
begin
if p1^<>p2^ then form1.listbox1.Canvas.Font.Color:=clred
else form1.listbox1.Canvas.Font.Color:=clblack;

form1.listbox1.Canvas.TextOut(x1,y1,inttohex(p1^,2));
form1.listbox1.Canvas.TextOut(x2,y2,inttohex(p2^,2));
x1:=x1+20;
x2:=x2+20;
i:=i+1;
inc(p1);
inc(p2);
if i>=16 then
begin
i:=0;
x1:=10;
y1:=y1+20;
x2:=410;
y2:=y2+20;
end;
end;
except
showmessage('完毕!');
end;

end;

procedure TForm1.Button3Click(Sender: TObject); //比较按妞的事件
var
file1,file2:file;
p1,p2:pbyte;
size1,size2:cardinal;

begin
if (fileexists(edit1.Text)) and (fileexists(edit2.Text)) then
begin
assignfile(file1,edit1.Text);
assignfile(file2,edit2.Text );
try
reset(file1,1);
reset(file2,1);
size1:=filesize(file1);
size2:=filesize(file2);
try
getmem(p1,size1);
getmem(p2,size2);
except
showmessage('分配内存出错!');
exit;
end;
blockread(file1,p1^,size1);
blockread(file2,p2^,size2);
//CreateThread(nil,0,@myprint,nil,0,threadid);
myprint(p1,p2);
freemem(p1);
freemem(p2);
finally
closefile(file1);
closefile(file2);
end;
end
else
showmessage('请先打开文件');
end;



说明&总结一下:
    1。我的winhex是12.75 SR-R6这个版本。
    2.程序里的listbox没有增加滚动条,当文件过长的时候,不能完整显示,我也不知道如何给listbox增加垂直滚动条。
    3.我的winhex从破解版变成未注册版,并且运行不稳定,经常出BUG。
    4.希望高手整一个给我这个菜鸟用用。
  5没能很好的选择已经打开的文件,象UE那样,只能选择一个 

效果图:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (23)
雪    币: 7852
活跃值: (2306)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
option 2008-12-13 17:33
2
0
???????????????
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 7 2008-12-13 17:48
3
0
我记得WINHEX本身有这个功能啊:
视图->同步与比较
雪    币: 213
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xpman 2008-12-14 07:33
4
0
不錯的文章,學起來!
Thanks.
雪    币: 7852
活跃值: (2306)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
option 2008-12-14 14:39
5
0
 
雪    币: 229
活跃值: (22)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
nujia 3 2008-12-14 16:08
6
0
我经常用winhex的二进制比较功能,不知道楼主怎么回事,
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2008-12-14 21:07
7
0
我也经常用这个功能的啊…
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
小娃崽 13 2008-12-15 09:44
8
0
原来winhex有文件比较的功能.
雪    币: 270
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
newice 2008-12-15 09:51
9
0
学习了,很少看见 PE 功能 DIY 的文章
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2008-12-16 16:48
10
0

3.我的winhex从破解版变成未注册版,并且运行不稳定,经常出BUG。
4.希望高手整一个给我这个菜鸟用用。

http://www.pediy.com/tools/Editors.htm
这里还有个14.8
貌似很稳定
雪    币: 436
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lionking 2008-12-18 21:57
11
0
这样的修改能够提高软件的功能,继续努力。
雪    币: 141
活跃值: (1125)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
mavermaver 3 2008-12-19 09:40
12
0
WinHex->View->Synchronize & Compare即为此功能(从13.xx起最多可以比较4个文件)。



但用TC: Files->Compare by Content...效果更好(只能比较2个文件)。
上传的附件:
雪    币: 156
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
aaa2520 1 2008-12-19 17:32
13
0
不错!
不错
不错!
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnmyths 2008-12-22 13:57
14
0
LZ你好,请问怎么找到这第二步消息处理的位置啊?

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
2.更改winhex原先的消息处理

引用:

00474F27  |> \8BC6          mov     eax, esi                         ; ESi等于ID
00474F29  |.  E8 CE24F9FF   call    004073FC
改成

引用:

00474F27  |> \8BC6          mov     eax, esi                         ; ESi等于ID
雪    币: 338
活跃值: (1688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sungy 1 2008-12-23 00:05
15
0
佩服这种精神
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
小娃崽 13 2008-12-23 09:32
16
0
LZ你好,请问怎么找到这第二步消息处理的位置啊?

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
2.更改winhex原先的消息处理

引用:

00474F27 |> \8BC6 mov eax, esi ; ESi等于ID
00474F29 |. E8 CE24F9FF call 004073FC
改成

引用:

00474F27 |> \8BC6 mov eax, esi ; ESi等于ID


我分析时的资料放在老东家的电脑上了,现在没机会接触电脑了,记得不大清楚,你下一个CreateFileA,断下来后在往回找看看..

佩服这种精神

别这么说,我会惭愧的
雪    币: 200
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kafly 2008-12-23 11:38
17
0
膜拜!!!!
我现在要利用程序里现成的函数都头疼
雪    币: 200
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kafly 2008-12-23 11:40
18
0
啊,是有源代码的。
我还以为是OD加。

-----
再仔细看看,哦,是挂上去新功能~~还是很弓虽!
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrylhj 2009-1-1 11:02
19
0
这难道就是传说中的PE Diy!
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
newjueqi 7 2009-2-1 19:26
20
0
来学习一下
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
心驰神野 2009-2-1 21:06
21
0
不管怎么样,学习了,谢谢分享!
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
panti 2009-2-11 15:54
22
0
能否给C32ASM加一个插件?
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhanzhanzh 2009-4-3 12:52
23
0
楼主,不知道你是从哪里加载那个Cmpfile.dll文件的???

如何查找???谢谢
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
小娃崽 13 2009-4-3 16:09
24
0
这么老的帖子还有人顶啊...我忘记说了,我把Cmpfile.dll改成cmp.dll
0052BEEC   .  68 DDBE5200      push    0052BEDD                         ; /FileName = "cmp"
0052BEF1   .  E8 CEACEDFF      call    <jmp.&kernel32.LoadLibraryA>     ; \LoadLibraryA
这样修改的时候就省了几个字节

00548B6C始终指向最新打开的完整文件路径。

这个可以下GetOpenFileNameA跟踪出来,
好象会保存文件名到一个数组那样的结构里

我现在主要搞数据库开发了,其实我很久不接触破解了
游客
登录 | 注册 方可回帖
返回