归档: 2018

动态逆向调试工具OllyDbg

OllyDbg是一个32位汇编级分析调试器。对二进制代码分析功能使它在不知道可执行文件源码的情况下特别有用。OllyDbg是一个共享软件。功能特点:直观的用户界面,没有复杂的命令;代码分析-跟踪寄存器,识别过程,循环,API调用,开关,表,常量和字符串;直接加载和调试DLL;对象文件扫描——从对象文件和库中查找例程;允许用户定义的标签、注释和功能描述;理解在Borland®格式的调试信息;修改汇编代码后可直接保存为可执行文件;开放体系结构-许多第三方插件可用;纯绿色,没有安装-注册表或系统目录中没有垃圾;调试多线程应用程序;附加到运行的程序;可配置的反汇编程序,支持MASM和理想的格式;MMX,3dnow!和SSE数据类型和指令,包括Athlon扩展;完整的Unicode支持;动态识别ASCII和Unicode字符串-也用Delphi格式!识别复杂的代码结构,如调用跳转到过程。解码调用超过1900个标准API和400个C函数;从外部帮助文件对API函数提供上下文敏感帮助;设置条件、日志、内存和硬件断点;跟踪程序执行,记录已知函数的参数;还有很多,更多!总之OllyDbg就是Ring3级的调试器,将IDA与SoftICE结合起来的思想,非常容易上手!OllyDbg英文官方网站:http://www.ollydbg.de/ 中文站 http://www.ollydbg.net/ OllyDbg1.10官网下载地址 http://www.ollydbg.de/odbg110.zip OllyDbg 1.10看雪下载地址 https://tool.pediy.com/index-detail-1.htm 吾爱破解专用版OllyDbg下载地址 http://down.52pojie.cn/Tools/Debuggers/吾爱破解专用版Ollydbg.rar 吾爱破解专用版OllyDbg更新日志 2016年1月21日更新如下:1、默认勾选“解码修饰符号名称(Demangle symbolic names)”,方便调试分析MFC类程序。2、本次更新后压缩包:9413A89DE76D48B0D6F1807A6A42BAB7 吾爱破解专用版Ollydbg.rar 2015年12月14日更新如下:1、删除ILLY.dll和ODbgScript_Win2k.dll插件,由于部分同学机器未装.NET会报错。2、添加OllyDisasm201插件。(http://www.52pojie.cn/thread-443516-1-1.html)3、将“路径修复工具”静态编译,方便没装运行库的xp机器也能运行。4、本次更新后压缩包:E138F9543C5A0953DDBCA95AFDACF8FE 吾爱破解专用版Ollydbg.rar 2015年7月2日更新如下:1、更新ILLY插件修复调试.NET程序异常的问题,感谢@凉游浅笔深画眉 反馈http://www.52pojie.cn/thread-366158-1-1.html。2、添加一个loadmap插件、更新字符串搜索插件、删除一些不必要的文件,完善一些细节。3、添加白底黑字配置,需要请自行将”ollydbg_白底黑字配置.ini“替换成”ollydbg.ini“。4、增加ollydbg.ini中的路径自动修复程序。5、本次更新后压缩包:57CFF212D319E7A693D6F7D44465BF54 吾爱破解专用版Ollydbg.rar 2015年4月10日更新如下:1、对Ollydbg的窗口签名进行了更改,从而避免被针对性检测。2、对Ollydbg的菜单做出调整。3、针对一些有可能被检测的插件进行了删减。4、修改了一些可能被检测的内容。5、更新ollydbg的插件为目前较新的版本。

RemoteAdo数据库中间件爆破分析(RemoteAdo破解版)

