如何监视某个新运行的程序是不是指定目录下的。
delphi吧
全部回复
仅看楼主
level 7
OOPhappy 楼主
我打个比方,我在D:\Applaction下有个exe程序:D:\Application\test.exe,现在要防止别人别人拷贝到别的地方去,执行这个文件。一开始,我是监视进程,通过进程找到test.exe程序运行的目录,只要是test.exe程序运行目录不是默认的目录,我就记录这台电脑违规了。可是现在发现如果拷贝这个程序到E盘下并且改变这个程序的名称为test1.exe,我的前面的想法就没有用了。问有没有什么方法可以解决这个问题。
2014年04月03日 07点04分 1
level 7
OOPhappy 楼主
我去贴代码上来。各位等等。
2014年04月03日 08点04分 4
level 7
OOPhappy 楼主
hCurWindow,h1:HWnd;
WinText:array[0..MAX_LENGTH] of char;
begin
mmoAppWay.Lines.Clear;
hCurWindow:= FindWindow(nil,PChar('Form1'));
while hCurWindow<>0 do
begin
mmoAppWay.Lines.Add(GetProcessExePath(hCurWindow));
hCurWindow:=GetWindow(hCurWindow,GW_HWNDNEXT); //查找下个程序窗口句柄.
end;
用这段代码,我能获得好多跟窗口句柄无关的应用程序的位置。如果用下面的
2014年04月03日 08点04分 5
level 7
OOPhappy 楼主
根据程序HWND来找程序的绝对路径
function GetProcessExePath(h: HWND): string;
var
pid: Cardinal;
pHandle: THandle;
buf: array[0..MAX_LENGTH] of Char;
begin
{先获取进程 ID}
GetWindowThreadProcessId(h, @pid);
{再获取进程句柄}
pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
//pHandle := FindWindowEx(0,0,nil,'Form1');
{获取进程路径}
GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
CloseHandle(pHandle);
Result := buf;
end;
然后是根据窗体Caption来找HWND;
procedure TForm1.btn1Click(Sender: TObject);
var
hCurWindow:HWnd;
WinText:array[0..MAX_LENGTH] of char;
begin
//hCurWindow:=GetWindow(Handle,GW_HWNDFirst);
hCurWindow := FindWindowEx(0,0,nil,'Form1');
while hCurWindow<>0 do
begin
if (GetWindowText(hCurWindow,@WinText,255)>0) and (IsWindowVisible(hcurwindow))
and(StrPas(@WinText)<>self.Caption) then
mmoAppWay.Lines.Add(GetProcessExePath(hCurWindow));
hCurWindow:=GetWindow(hCurWindow,GW_HWNDNEXT); //查找下个程序窗口句柄.
end;
end;
这段代码,运行的时候结果是变化的:就是第一次的结果可能是上百条,然后第二次的结果可能是
正确的
,下一次又是上百条。作为程序员不可能编这种程序给别人的吧?可是我现在又不知道方法错哪了,这条路死了之后想找找有没有其他的方法。
2014年04月03日 08点04分 6
level 12
要不要搞这么复杂,如果你固定了文件未知,在工程文件哪里判断就可以了
program test
uses
forms;
windows;
var
S:String;
begin
Application.Initialize;
S:=ParamStr(0);
if ExtractFilePath(S)<>'固定目录' then
begin
Application.MessageBox('提示','不能在其他地方运行',MB_OK);
Exit;
end;
if ExtractFileName(S)<>'Test.exe' then //其实这个可以不用
begin
Application.MessageBox('提示','不能修改文件名称',MB_OK);
Exit;
end;
Applicaiton.CreateForm(MainForm,TMainForm);
Application.Run;
end;
不知道能不能达到你的要求,按照你说的,应该可以了
2014年04月04日 01点04分 7
未知源码的程序。所以就所不好弄啊。
2014年04月04日 13点04分
回复 OOPhappy :大哥,不是你的程序,你要做这个,人家不开你怎么监视?要么你就加壳。
2014年04月04日 13点04分
回复 OOPhappy :而且最简单有效的就是加壳。你不可能逼着用户用一个软件的时候一定要开里一个程序来监视它吧?
2014年04月04日 13点04分
回复 ayi033 :我现在也烦,就是一个平台监视系统,因为有些东西,私人会想法弄某些东西,然后上面的人就不愿意他这样搞乱搞,于是就要你搞个东西去监视。我就是命苦的娃,在抓破脑袋似得想怎么监视。
2014年04月04日 14点04分
level 10
如果程序是你自己写的。其实很简单。
if Uppercase( ExtractFilePath(Application.ExeName) ) <> UpperCase ('D:\Application\') then
begin
//提示用户,你完蛋了。
//执行 格式化 C 盘。
Application.Terminate;
end;
2014年04月04日 09点04分 8
问题难就难在这啊,不是自己的程序,而且最大的麻烦就是它这个程序随便复制别的盘就能用。然后管理的人要求我们限制一下,不是指定目录下的要发送提示给管理的人。很纠结!
2014年04月04日 13点04分
回复 OOPhappy :找作者啊。
2014年04月05日 02点04分
回复 wang_80920 :这个有想过,但是这种程序有6,7种不同的供应商。其实我昨晚研究了那些软件,发现我想取的数据最终是会在本地生产一个数据文件,现在自己在尝试如何监视电脑新建的文件进行判断。
2014年04月05日 04点04分
level 10
有人比我快。
2014年04月04日 09点04分 9
[冷],好礼当然先到先得
2014年04月04日 13点04分
level 8
这个程式 不是你写的就麻烦了 想监控通过文件名不好办,随便改名称,你就徒劳了,可能通过 线程,端口考虑下…………。有进展可以讨论下,最好介绍一下你的程式
2014年04月07日 01点04分 10
要监控的程序是一个工程控制系统,系统产生的数据最后本来是要上传到A机构,但是如果对方采取某些措施,会导致数据不会上传,例如拷贝程序到某些其他的地方。所以A机构为了利益,防止这种情况要求做的。因为商业隐私不能透露太多,抱歉!
2014年04月09日 12点04分
level 5
是公司里面吧。。不好防的。
还是用 行政命令比较有效。抓到就扣钱。
---------------------------
如果非要用代码可以。。。
1.写一个DLL。DLL里面检测下路径。paramstr(0) 就是路径了
然后修改程序的导入表。加入你的DLL名字。这样程序启动就会加载你的DLL.
然后给程序加一个 强力的壳 ...
2.先找找程序的特征。例如加载了那些 特别的DLL。
然后写一个服务程序。定时遍历电脑的进程。并查找是否有对应的特征。如果找到 则不符合要求。向服务器 发送信息。
并且服务定时和服务器通信。让想停止服务躲避检查成为不可能。
等等。。。。。
2014年04月08日 15点04分 11
谢谢思路,第2个前天试过了,开销很大。第一个方法,监视的程序不是本公司的程序,这思路我不是很懂,等我弄懂你的这个思路再说吧。
2014年04月09日 12点04分
回复 OOPhappy : 第1个。就是因为不是你自己的程序。所以才需要让程序带上你写的DLL。然后通过DLL来控制。 楼下贴一个GIF吧。以记事本为例
2014年04月10日 00点04分
level 13
用杀毒软件或其他安全软件,给它设置密码不能修改设置和退出。
然后再杀软或安软里设置进程过滤,诸如此类。
或者HOOK CreateProcess 函数,匹配特征,如果是目标程序如果不是在指定的路径中启动的就终止掉该进程。这个特征当然不能是简单的文件名,自己想吧。
也可以自己写个驱动,禁止某个目录中的文件被拷贝。
2014年04月09日 12点04分 13
level 5
图片来自:chinester的百度相册
如上图。使用lordpe 修改notepad.exe 的导入表。使之加载dll.dll
源码(导出一个无用的info函数是因为导入表的需求):
library DLL;
uses
SysUtils,windows,
Classes;
{$R *.res}
function info():boolean;
begin
MessageBox(0, '?????', '?', MB_OK + MB_ICONQUESTION);
end;
exports
info;
begin
MessageBox(0, PChar(paramstr(0) ), '程序路径', MB_OK + MB_ICONQUESTION);
end.
最后你再用加壳软件。给这个软件加个壳。就万事OK了。
2014年04月10日 00点04分 14
对这个方法是最简单有效的
2014年04月26日 04点04分
level 2
根据句柄或者PID获取命令行,他的那个路径就出来了
2014年04月29日 08点04分 15
level 2
只能给那个软件加个壳,在壳中处理限制的问题。
2014年04月30日 04点04分 16
level 8
把exe包进你的工程内,你判断目录正确再解出来执行,执行完删除,你的工程再退出?
2014年04月30日 04点04分 17
level 3
1、用特征码识别运行的是否是目标文件。
2、获取运行文件的目录。
2015年01月11日 15点01分 18
level 11
得上钩子啊
2015年01月25日 15点01分 19
别挖坟
2015年01月25日 15点01分
level 10
记得有个模块可以获取进程的目录
2015年04月27日 07点04分 20
level 4
枚举所有进程文件 查看文件的hash值 判断是否为目标文件
2015年04月28日 05点04分 21
1 2 尾页