当前位置: 首页 > news >正文

济南公司做网站的价格信息流广告代运营

济南公司做网站的价格,信息流广告代运营,网页浏览器软件,wordpress登陆后段后端背景 当我们注入一个进程,通过函数地址进行call时经常会遇到这样的一个问题。对方程序每周四会自动更新。更新后之前的函数地址就变化了,然后需要重新找地址。所以,我就使用了一个动态查询的方式。 第一步:先为需要call的函数生…

背景

当我们注入一个进程,通过函数地址进行call时经常会遇到这样的一个问题。对方程序每周四会自动更新。更新后之前的函数地址就变化了,然后需要重新找地址。所以,我就使用了一个动态查询的方式。

第一步:先为需要call的函数生成特征码。特征码其实就是反汇编后,去掉地址,只留操作符。


function make_search(v: dword; ms: TMemoryStream; maxsize: integer): string;
var
  offset: dword;
  isnot_ret: boolean;
  description: string;
begin
  ms.Clear;
  Result := '';
  offset := v;
  isnot_ret := true;
  while isnot_ret do
    begin
      isnot_ret := pbyte(offset)^ <> $C3;
      disassemble_find(offset, description, ms);
      if Result <> '' then
        Result := Result + #13#10;
      Result := Result + description;
      if ms.Size > 1024 then
        Break;
    end;
end;

disassemble_find 函数的行数太多了。

function disassemble_find(var offset: dword; var description: string; ms_find: TMemoryStream): string; overload;
var
  memory: TMemory;
  actualread: dword;
  startoffset: dword;
  tempresult: string;
  tempst: string;
  wordptr: ^word;
  dwordptr: ^dword;
  dwordptr2: ^dword;
  singleptr: ^single;
  doubleptr: ^double;
  extenedptr: ^extended;
  int64ptr: ^int64;
  i, j: integer;

  prefix: TPrefix;
  prefix2: TPrefix;
  isprefix: boolean;

  last: dword;
  foundit: boolean;
  search_size: integer;
  str_tmp: string;
begin
  search_size := 0;
  result := inttohex(offset, 8) + ' - ';

  isprefix := true;
  prefix := [$F0, $F2, $F3, $2E, $36, $3E, $26, $64, $65, $66, $67];
  prefix2 := [];

  //forced 16-bit
  if mode16 then
    prefix2 := prefix2 + [$66];

  startoffset := offset;

  readmemory(pointer(offset), addr(memory), 24, actualread);

  /

  if actualread > 0 then
    begin
      //I HATE THESE...   (I propably will not add them all, but I'll see how far I get)

      while isprefix do
        begin
          inc(offset);
          if memory[0] in prefix then
            begin
              result := result + inttohexs(memory[0], 2) + ' ';
              isprefix := true;
              inc(startoffset);
              prefix2 := prefix2 + [memory[0]];
              ReadMemory(pointer(offset), addr(memory), 24, actualread);
            end
          else
            isprefix := false;
        end;

      if $F0 in prefix2 then tempresult := 'lock ';
      if $F2 in prefix2 then tempresult := tempresult + 'repne ';
      if $F3 in prefix2 then tempresult := tempresult + 'repe ';

      case memory[0] of //opcode
        $00:
          begin
            description := 'Add';
            tempresult := tempresult + 'add ' + MODRM(memory, prefix2, 1, 2, last) + r8(memory[1]);
            inc(offset, last - 1);
          end;

        $01:
          begin
            description := 'Add';
            if $66 in prefix2 then
              tempresult := tempresult + 'ADD ' + MODRM(memory, prefix2, 1, 1, last) + r16(memory[1])
            else
              tempresult := tempresult + 'ADD ' + MODRM(memory, prefix2, 1, 0, last) + r32(memory[1]);
            inc(offset, last - 1);

          end;

        $02:
          begin
            description := 'Add';
            tempresult := tempresult + 'ADD ' + r8(memory[1]) + ',' + MODRM(memory, prefix2, 1, 2, last);
            tempresult := copy(tempresult, 0, length(tempresult) - 1);
            inc(offset, last - 1);
          end;

        $03:
          begin
            description := 'Add';
            if $66 in prefix2 then
              tempresult := tempresult + 'ADD ' + r16(memory[1]) + ',' + MODRM(memory, prefix2, 1, 1, last)
            else
              tempresult := tempresult + 'ADD ' + r32(memory[1]) + ',' + MODRM(memory, prefix2, 1, 0, last);
            tempresult := copy(tempresult, 0, length(tempresult) - 1);
            inc(offset, last - 1);
          end;

        $04:
          begin
            description := 'Add x to y';
            tempresult := tempresult + 'ADD AL,' + inttohexs(memory[1], 2);
            inc(offset);
          end;

        $05:
          begin
            description := 'Add x to y';
            wordptr := @memory[1];
            dwordptr := @memory[1];
            if $66 in prefix2 then
              begin
                tempresult := tempresult + 'ADD AX,' + inttohexs(wordptr^, 4);
                inc(offset, 2);
              end
            else
              begin
                tempresult := tempresult + 'ADD EAX,' + inttohexs(dwordptr^, 8);
                inc(offset, 4);
              end;
          end;