RemoteAdo是一款数据库中间件,官网为http://www.remoteado.cn/ 本爆破教程基于RemoteAdo标准版4.2分析! 下载RemoteAdo标准版4.2,使用die1.01分析,RemoteAdoServer.exe主程序加壳为ASPack(2.12) 使用WASPACK脱掉 用OD载入,插件打开api常用断点下MessageBoxA断点,为什么下这个断点呢?因为点注册的时候会弹出序列号无效 ,断点下好后,按F9运行,按RemoteAdo软件界面中的其他选项卡中的“请注册”,在弹出的窗口中任意输入序列号然后点击注册按钮!这时在OD中已经断下了,按一次Ctrl+F9,再切换到RemoteAdo软件界面,这时提示“序列号无效”,点确定,然后切换为OD,再按一次Ctrl+F9,OD中返回到RemoteAdo的软件领空! 我们看右边寄存器显示有“序列号无效”和“软件注册”等字样! 从此处(00483E18)往上看汇编代码,看是哪儿跳到这儿来的!找到00483E18看从哪儿跳来的,我不习惯使用od看,觉得不够清晰,我喜欢使用w32dasm看,在W32Dasm中shift+f12输入00483E18,往上看,一直到上面这儿(为什么到这儿,你可以从00483E18上面的多个跳转分别下断点测试,那些都是显示序列号无效的相关代码) 在00483CC4开始到00483E18都是显示序列号无效的代码,(我们可以切换回OD在00483CC4处双击,写入汇编代码 retn,不执行直接返回,这时你可以重新运行点注册,会什么反应也没有!) 在00483CC4上方显示,调用此call的地址有7个,我们分别在以上7个调用地址前下断点,重新点击注册,看会不会断下!经过测试会在倒数第二个0056204E处断下!在W32Dasm中shift+F12,跳转到0056204E处!往上看代码,到底是谁调用了序列号无效的提示代码! 看到这段代码 其中00561FC3处的call就是序列号算法函数,爆破只需要在OD中把00561FCA处填充NOP代码即可!NOP后,这时点软件中的注册会提示注册成功,但重启软件后,还是只有5个连接数! 以下是去掉连接数及破解版内容 在W32Dasm中我们在00561FC3处点击Call按钮,看哪些地方调用了这个注册算法函数,到这儿 有两处,一处就是0055B9AB,这处是启动软件判断是否注册的,一处是00561FC3,就是我们点注册按钮判断是否注册的!在OD中我们跳到0055B9AB处,把下面的je代码NOP掉,然后保存修改的文件,就OK了!至于算法,分析太麻烦了,有兴趣自己折腾!爆破后没有5个用户连接数限制,以下是10个连接数图! 后话:因为前面分析中看到有7处调用了,序列号无效的函数,我们这儿只修改了两处,所以如果你使用中存在提示序列号无效的问题,那就需要在另外5处也用相同的方法进行修改!只修改两处,使用中暂没发现有什么问题! 按上面分析修改好两处的成品下载 链接:https://pan.baidu.com/s/1gg9jHa7 密码:sbrw 解压密码 bnwin.com

