首页
社区
课程
招聘
[原创]为程序打动态内存补丁的delphi原码
发表于: 2006-11-16 18:38 9645

[原创]为程序打动态内存补丁的delphi原码

2006-11-16 18:38
9645

【文章标题】: 为程序打动态内存补丁的delphi原码
【文章作者】: 8713007
【软件名称】: CrackMe2.1
【软件大小】: 200k
【下载地址】: 自己搜索下载
【使用工具】: delphi7+win2000
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  原来都使用工具给程序打内存补丁,但是往往被杀毒软件认成病毒删除。所以使用delphi7写了一段代码。
  以一个crackme1为例,我们今天不是分析算法,而是将本内存补丁打入程序中,使爆破成功。
  原码如下
  unit Unit1;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs;
  
  type
    TForm1 = class(TForm)
      procedure FormCreate(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
   var
           si:STARTUPINFO ;
           pi:PROCESS_INFORMATION ;
           NewData : array[0..1] of byte = ($90,$90);
           NewDataSize : DWORD;
           Bytesread : DWORD;
           Olddata : array[0..1] of byte;
           dir:string ;
  procedure TForm1.FormCreate(Sender: TObject);
  begin
      dir:=ExtractFileDir(Application.ExeName );
        if FileExists(dir+'\crackme1.exe') then
       begin
  
      ZeroMemory(@Pi,SizeOf(pi));
       FillChar (si,SizeOf(si),0);
       si.cb :=SizeOf(si);
       NewDatasize :=SizeOf(NewData )  ;
        if CreateProcess (nil,'crackme1.exe',nil,nil,False ,CREATE_SUSPENDED ,nil ,nil,si,pi)=True then
         begin
          ReadProcessMemory(pi.hProcess ,Pointer($00401586  ),@olddata,2 ,BytesRead );
          if (OldData[0]=$75) and (OldData[1]=$18)   then
           begin
             WriteProcessMemory(pi.hProcess ,Pointer($00401586  ),@newdata,NewDatasize ,BytesRead );
             ResumeThread(pi.hThread );
             CloseHandle(pi.hProcess );
             CloseHandle(pi.hThread );
             end  else
           MessageBox(Handle, PChar('无法打入内存补丁'), PChar('错误'),MB_ICONERROR or MB_OK);
           TerminateProcess(pi.hProcess ,0);
           CloseHandle(pi.hProcess );
             CloseHandle(pi.hThread );
             end;
            end
            else
            begin
            ShowMessage('本补丁必须与原文件放在同一目录下');
            Application.Terminate ;
            end;
  
  end;
  
  end.
  
  本段代码编译后的程序过卡巴斯基5.0.crackme在附件中
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年11月16日 18:36:22


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 442
活跃值: (1246)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
2
这样写Loader,体积太大
2006-11-16 19:01
0
雪    币: 225
活跃值: (1396)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
00401586 处 nop 了一个跳转.
不足之处是 '本补丁必须与原文件放在同一目录下' ,其实配合 FindWindow 和 GetWindowThreadProcessID 这两API使用会更好一些.个人观点.
2006-11-16 19:01
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 baby2008 发布
这样写Loader,体积太大

很久不见你出来,现在是不是有空了?
在Delphi IDE环境下,的确不适合写有关Crack的程序。否则Keygen有可能会比主程序还大!
2006-11-17 18:50
0
雪    币: 52
活跃值: (2177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我等只会用delphi的人,感谢楼主.
2006-11-17 19:10
0
雪    币: 277
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
要小很容易的,使用Api或者使用KOl来写,程序都只有10KB左右的
2006-11-22 14:25
0
雪    币: 465
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有C版的吗?或哪位编译一下。。。。
2006-11-22 15:59
0
雪    币: 10
活跃值: (165)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
到现在还有对文件大小敏感的朋友?
2006-11-22 21:11
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
9
呵呵  这个代码似乎在那看到过
2006-12-1 02:32
0
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
有些还需要加上对付反调试检测的代码  
2006-12-1 09:40
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
11
thanks a lot!
okdodo此方面是高手吧
2006-12-1 09:56
0
游客
登录 | 注册 方可回帖
返回