第二步:查询函数地址

function search_address(ms_search: TMemoryStream; sl: tstringlist): string;
var
  idx, i: integer;
  ms: TMemoryStream;
  Mem: TMemoryBasicInformation;
  dwProtect, temp: cardinal;
  msize: dword;
  canread, willVirtualProtect: boolean;

  procedure dosearch;
  var
    count, idx, i, l: integer;
    s: string;
    ms_old: TMemoryStream;
    ms: TMemoryStream;
  begin
    ms_search.Position := 0;
    ms_search.Read(count, sizeof(ms_search));
    for i := 1 to count do
      begin
        ms := TMemoryStream.Create;
        ms_old := TMemoryStream.Create;

        ms_search.Read(l, sizeof(l));
        setlength(s, l);
        ms_search.Read(s[1], l);
        ms_search.Read(l, sizeof(l));
        ms_old.CopyFrom(ms_search, l);

        ms_search.Read(l, sizeof(l));
        ms.CopyFrom(ms_search, l);

        //if SameText('Py_GetVersion', s) then
        begin
          idx := search_ms(integer(Mem.BaseAddress), Mem.RegionSize, ms_old);
          if idx < 0 then
            begin
              idx := search_ms(integer(Mem.BaseAddress), Mem.RegionSize, ms);
            end;
          if idx >= 0 then
            begin
              sl.AddObject(s, pointer(idx));
              if Result <> '' then
                Result := Result + #13#10;
              Result := Result + s + '=' + IntToStr(idx - integer(Mem.BaseAddress));
            end;
        end;
        FreeAndNil(ms);
        FreeAndNil(ms_old);
      end;
  end;
begin
  Result := '';
  idx := -1;
  if length(Mems) <= 0 then
    u_mem.test;
  for i := 0 to high(Mems) do
    begin
      if SameText('mhmain.dll', GetItemFilePath(Mems[i], Modules)) then
        if Mems[i].RegionSize > 1024 * 1024 * 4 then
          begin
            Mem := Mems[i];
            idx := i;
            Break;
          end;
    end;
  if idx < 0 then
    exit;
  canread := not IsBadReadPtr(mem.BaseAddress, mem.RegionSize);
  if not canread then
    begin
      if VirtualProtect(mem.BaseAddress, mem.RegionSize, PAGE_EXECUTE_READWRITE, @dwProtect) then
        begin
          canread := true;
          willVirtualProtect := true;
        end;
    end;
  if canread then
    begin
      dosearch;
    end;
  if willVirtualProtect then
    VirtualProtect(mem.BaseAddress, mem.RegionSize, dwProtect, @temp);
end;
 

注意

同一个函数可能查到多个地址,但是可以根据多个地址进行校验。命中的范围最集中的那个范围中的地址,一般都是正确的地址。

http://www.hkea.cn/news/963940/

相关文章:

  • 宜昌seo百度seo优化
  • 做网站公司q房网seo快速排名站外流量推广
  • 南宁网站排名优化广州发布紧急通知
  • 网站建设的策划方案seo排名
  • 网站模板绑定域名培训班
  • coupang入驻条件2022台州关键词优化报价
  • 网站建设前景怎么样google优化师
  • 上海免费网站建设淘宝引流推广怎么做
  • 单位网站建设目的西安网站建设公司排行榜
  • 福州制作网站软件无人在线观看高清视频单曲直播
  • 建设银行卡网站百度账号登录个人中心
  • 网站显示500错误怎么解决方法seo网站推广排名
  • 广告免费设计在线生成网站排名优化
  • 余姚公司网站建设怎么建网址
  • 网站域名授权怎么做市场营销案例100例
  • kindeditor代码高亮 wordpressseo优化排名经验
  • 家乡介绍网页设计上海网站排名优化
  • 广州黄埔网站制作百度sem是什么意思
  • 网站流量分析网站网络推广营销网
  • 化妆品网站建设计划书网站维护是什么意思
  • 建设局网站公告宣传推广的形式有哪些
  • 网站基本架构设计的主要步骤什么软件可以排名次
  • 代做毕业设计网站多少钱网站推广交换链接
  • 苹果指争议广告lg广告北京seo公司网站
  • flash网站制作公司能打开各种网站的浏览器下载
  • 网站开发是叫系统吗站长工具seo排名查询
  • 站长之家html模板西安网站seo技术厂家
  • 重庆网站建设 渝seo交流论坛
  • 洛阳市网站建设宁波seo网络推广软件系统
  • 做网站用建站模版好还是定制好百度站点