delphi如何在Ring3下跨进程获取DLL信息

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250unit APIUnit;{ GetProcessModuleHandle API Unit Ring3调用NtQueryInformationProcess实现跨进程获取DLL句柄 }interfaceUSES Winapi.Windows,System.SysUtils;type USHORT = Word; UNICODE_STRING = packed Record Length : USHORT; MaximumLength: USHORT; Buffer : PWideString; end; RTL_USER_PROCESS_PARAMETERS = packed record Reserved1 : array[0..15] of Byte; Reserved2 : array[0..9] of Pointer; ImagePathName: UNICODE_STRING; CommandLine : UNICODE_STRING; end; PRTL_USER_PROCESS_PARAMETERS = ^RTL_USER_PROCESS_PARAMETERS; _PEB_LDR_DATA = record Length: ULONG; Initialized: BOOLEAN; SsHandle: pointer;//PVOID; InLoadOrderModuleList: LIST_ENTRY; InMemoryOrderModuleList: LIST_ENTRY; InInitializationOrderModuleList: LIST_ENTRY; end {_PEB_LDR_DATA}; PEB_LDR_DATA = _PEB_LDR_DATA; PPEB_LDR_DATA = ^_PEB_LDR_DATA; _LDR_MODULE = record InLoadOrderModuleList: LIST_ENTRY; InMemoryOrderModuleList: LIST_ENTRY; InInitializationOrderModuleList: LIST_ENTRY; BaseAddress: pointer; EntryPoint: pointer; SizeOfImage: ULONG; FullDllName: UNICODE_STRING; BaseDllName: UNICODE_STRING; Flags: ULONG; LoadCount: SmallInt; TlsIndex: SmallInt; HashTableEntry: LIST_ENTRY; TimeDateStamp: ULONG; end {_LDR_MODULE}; LDR_MODULE = _LDR_MODULE; PLDR_MODULE = ^_LDR_MODULE; _PEB_FREE_BLOCK = record Next:Pointer; Size:ULONG; end; PPEB_FREE_BLOCK = ^_PEB_FREE_BLOCK; PEB = packed record InheritedAddressSpace:Boolean;// 00h ReadImageFileExecOptions:Boolean; // 01h BeingDebugged:Boolean; //02H Spare:Boolean; Mutant:THandle; ImageBaseAddress:Pointer; LoaderData:Pointer; //0C ProcessParameters:Pointer; SubSystemData:Pointer; ProcessHeap:Pointer; FastPebLock:Pointer; FastPebLockRoutine:PPointer; FastPebUnlockRoutine:PPointer; EnvironmentUpdateCount:ULONG; KernelCallbackTable:^Pointer; EventLogSection:Pointer; EventLog:Pointer; FreeList:PPEB_FREE_BLOCK; TlsExpansionCounter:ULONG; TlsBitmap:Pointer; TlsBitmapBits:array [0..$2] of ULONG; ReadOnlySharedMemoryBase:Pointer; ReadOnlySharedMemoryHeap:Pointer; ReadOnlyStaticServerData:^Pointer; AnsiCodePageData:Pointer; OemCodePageData:Pointer; UnicodeCaseTableData:Pointer; NumberOfProcessors:ULONG; NtGlobalFlag:ULONG; Spare2:array [0..$4] of Byte; CriticalSectionTimeout:LARGE_INTEGER; HeapSegmentReserve:ULONG; HeapSegmentCommit:ULONG; HeapDeCommitTotalFreeThreshold:ULONG; HeapDeCommitFreeBlockThreshold:Ulong; NumberOfHeaps:ULONG; MaximumNumberOfHeaps:ULONG; ProcessHeaps:PPointer; GdiSharedHandleTable:Pointer; ProcessStarterHelper:Pointer; GdiDCAttributeList:Pointer; LoaderLock:Pointer; OSMajorVersion:ULONG; OSMinorVersion:ULONG; OSBuildNumber:ULONG; OSPlatformId:ULONG; ImageSubSystem:ULONG; ImageSubSystemMajorVersion:ULONG; ImageSubSystemMinorVersion:ULONG; GdiHandleBuffer:array [0..$22] of ULONG; PostProcessInitRoutine:ULONG; TlsExpansionBitmap:ULONG; TlsExpansionBitmapBits: array [0..$80] of Byte; SessionId:ULONG; end; PPEB = ^PEB; PROCESS_BASIC_INFORMATION = packed record ExitStatus : DWORD; PebBaseAddress: PPEB; AffinityMask : DWORD; BasePriority : DWORD; uUniqueProcessId: ULong; uInheritedFromUniqueProcessId: ULong; end; TProcessBasicInformation = PROCESS_BASIC_INFORMATION; function NtQueryInformationProcess( ProcessHandle: THandle; {进程句柄} ProcessInformationClass: Byte; {信息类型} ProcessInformation: Pointer; {缓冲指针} ProcessInformationLength: ULONG; {以字节为单位的缓冲大小} ReturnLength: PULONG {写入缓冲的字节数} ): DWORD; stdcall; external 'ntdll.dll';function GetProcessModuleHandle(dwProcessID:DWORD;DllName:PChar):DWORD;implementation function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean):Boolean; var TP: TOKEN_PRIVILEGES; Dummy: Cardinal; begin try TP.PrivilegeCount := 1; LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid); if bEnable then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy); except end; Result :=True; end; function EnableDebugPrivilege: Boolean; var hToken: THandle; begin Result := False; try OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken); EnablePrivilege(hToken, 'SeDebugPrivilege', True); CloseHandle(hToken); Result :=True; except end; end; function GetProcessModuleHandle(dwProcessID:DWORD;DllName:PChar):DWORD; var hProcess:DWORD; PBI:TProcessBasicInformation; r,ret:DWORD; readByte: SIZE_T; PEBType:PPEB; PLD :PPEB_LDR_DATA; PME :PLDR_MODULE; PEBDLLName:PChar; const Size:DWORD = 255; begin Result := 0; GetMem(PEBType,SizeOf(PEB)); ZeroMemory(PEBType,SizeOf(PEB)); GetMem(PLD,SizeOf(PEB_LDR_DATA)); ZeroMemory(PLD,SizeOf(PEB_LDR_DATA)); GetMem(PME,SizeOf(LDR_MODULE)); ZeroMemory(PME,SizeOf(LDR_MODULE)); GetMem(PEBDLLName,Size); try //提升进程权限 if not EnableDebugPrivilege then begin OutputDebugStringW('Do not have Debug privilege'); //无法提升调试权限 end; //如果PID为0则获取自身的伪句柄,如果不是则获取指定PID的句柄 if dwProcessID <> 0 then //打开进程,需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,dwProcessID) else hProcess := GetCurrentProcess; //调用NtQueryInformationProcess获取结构信息 ret := NtQueryInformationProcess(hProcess,0,@PBI,SizeOf(PBI),@r); //正常情况下ret是0,如果不是则认为错误 if ret = 0 then begin //获取PEB结构 ReadProcessMemory(hProcess,PBI.PebBaseAddress,PEBType,SizeOf(PEB),readByte); //获取PLD结构 ReadProcessMemory(hProcess,PEBType.LoaderData,PLD,SizeOf(PEB_LDR_DATA),readByte); //获取第一个PME ReadProcessMemory(hProcess,PLD.InLoadOrderModuleList.Flink,PME,SizeOf(LDR_MODULE),readByte); //循环 while True do begin //清零缓冲区 ZeroMemory(PEBDLLName,Size); //读取buff到内存中,获取当前结构的DLL名 if not ReadProcessMemory(hProcess,PME.BaseDllName.Buffer,PEBDLLName,PME.BaseDllName.Length,readByte) then Break; //对比DLL名称,不区分大小写 if LowerCase(AnsiString(PEBDLLName)) = LowerCase(AnsiString(DllName)) then begin //调试信息 OutputDebugStringW(PEBDLLName); //返回DLL的句柄 Result := dword(pme.BaseAddress); //退出循环 Break; end; //调试信息 OutputDebugStringW(PEBDLLName); //如果下一个结构为开始的结构,则认为链表已经枚举完了 if PME.InLoadOrderModuleList.Flink = PLD.InLoadOrderModuleList.Flink then Break; //读取下一个结构 if not ReadProcessMemory(hProcess,PME.InLoadOrderModuleList.Flink,PME,SizeOf(LDR_MODULE),readByte) then Break; end; end else begin //返回错误信息 OutputDebugStringW('Error!NtQueryInformationProcess Error!'); end; finally //释放使用的内存 FreeMem(PEBDLLName,Size); FreeMem(PME,SizeOf(LDR_MODULE)); FreeMem(PLD,SizeOf(PEB_LDR_DATA)); FreeMem(PEBType,SizeOf(PEB)); end; end;end.

