1、申 请 I D:雨耕山
2、个人邮箱:km315@qq.com
3、原创技术文章,在看雪安全论坛被评为精华,地址是:http://bbs.pediy.com/showthread.php?t=140103
IDA,">标 题: 屏录专家DIY
作 者: 雨耕山
时 间: 2011-09-14,11:24:37
链 接: http://bbs.pediy.com/showthread.php?t=140103
【软件大小】: 2.34M
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 注册码
【编写语言】: Borland C++ 1999
【使用工具】: PEID,OD,LordPE
【软件介绍】: 录制电脑屏幕、声音
【作者声明】: 只谈技术,共同提高,欢迎批评指正
在使用屏幕录像专家过程中,发现录制的视频默认的的文件名是“录像1、2、3”,而我需要的是按录像开始时间命名的文件, 遂对“屏录专家”进行了改造。
一、查壳:用PEID查了一下屏录专家的主文件,无壳,省了点事。
二、去自校验:随便改了一下文件的资源,运行后提示文件被破坏,这显然是文件有校验,这里不给出详细去校验的过程,只给出怎么修改。自校验修改针对屏幕录像专家V2011 Build0726版本。
三、改造思路:为使视频文件用开始录制的时间命名,只要在开始录制时,能在如图红圈所示的地方自动写入当前电脑日期时间即可,为减小劳动量,我用delphi xe写了一个dll,在合适的地方调用dll即可。
四、dll的编写:
具体代码如下:
library SetTime;
uses
ShareMem, SysUtils, Windows, Messages, Classes;
function GetHwnd: THandle;
const
A_szClassName: array [0 .. 5] of PChar = ('TMainForm', 'TPageControl', 'TTabSheet', 'TPageControl', 'TTabSheet', 'TEdit');
A_szWinName: array [0 .. 5] of PChar = ('屏幕录像专家 V2011', '', '录像模式 ', '', '基本设置', '');
var
i: Integer;
hLastWin: THandle;
t: TDateTime;
begin
hLastWin := FindWindow(A_szClassName[0], A_szWinName[0]); // 先取顶级父窗口句柄
for i := 1 to 5 do
begin
hLastWin := FindWindowEx(hLastWin, THandle(nil), A_szClassName, A_szWinName);
end;
hLastWin := GetWindow(hLastWin, 2);
Result := hLastWin;
end;
procedure MySetTime;stdcall;
var
txtHwnd: THandle;
t: TDateTime;
StrT: String;
begin
txtHwnd := GetHwnd;
t := Now;
StrT := DateTimeToStr(t);
StrT := StringReplace(StrT, ':', '时', []);//替换不能做文件名的几个字符串(下同)
StrT := StringReplace(StrT, ':', '分', []);
StrT := StringReplace(StrT, '/', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '\', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '*', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '|', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '?', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '<', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '>', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, '"', '-', [rfReplaceAll, rfIgnoreCase]);
StrT := StringReplace(StrT, ' ', '(', []);
StrT := StrT + '秒)';
SendMessage(txtHwnd, WM_SETTEXT, 0, LParam(StrT));
end;
exports
MySetTime;
{$R *.res}
begin
end.
五、在主文件输入表中添加自己写的dll:
我用的是LordPE(用 PEditor 1.7会出错,不知为何),如下图所示,很详细,目的就是让新手看完本文后可以独立完成改造。
六、在文件中调用dll中的函数(过程):
完成以上所有工作以后,就可以用OD来调试了,用OD加载目标文件运行后,在如图所示的文件名的文本框中填入不能用来做文件名的字符串(我填的是“<>”),点击录像后提示“文件已经存在,换一个文件名。”这不是已存在的问题,是Windows不允许“<>”作为文件名。
根据提示,很容易来到下面的位置:
004089F3 . FF8D E0FCFFFF dec dword ptr ss:[ebp-320]
004089F9 E8 22DC1600 call 00576620----------------------// 改为 call [686018],这是自已dll中的函数地址,在用LordPE添加函数引用时可以看到。
004089FE 59 pop ecx-------------------------------------// NOP
004089FF 84C9 test cl,cl--------------------------------// NOP
00408A01 0F84 13010000 je 00408B1A
00408A07 . 66:C785 D4FCFFFF 70>mov word ptr ss:[ebp-32C],170
00408A10 . 8D85 38FFFFFF lea eax,dword ptr ss:[ebp-C8]
00408A16 . E8 7D8FFFFF call 00401998
00408A1B . 50 push eax
00408A1C . FF85 E0FCFFFF inc dword ptr ss:[ebp-320]
00408A22 . BA 843C5900 mov edx,00593C84 ; 已经存在,请换一个文件名
00408A27 . 8D85 3CFFFFFF lea eax,dword ptr ss:[ebp-C4]
00408A2D . E8 E6D81600 call 00576318
00408A32 . FF85 E0FCFFFF inc dword ptr ss:[ebp-320]
00408A38 . 8D95 3CFFFFFF lea edx,dword ptr ss:[ebp-C4]
00408A3E . 52 push edx
00408A3F . 6A 00 push 0
00408A41 . 6A 00 push 0
完成改造后,我们测试一下,生成的视频文件果然是开始录像的时间,达到我的目的。
plzjDiy.rar
(387.1 KB, 下载次数: 13)
|