牛电竞相当的慢管理ASP.NET的JavaScript库

作者:操作系统    发布时间:2019-12-22 01:22     浏览次数 :

[返回]

下面是我一个从网上找到无模块注入代码的方法.具体是先自身载入DLL,然后修复.relocsection后写入到目标进程。测试过,如果注入的是C++DLL可以正常运行,但如果是DELPHI的DLL,调用ShowMessage函数就会出错。例如下面的代码,使用ShowMessage不行,但用MessageBox就可以。有谁知道是什么原因吗?

这几天做一个项目,调用C的DLL,C里面传递字符串是char *,而Delphi中则是PChar,(从D2009开始支持Unicode后则对应的是PAnsiChar).

简介
对于ASP.NET开发人员来说,管理项目中的JavaScript都很随意:

procedureshowDlg;stdcall;export;beginShowMessage('DelphiDialog');//MessageBox(0,'Win32Dialog','Win32Dialog',MB_OK);end;

LPVOIDGetRelocBase(LPVOIDlpModuleBaseAddr){PIMAGE_DOS_HEADERpImg_DOS_Header=(PIMAGE_DOS_HEADER)lpModuleBaseAddr;PIMAGE_NT_HEADERSpImg_NT_Header=(PIMAGE_NT_HEADERS)((ULONG)pImg_DOS_Header+pImg_DOS_Header-e_lfanew);_IMAGE_FILE_HEADERFileHeader=pImg_NT_Header-FileHeader;WORDNumberOfSections=FileHeader.NumberOfSections;IMAGE_SECTION_HEADER*pIMAGE_SECTION_HEADER=(IMAGE_SECTION_HEADER*)((DWORD)pImg_NT_Header+sizeof(IMAGE_NT_HEADERS));for(WORDi=0;iNumberOfSections;i++){if(!lstrcmpiA((CHAR*)(pIMAGE_SECTION_HEADER-Name),".reloc")){return(LPVOID)((DWORD)lpModuleBaseAddr+pIMAGE_SECTION_HEADER-VirtualAddress);}pIMAGE_SECTION_HEADER+=1;}return0;}BOOLCWar::DoWork(){HMODULEhMod=LoadLibrary(TEXT("Project1.DLL"));typedefBOOL(*FUNC)();FUNCHaveFun=(FUNC)GetProcAddress(hMod,"showDlg");MODULEINFOinfo;GetModuleInformation(GetCurrentProcess(),hMod,info,sizeof(info));LPVOIDlpAlloc=VirtualAlloc(NULL,info.SizeOfImage,MEM_COMMIT,PAGE_READWRITE);memcpy(lpAlloc,info.lpBaseOfDll,info.SizeOfImage);LPVOIDlpReloc=GetRelocBase(lpAlloc);LPVOIDlpTargAddr=VirtualAllocEx(m_handle,NULL,info.SizeOfImage,MEM_COMMIT,PAGE_EXECUTE_READWRITE);DWORDdwX=(DWORD)lpTargAddr-(DWORD)info.lpBaseOfDll;//差值char*pcurReloc=(char*)lpReloc;DWORDpBlockRVA;DWORDdwBlockSize,dwCurSize;WORDitemRVA;do{pBlockRVA=*(DWORD*)pcurReloc;dwBlockSize=*(DWORD*)(pcurReloc+4);dwCurSize=8;pcurReloc+=8;if(dwBlockSize8){do{itemRVA=*(WORD*)pcurReloc;pcurReloc+=2;dwCurSize+=2;if(itemRVA12){if(itemRVA12!=3)return4;*(DWORD*)((char*)lpAlloc+pBlockRVA+(itemRVA0xFFF))+=dwX;}}while(dwCurSizedwBlockSize);}}while(dwBlockSize);DWORDdwTid;WriteProcessMemory(m_handle,lpTargAddr,lpAlloc,info.SizeOfImage,dwTid);HANDLEhThread=CreateRemoteThread(m_handle,NULL,0,LPTHREAD_START_ROUTINE((char*)HaveFun-(char*)info.lpBaseOfDll+(char*)lpTargAddr),0,CREATE_DEFAULT_ERROR_MODE,dwTid);//WaitForSingleObject(hThread,10*1000);VirtualFree(lpAlloc,0,MEM_RELEASE);//VirtualFreeEx(m_handle,lpTargAddr,0,MEM_RELEASE);returnTRUE;}

使用过程中发现个问题需要注意,直接上代码吧:

牛电竞 1

procedure TForm6.Button1Click(Sender: TObject);
var
  s:AnsiString;
  p:PAnsiChar;
begin
  s:=LabeledEdit1.Text;  //LabeledEdit1.Text内容是123456
  p:=PAnsiChar(s);
  ShowMessage(PAnsiChar('123456')); //看到123456

我想这很大程度上可能是因为网上没有如何妥善处理ASP.NET中JavaScript的可靠信息。此文的目的就是提供一种最佳方案,用于管理ASP.NET中的JavaScript。该方案将能解决以下问题:

  ShowMessage(PAnsiChar(LabeledEdit1.Text)); //看到1

内联JS:把JS直接放在页面中将导致页面臃肿不堪。
发布JS:经常忘记发布JS文件。
错误引用:在其它Web程序中引用JS时经常失败。
依赖性:需要记住JS文件中错综复杂的依赖关系。
无效引用:页面上引用的JS从来没有被用到。
HTTP/HTTPS:跨HTTPS页面引用HTTP的JS。
重构:重构一个新版本将花费大量时间。
冗余:多次引用统一个JS文件。
预备知识
确保已安装Visual Studio 2010。Express版可能不支持此文涉及到的一些概念。

ShowMessage(PAnsiChar(s)); //看到123456

概述
大部分上述问题是由把JS或JS文件引用直接放到ASPX页面引起的。对几乎所有上述问题的解决方法是使用ASP.NET的内置功能来嵌入JS文件到一个DLL,然后动态引用这些文件。本文将演示这些功能,以及一些充分使用它们的技巧。接下来我们将逐步介绍该如何实现。

ShowMessage(p); //看到123456

开始
第一步,启动Visual Studio 2010,并新建一个名为ParchmentPurveyor的空Web程序。

 end;

牛电竞 2

 

接下来添加一个窗体:Default.aspx,并添加一些简单的HTML代码。大致如下:

为什么 ShowMessage(PAnsiChar(LabeledEdit1.Text)); //看到1呢?

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"    Inherits="ParchmentPurveyor.Default" %><html xmlns=" runat="server">    <title>Parchment Purveyor</title></head><body>    <form id="form1" runat="server">        <h1>Parchment Purveyor</h1>        <p>Paper for printers, painting, publication,            paper planes, and plenty of other plebeian projects!</p>    </form></body></html>

这是因为从D2009开始默认的string都是unicode,所以需要从string做一下到ansistring的强制转换:

添加JS
不同于在站点中添加JS文件,我们新建一个项目,用于包含我们所有的JS文件。在解决方案中添加一个新的类库项目JavaScriptLibrary:

下一篇:没有了