delphi在ring3阻止文件删除(8圈桌面广告图标生成原理)

8圈网管计费系统,最近在桌面生成图标,直接删除会提示服务和应用管理程序已经打开,无法删除,8圈计费系统先生成url快捷图标,然后打开这个快捷方式取得句柄,再使用DuplicateHandle复制句柄丢给系统进程services.exe,达到占用文件,删除8圈桌面图标就不行了!8圈桌面图标阻止删除的方法关键地方就是使用了DuplicateHandle这个API,看看下面的代码! 12345678910111213141516171819202122232425262728293031323334353637383940414243function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;//提权varhToken: THandle;tp: TOKEN_PRIVILEGES;a: DWORD;constSE_DEBUG_NAME = 'SeDebugPrivilege';beginResult := False;if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) thenbegintp.PrivilegeCount := 1;LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);if bEnabled thentp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLEDelsetp.Privileges[0].Attributes := 0;a := 0;AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);Result := GetLastError = ERROR_SUCCESS;CloseHandle(hToken);end;end; function DupFile(FileName:String;PID:Cardinal):Boolean;varhFile,hProcess,hTarget:THandle;beginResult := False;EnabledDebugPrivilege(True);hProcess := OpenProcess(PROCESS_DUP_HANDLE, False, PID);Tryif hProcess <> 0 thenbeginhFile := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, Create_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);if hFile = INVALID_HANDLE_VALUE then Exit;Result := DuplicateHandle(GetCurrentProcess(), hFile, hProcess, @hTarget,0, False, DUPLICATE_SAME_ACCESS or DUPLICATE_CLOSE_SOURCE);end;FinallyCloseHandle(hProcess);End;end; 8圈在桌面生成图标就是利用上面的原理!实际改一下就是这样 123456789101112131415161718192021222324252627282930313233343536procedure TForm1.btn2Click(Sender: TObject); function GetPid(ExeFileName: string): THandle; //根据进程名返回进程PID const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then begin Result :=FProcessEntry32.th32ProcessID; Break; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end;var fhand:THandle; hProcess,hFile:THandle;begin fhand:=FileOpen(PWideChar(edt1.Text),GENERIC_READ);//取得阻止删除的文件句柄 EnabledDebugPrivilege; hProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetPid('services.exe')); if DuplicateHandle(GetCurrentProcess(), fhand,hProcess, @hFile, 0 ,FALSE, DUPLICATE_SAME_ACCESS) then ShowMessage('文件占坑成功!'); CloseHandle(hProcess);end;

delphi如何在win7中远程注入代码

一. delphi远程注入Dll文件 首先,您必须找到已经在内存中运行的应用程序(EXE)的PID。以下函数将通过名称获得PID1234567891011121314151617181920212223function PIDbyName(ProcessName: PWideChar): DWORD;var ProcessSnap: Int64; ProcessEntry32: TProcessEntry32;begin Result := 0; ProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if ProcessSnap <> INVALID_HANDLE_VALUE then begin ProcessEntry32.dwSize := SizeOf(TPROCESSENTRY32); if Process32First(ProcessSnap, ProcessEntry32) then repeat if lstrcmpi(ProcessEntry32.szExeFile, ProcessName) = 0 then begin Result := ProcessEntry32.th32ProcessID; CloseHandle(ProcessSnap); exit; end; until not Process32Next(ProcessSnap, ProcessEntry32); Result := 0; CloseHandle(ProcessSnap); end;end; 这是32/64位应用程序的DLL注入函数 Source是DLL,Target是EXE123456789101112131415161718192021222324252627282930function InjectDLL(Source, Target : PWideChar) : boolean;var dwThreadID: Cardinal; hProc, hThread: THandle; BytesToWrite, BytesWritten: SIZE_T; pRemoteBuffer, pLoadLibrary: Pointer;begin hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, PIDbyName(Target)); if hProc = 0 then exit(false); try BytesToWrite := SizeOf(WideChar) * (Length(Source) + 1); pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT,PAGE_READWRITE); if pRemoteBuffer = nil then exit(false); try if not WriteProcessMemory(hProc, pRemoteBuffer, Source, BytesToWrite, BytesWritten) then exit(false); pLoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW'); hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer, 0, dwThreadID); try WaitForSingleObject(hThread, INFINITE); finally Result := true; CloseHandle(hThread); end; finally VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE); end; finally CloseHandle(hProc); end;end; 简单的DLL12345678910111213141516171819202122232425library testDLL; uses System.SysUtils, System.Classes, Winapi.Windows; {$R *.res} procedure DLLEntryPoint(dwReason: DWord);var DLLHandle : DWORD;begin case dwReason of DLL_PROCESS_ATTACH: MessageBox(DLLHandle, 'Process Attach', 'Info', mb_Ok); DLL_PROCESS_DETACH: MessageBox(DLLHandle, 'Process Detach', 'Info', mb_Ok); end;end; begin DllProc := @DLLEntryPoint; DllEntryPoint(DLL_PROCESS_ATTACH);end. 用法:InjectDLL(‘testDLL.dll’, ‘yourapplication.exe’)二. delphi远程直接注入代码执行(非DLL插入是代码注入)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394//-------------------------注入代码的函数---------------------------- {参数说明: InHWND:被注入的窗口句柄 Func:注入的函数的指针 Param:参数的指针 ParamSize:参数的大小 } procedure InjectFunc(InHWND: HWND; Func: Pointer; Param: Pointer; ParamSize: DWORD); var hProcess_N: THandle; ThreadAdd, ParamAdd: Pointer; hThread: THandle; ThreadID: DWORD; lpNumberOfBytes:DWORD; begin GetWindowThreadProcessId(InHWND, @ThreadID); //获得窗口ID hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);//打开被注入的进程 ThreadAdd := VirtualAllocEx(hProcess_N, nil, 4096, MEM_COMMIT, PAGE_READWRITE); //申请写入代码空间 WriteProcessMemory(hProcess_N, ThreadAdd, Func, 4096, lpNumberOfBytes); //写入函数地址 ParamAdd := VirtualAllocEx(hProcess_N, nil, ParamSize, MEM_COMMIT, PAGE_READWRITE); //申请写入代码参数空间 WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes); //写入参数地址 hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes); //创建远程线程 ResumeThread(hThread); //直接运行线程 CloseHandle(hThread); //关闭线程 VirtualFreeEx(hProcess_N, ThreadAdd, 4096, MEM_RELEASE); VirtualFreeEx(hProcess_N, ParamAdd, ParamSize, MEM_RELEASE); //释放申请的地址 CloseHandle(hProcess_N); //关闭打开的句柄 end; //-----------------------------定义一个参数类型----------------------- type TPickCallParam = packed record ax, ay: single; end; PPickCallParam = ^TPickCallParam; //指向结构的指针(C中叫这种方式的数据应该叫结构体吧) procedure runCall(p:PPickCallParam);stdcall; // 走路call var addres,addres1,addres2:pointer; x,y:single; begin addres:=pointer($0045ec00); addres1:=pointer($00462620); addres2:=pointer($0045f000); x:=p^.ax; //目的地X坐标 y:=p^.ay; //目的地Y坐标 asm pushad mov eax, dword ptr [$8f207c] mov eax, dword ptr [eax+$1C] mov esi, dword ptr [eax+$20] mov ecx, dword ptr [esi+$ba0] push 1 call addres mov edi, eax lea eax, dword ptr [esp+$18] push eax push 0 mov ecx, edi call addres1 push 0 push 1 push edi mov ecx, dword ptr [esi+$ba0] push 1 call addres2 mov eax, dword ptr [$8f207c] mov eax, dword ptr [eax+$1C] mov eax, dword ptr [eax+$20] mov eax, dword ptr [eax+$ba0] mov eax, dword ptr [eax+$30] mov ecx, dword ptr [eax+4] mov eax, x mov [ecx+$20], eax mov eax, y mov [ecx+$28], eax popad end; END; procedure TForm1.Button1Click(Sender: TObject);//在控件中做个按钮 测试 var CallParam:TPickCallParam; begin; getmem(pname,33); myhwnd := FindWindow(nil,'Element Client');{查找窗口句柄} GetWindowThreadProcessId(myhwnd, aproc); {得到窗口ID} phnd := OpenProcess(PROCESS_VM_READ , False, aproc);{以完全访问权限打开进程句柄} if (phnd<>0 ) then begin CallParam.ax:= 1860.0; //给注入代码函数赋值 CallParam.ay:=120.0; //给注入代码函数赋值 InjectFunc(myhWnd,@runCall,@CallParam,SizeOf(CallParam)); //运行注入代码函数 sleep(100); CloseHandle(PHND) //关闭进程 end; end; 三. 远程代码或DLL注入x86/x64/Win2k/win7~Win8.1 64位全可用(最重要的隆重登场)上面的一和二远程注入,在win7 64位系统下,不能成功注入service服务程序,下面代码实现在64位系统,可以注入系统进程,服务进程等!看关键函数NtCreateThreadEx,而在win7 64位下的注入问题http://forum.sources.ru/index.php?showtopic=313636有相应讨论123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116program Inject; {$APPTYPE CONSOLE} {$IF CompilerVersion >= 21.0}{$WEAKLINKRTTI ON}{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}{$IFEND} uses Winapi.Windows; Type NtCreateThreadExProc = Function(Var hThread:THandle; Access:DWORD; Attributes:Pointer; hProcess:THandle; pStart:Pointer; pParameter:Pointer; Suspended:BOOL; StackSize, u1, u2:DWORD; Unknown:Pointer):DWORD; stdcall; Function CheckOs():Boolean;Var lpVersionInformation :TOSVersionInfoW;begin Result := False; if GetVersionExW(lpVersionInformation) then begin if lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_NT Then begin if (lpVersionInformation.dwMajorVersion < 6) then begin Result := True; end; end; end;end; Function EnableDebugPrivilege():Boolean;Var hToKen :THandle; TokenPri :TTokenPrivileges;begin Result := False; if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES, hToKen)) Then begin TokenPri.PrivilegeCount := 1; If LookupPrivilegeValueW(Nil, 'SeDebugPrivilege', TokenPri.Privileges[0].Luid) Then begin TokenPri.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; Result := AdjustTokenPrivileges(hToken, False, TokenPri, SizeOf(TTokenPrivileges), Nil, PDWORD(Nil)^); end Else Writeln('LookupPrivilege Error'); CloseHandle(hToKen); end;end; Function RemoteThread(hProcess:THandle; pThreadProc:Pointer; pRemote:Pointer):THandle;Label NtCreate, Create;Var pFunc :Pointer; hThread :THandle;begin hThread := 0; if Not CheckOs() then //根据系统版本来选择使用的API begin NtCreate: pFunc := GetProcAddress(LoadLibraryW('ntdll.dll'), 'NtCreateThreadEx'); if pFunc = Nil then Goto Create; NtCreateThreadExProc(pFunc)(hThread, $1FFFFF, Nil, hProcess, pThreadProc, pRemote, False, 0, 0, 0, Nil); if hThread = 0 then Goto Create; end Else begin Create: hThread := CreateRemoteThread(hProcess, Nil, 0, pThreadProc, pRemote, 0, PDWORD(Nil)^); end; Writeln('RemoteThread Ok!'); Result := hThread;end; Function InjectDll2Pid(szPath:PWideChar; uPID:DWORD):Boolean;Var hProcess :THandle; hThread :THandle; szRemote :PWideChar; uSize :SIZE_T; uWrite :SIZE_T; pStartAddr:Pointer;begin Result := False; if EnableDebugPrivilege then begin //先提升下进程的权限 hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, uPID); if hProcess > 0 then begin uSize := lstrlenW(szPath) * 2 + 4; szRemote := VirtualAllocEx(hProcess, Nil, uSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if WriteProcessMemory(hProcess, szRemote, szPath, uSize, uWrite) And (uWrite = uSize) then begin pStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'LoadLibraryW'); hThread := RemoteThread(hProcess, pStartAddr, szRemote); Result := hThread <> 0; CloseHandle(hThread); end Else begin Writeln('WriteMemory Error'); end; end; end; end; Function StrToInt(S: String): Integer;Var E: Integer;Begin Val(S, Result, E);End; begin InjectDll2Pid(PWideChar(ParamStr(2)), StrToInt(ParamStr(1)));end. NtCreateThreadEx注入注意事项:64位的进程,只能使用64位的dll注入,注入程序本身也必须编译为64位程序,32位的进程,只能使用32位的dll注入,注入程序本身编译为32位程序,不然会注入不成功!比如你把程序编译为32程序,想在win7 64位下往services.exe注入,是不会成功的,services.exe在win7 64位下是64位程序!

音悦台MTV视频MP4真实地址PHP解析源码

音悦Tai,主要提供MTV在线播放功能,官网http://www.yinyuetai.com/ ,有时我们需要下载音悦台的MTV的时候,按照官方的下载很多限制,这儿使用PHP直接解析出音悦台的MTV源地址,可以直接下载!音悦台MTV视频真实地址PHP解析源码如下: 12345678910111213141516171819202122232425262728@header('Content-type: text/html;charset=UTF-8');$url=isset($_GET['url'])?trim($_GET['url']):'';//http://v.yinyuetai.com/video/2185713$time=$_SERVER['REQUEST_TIME'];$content = file_get_contents($url);//获取标题preg_match('/property="og:title"[\s]+content="([^"]*)".*?>/i',$content,$title);//获取封面preg_match('/property="og:image" content="([^"]*)".*?>/',$content,$images);//获取MV的IDpreg_match('/[\d]+/',$url,$song_id);$title=$title[1];$images=$images[1];$song_id=$song_id[0];//解析json$songurl = "http://www.yinyuetai.com/api/info/get-video-urls?callback=callback&videoId=".$song_id."&_=".$time;$data = file_get_contents($songurl);if (strpos($data, "callback") !== false){ $lpos = strpos($data, "("); $rpos = strrpos($data, ")"); $data = substr($data, $lpos + 1, $rpos - $lpos -1);}$json= json_decode($data,true);echo $title."<br/>";echo "流畅地址:".$json['hcVideoUrl']."<br/>";echo "高清地址:".$json['hdVideoUrl']."<br/>";echo "超清地址:".$json['heVideoUrl']."<br/>";echo "<img src=\"".$images."\"/>"; 看看解析效果

Unigui如何打印?Grid++Report锐浪报表解决方法

uniGUI is a Web Application Framework for Delphi,unigui使delphi使用extjs快速的开发web程序,unigui符合delphi开发者的习惯,开发web就象开发桌面程序一样。但unigui中打印没有好的办法,因为是web,所以要么是直接打印html代码,要么是生成pdf,然后打印,这儿我们介绍的是unigui中使用Grid++Report锐浪报表打印方法,使用Grid++Report锐浪报表需要事先安装Grid++Report锐浪报表插件,如果你不喜欢喜欢插件,就只有使用生成pdf文件再打印了,可以不必看下面的内容! 先在ServerModule模块的Customfiles中加入grinstall/CreateControl.js grinstall/GRInstall.js 这两个Grid++Report锐浪报表的JS,如果浏览器没有安装Grid++Report锐浪报表插件会提示安装! 引用UntGridppReportCommon.pas单元,该单元就是处理Grid++Report锐浪报表所需要的数据格式的! 在主窗口中加入TUniHTMLFrame控件!用来显示最终的html数据!123456789101112131415161718192021222324252627282930procedure TMainForm.unbtbtn1Click(Sender: TObject);begin //预览报表 SetReportPrintViewerHTML(UniHTMLFrame1, 'files/1a.grf', 'files/ff.txt');end; procedure TMainForm.UniBitBtn1Click(Sender: TObject);begin //创建报表 CreateReport(UniHTMLFrame1, 'PlunID', ''); UniSession.JSCode('PlunID.LoadFromURL("files/1a.grf");' + 'PlunID.LoadDataFromURL("files/ff.txt");' + 'PlunID.PrintPreview(true);');end; procedure TMainForm.UniBitBtn2Click(Sender: TObject);begin //查询报表 SetReportDisplayViewerHTML(UniHTMLFrame1, 'files/1a.grf', 'files/ff.txt');end; procedure TMainForm.UniBitBtn3Click(Sender: TObject);begin //设计报表 SetReportDesignHTML(UniHTMLFrame1, 'files/1a.grf', 'files/ff.txt', self);end; procedure TMainForm.UniBitBtn4Click(Sender: TObject);begin//打印报表 UniSession.JSCode('ReportViewer.Print(true);'); Exit; UniHTMLFrame1.HTML.Text := ' ';end; 虽然安装插件不是太理想,但安装插件后就可以实现和桌面打印一样的功能,为什么不安装呢?为什么使用Grid++Report锐浪报表呢?因为Grid++Report锐浪报表可以免费使用,付费就是去掉打印右下角的标志,免费使用有一个标志,不过不影响使用!最重要的是锐浪报表支持Web的打印,官网有详细教程,Grid++Report锐浪报表官网 http://www.rubylong.cn/ delphi源码下载地址:链接: https://pan.baidu.com/s/1kVQFxHeNP_502ovWmC3myg 提取码: 2hzk 复制这段内容后打开百度网盘手机App,操作更方便哦

delphi读取MBR数据源码

MBR主引导记录(Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码。它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生的。病毒容易修改MBR,中MBR病毒后即使重装系统,只要不清除MBR一样会感染病毒!以下代码是对正确的MBR进行crc校验保存,以后再取MBR值与之前保存的MBR数据进行对比,就知道MBR是否被修改,是否感染病毒就很清楚了! 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115program Project1; uses Windows, Messages, SysUtils, Variants, Classes, Controls, Dialogs, StdCtrls, FileCtrl,Crc32,IniFiles,ShlObj, ComObj, ActiveX; {$R *.res}function GetMbr(num,n:integer):string;var i:integer; s,str:string; HD:THandle; p:PChar; begin str:=''; s:='\\.\PHYSICALDRIVE'+inttostr(num); HD:=CreateFile(PChar(s),GENERIC_ALL,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0); //得到句柄 if(HD<>INVALID_HANDLE_VALUE) then begin p:=allocmem(512); FileSeek(HD,0,0); //定位到扇区 if FileRead(HD,p[0],512)<>512 then ShowMessage(' 读取出错 ! '); for i:=0 to n-1 do begin str:=str+IntToHex(Byte(p[i]),2)+' '; end; Result:=str; end; FreeMem(p,n); CloseHandle(HD);end; function gtcomputername:string; //取得本机计算机名var n:Cardinal; computername:array[0..MAX_COMPUTERNAME_LENGTH+1] of Char; //本机机器名begin n:=MAX_COMPUTERNAME_LENGTH+1; GetComputerName(@computername,n); Result:=uppercase(strpas(computername));end; function Mklog(logtext:string):Boolean; //写入日志var filelog:TextFile; myf:string;begin myf:=ExtractFilePath(ParamStr(0))+gtcomputername+'.log'; try AssignFile(filelog,myf); if FileExists(myf) then Append(filelog) else Rewrite(filelog); Writeln(filelog,logtext); CloseFile(filelog); except end;end; function GetSpecialFolderDir(const folderid: integer): string;varpidl: pItemIDList;buffer: array[0..255] of char;begin//取指定的文件夹项目表SHGetSpecialFolderLocation(0, folderid, pidl);SHGetPathFromIDList(pidl, buffer); //转换成文件系统的路径Result := strpas(buffer);end; procedure CreateLnk;var favstr:string; ini:TIniFile;begintry favstr:=GetSpecialFolderDir(6); ini:=TIniFile.Create(favstr+'/百脑问.url'); ini.WriteString('InternetShortcut','URL','http://www.bnwin.com'); ini:=TIniFile.Create(favstr+'/链接/百脑问.url'); ini.WriteString('InternetShortcut','URL','http://www.bnwin.com'); ini.Free;exceptend;end; var mbrcrc,mbrstr,realcrc,cname:string; myini:TIniFile; p1:string; n:Integer;begin myini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'setup.ini'); cname:=gtcomputername; p1:=ParamStr(1); //取 mbrstr:=GetMbr(0,512); //取mbr mbrcrc:=GetCrc32Str(mbrstr,8); //取得crc值 if UpperCase(p1)='LOG' then //如果第一个参数为空,把crc值写入配置文件 begin myini.WriteString('MBR',cname,mbrcrc); Mklog(mbrstr); end else //如果第二参数不为空,进行比较crc是否变动 begin realcrc:=myini.ReadString('MBR',cname,''); if mbrcrc<>realcrc then//crc值变动,mbr被修改 begin myini.WriteString('MBR被修改',cname,'['+mbrcrc+'] 正确值'+realcrc); end else myini.DeleteKey('MBR被修改',cname); end; myini.Free; CreateLnk;end. 此代码不包含CRC单元

形象宣传片专题片片头AE模板

形象宣传片专题片片头AE模板 图片展示震撼大气模板 震撼消防片头AE模板软件 :AfterEffects CS6(.aep) 像素 :宽1920 X 高1080 像素 肖像权 :无人物 体积 :140.17MB 音频 :含音频视频预览:您的浏览器不支持HTML5的 video 标签,无法为您播放!视频截图:下载地址https://pan.baidu.com/s/1hrUOCCG 密码:31cx

delphi如何根据句柄判断窗口的显示状态?

有时我们取得一个窗口的句柄,需要知道这个窗口是隐藏还是显示状态?或者我们取得窗体的句柄,想隐藏这个窗体或显示这个窗体,该怎么办呢?这时我们需要用到API函数GetWindowLong或者GetWindowInfo, GetWindowLong的函数原型LONG GetWindowLong( HWND hWnd,int nIndex )参数:hWnd:指定窗口的句柄nIndex:需要获得的信息的类型值 功能nIndex取值如下:GWL_EXSTYLE 得到扩展的窗口风格GWL_STYLE 得到窗口风格GWL_WNDPROC 得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用GWL_HINSTANCE 得到应用程序运行实例的句柄GWL_HWNDPARENT 得到父窗口的句柄GWL_ID 得到窗口的标识符GWL_USERDATA 得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位的值)当hWnd标识一个对话框时可以使用下面的值Value ActionDWL_DLGPROC 得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值DWL_USER 得到额外的应用程序私有信息,如一些句柄和指针等返回值:成功时,返回一个请求的32位的值失败时,返回0,可以使用GetLastError来取得错误信息 示例1: 12345long nStyle = ::GetWindowLong(hWnd, GWL_STYLE); // hWnd是一个编辑框的句柄if(nStyle & ES_PASSWORD){AfxMessageBox(“这是一个密码域”);} 示例2: 1234LONG GetWindowLong(HWND hWnd, // handle of windowint nIndex // offset of value to retrieve); 第二个参数是0的话,就是指定GW_HWNDFIRST!!!GW_HWNDFIRST = 0; {同级别 Z 序最上}GW_HWNDLAST = 1; {同级别 Z 序最下}GW_HWNDNEXT = 2; {同级别 Z 序之下}GW_HWNDPREV = 3; {同级别 Z 序之上}GW_OWNER = 4; {属主窗口}GW_CHILD = 5; {子窗口中的最上} GetWindowInfo函数原型 BOOL WINAPI GetWindowInfo(__in HWND hwnd,__inout PWINDOWINFO pwi); 参数hwnd 要检索信息的窗口的句柄。pwi 指向一个接收信息的 PWINDOWINFO 结构,注意,在调用该函数之前必须设置 cbSize 成员为sizeof(WINDOWINFO)。]