捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:PE Encrypt v1.0 (文件简单加密/100%源码)
denis 592105 2017/6/1 12:04:16
加密后的程序在win7下会报错, WinXP下可用
austers 35176 2008/8/3 22:31:11
老罗的汇编核心+DELPHI外壳,改造的不是很完美。
sunjunfeng3 31350 2007/10/5 9:43:10
我发现,这段代码有个很大的问题,在加密系统自带的记本事notepad.exe 的时候,会出现异常
jccz_zys 28630 2007/4/2 11:04:18
看了下源码,有2个地方不太明白:
1、function AttachStart:DWORD;stdcall;
asm
  CALL @@1
@@1:
  POP EAX
  SUB EAX, 5
end;
这里SUB EAX, 5 中的参数5是根据什么得来的?这段代码的意思我的理解是:计算出变量运行时地址与编译时地址的相对值,则应该用SUB EAX, offset @@1啊
2、查找Kernel32.dll的基地址的方法:
  asm
 MOV EAX,  [ESP+48]
 AND EAX,  $FFFF0000
  @@chk:...
其中第二行的ESP+48中的48是根据什么得来的?
按理说前面有约13、4个DWORD类型的局部变量,肯定应该超过48个字节了阿

请不吝赐教!!
dna32r 22974 2006/4/17 2:03:35
To smokingroom
真的好麻烦~~调试寄存器都用上了~~
[code]
asm
  mov eax,fs:[30h]
  test eax,eax
  js @@os_9x
@@os_nt:
  mov eax,[eax+0ch]
  mov esi,[eax+1ch]
  lodsd
  mov eax,[eax+8]
  jmp @@finished
@@os_9x:
  mov eax,[eax+34h]
  lea eax,[eax+7ch]
  mov eax,[eax+3ch]
@@finished:
  mov Result,eax
end
[/code]
支持Win9x获取k32基址
剩下的就是API搜索的..其实也容易..
获取完API就可以完成功能了...
这样作好象连代码自定位都省了..呵呵~
dna32r 18449 2005/10/15 22:16:22
用不着这么麻烦吧~
kernel32.dll地址还是用PEB获取快一点
空间不能写用VirtualQuery,VirtualProtect修改保护属性就好了~~
progray 18411 2005/10/14 10:10:33
我也不懂,晕~~~
wdywmz 14900 2005/5/18 0:15:11
你们说的我都不懂,汗~
sundy 14500 2005/5/4 12:20:54
其实可以使用一个更简单的办法(但要牺牲部分移植性)
MOV dwKernel32,$77E60000
因为Kernel32.dll载入地址是比较固定的!
smokingroom 13482 2005/3/24 9:58:10
to navyseals:
  错误的原因是,4GB的地址空间非全部可读的,所以可能会出错,ASM中一可以采用SEH来处理,Delphi中可以采用try/except来处理,在Delphi中运行这段代码,还有一个就是必须放到程序开始处,否则ESP中的内容不能作为搜索的开始处.基于测试,你可以参考一下这段代码,我采用的也是SEH来处理,try/except太慢(用delphi编译后直接运行,不要调试运行,会报访问错误)

program Project1;

{$R *.res}

uses
  Windows,
  SysUtils,
  Dialogs;


const
  SIZE_OF_80387_REGISTERS      = 80;
  MAXIMUM_SUPPORTED_EXTENSION  = 512;
  ExceptionContinueExecution   = 0;

type
  FLOATING_SAVE_AREA=packed record
    ControlWord:   DWORD;
    StatusWord:    DWORD;
    TagWord:       DWORD;
    ErrorOffset:   DWORD;
    ErrorSelector: DWORD;
    DataOffset:    DWORD;
    DataSelector:  DWORD;
    RegisterArea:  array[0..SIZE_OF_80387_REGISTERS-1] of Byte;
    Cr0NpxState:   DWORD;
  end;

type
  CONTEXT=packed record
    ContextFlags:  DWORD;
    iDr0:          DWORD;
    iDr1:          DWORD;
    iDr2:          DWORD;
    iDr3:          DWORD;
    iDr6:          DWORD;
    iDr7:          DWORD;
    FloatSave:     FLOATING_SAVE_AREA;
    regGs:         DWORD;
    regFs:         DWORD;
    regEs:         DWORD;
    regDs:         DWORD;
    regEdi:        DWORD;
    regEsi:        DWORD;
    regEbx:        DWORD;
    regEdx:        DWORD;
    regEcx:        DWORD;
    regEax:        DWORD;
    regEbp:        DWORD;
    regEip:        DWORD;
    regCs:         DWORD;
    regFlag:       DWORD;
    regEsp:        DWORD;
    regSs:         DWORD;
    ExtendedRegisters:array[0..MAXIMUM_SUPPORTED_EXTENSION-1] of Byte;
  end;

type
  TSEH=packed record
    OrgEsp:  DWORD;
    OrgEbp:  DWORD;
    SaveEip: DWORD;
  end;

var
  SEH:TSEH;
  dwKernel32:DWORD;

procedure SehHandler(pExcept:DWORD;pFrame:DWORD;pContext:DWORD;pDispatch:DWORD);stdcall;
asm
  MOV  EAX,pContext
  PUSH [SEH.SaveEip]
  POP  [EAX][CONTEXT].regEip
  MOV  EAX, ExceptionContinueExecution
end;


begin
  asm
    MOV  EDX,  [ESP]
    AND  EDX, $FFFF0000
    PUSH OFFSET @@err
    POP  SEH.saveEip
    PUSH OFFSET SehHandler
    PUSH FS:[0]
    MOV  FS:[0],ESP
  @@chk:
    CMP DWORD PTR [EDX], $00905A4D
    JNE @@err
    MOV EAX, EDX
    ADD EAX, [EAX+$3C]
    CMP DWORD PTR [EAX], $00004550
    JE @@fnd
  @@err:
    SUB EDX,  $1000
    JMP @@chk
  @@fnd:
    MOV dwKernel32, EDX
    POP FS:[0]
    ADD ESP,4
  end;
  ShowMessage(Format('Find the kernel32 base address :%.8x',[dwKernel32]));
end.
navyseals 13145 2005/3/12 0:58:53
作者的那段寻找kernel32.dll的代码大概这个意思吧:
----------
Kerner32的开始标志是MZ和PE,而且因为系统分配某个空间时,总要从一个分配粒度的边界开始,在Windows下,这个粒度是64KB。所以我们搜索时,可以按照64kb递减往低地址搜索,当到了MZ和PE标志的时候,就找到了Kernel32的基地址。
----------
AND EAX,  $FFFF0000大概是:64k对齐特征加快查找速度。
不知道为什么,在我的机器上,把那段寻找kernel32.dll的代码单独运行的时候可以编译通过,但是在运行的时候总是出错,提示:access violate at address 004521c2 in module "project1.exe"。出错的地方就在CMP DWORD PTR [EAX], $00905A4D这里,换成if PDWORD(dwKernel32)^=$00905A4D then Break,也会出相似的错误, 而无法找到正确的地址,不知道是不是这段代码不能单独提取出来或是别的什么原因,请指教。
navyseals 13123 2005/3/11 0:33:04
再来一种找kernel32的代码:
asm
  mov eax, fs:$30 ; //PEB的地址
  mov eax, [eax + $0c]  ;//Ldr的地址
  mov esi, [eax + $1c] ;//Flink地址
  lodsd          ;//把计算结果装入eax中
  mov eax, [eax + $08] ;//eax就是kernel32.dll地址
          mov  dwKernel32, EAX;

end;
navyseals 13122 2005/3/10 23:28:37
寻找kernerl32,引出GetProcAddress等函数地址...这些可是shellcode的基本关键技术,以前一直没见过delphi版的~作者可以写一个delphi版的缓冲区溢出教程了~~期待中,呵呵~。如果作者没兴趣时间的话,我希望参考作者的代码写点缓冲区溢出的入门例子,作者不要怪我剽窃呀~:)
dna32r 13099 2005/3/9 16:39:50
关于文件加密后会被AVP杀了的问题~下载代码后直接添加代码段后~
然后加密文件后会被AVP报告为Type_Win32(应该是病毒吧)后来分析了一下发现问题出在段名称上面~AVP会把可疑段名和OEP改变的程序认为是感染PE病毒的~这里用点OEP模糊技术中的最初级技术~就是把默认段名.LWY修改成.TEXT(这也算OEP模糊技术?)
高级点的就是在正常的开始代码段中添加一个跳转~类似于SMC技术~查查看雪论坛精华
或者看看一些简单的病毒教程就可疑找到好的方法
yuzi 13098 2005/3/9 14:25:06
对不起,是我弄错了,
那个PE文件具有病毒破坏自识别能力,所以当成感染病毒,自己中断运行了。。。
smokingroom 13097 2005/3/9 13:51:42
试验过,先用Aspack压缩,再用本软件加密,能正常运行.
smokingroom 13096 2005/3/9 13:50:04
备注:
  asm
 MOV EAX,  [ESP+48]
 AND EAX,  $FFFF0000
  @@chk:
        CMP DWORD PTR [EAX], $00905A4D
 JE @@fnd
 SUB EAX,  $1000
 JMP @@chk
  @@fnd:
        MOV     dwKernel32, EAX
  end;
上面这段查找Kernel32.dll的asm代码已经改为如下:
  asm
    PUSH  [ESP+48]
    POP   dwKernel32
  end;
  dwKernel32:=dwKernel32 and $FFFF0000;
  while True do
  begin
    if PDWORD(dwKernel32)^=$00905A4D then Break;
    Dec(dwKernel32,$1000);
  end;
效果是一样的,可读性应该强点,对于不懂asm的人来说有好处。
2005-03-09
we123 13094 2005/3/9 13:14:30
我以前不知在哪里看过。不用asm
yuzi 13090 2005/3/9 12:03:27
非常感谢!对我来说很有价值!
压缩加壳过的PE文件,加密后运行会提示被病毒破坏,而无法运行。。。
请问怎么解决这个问题?
colonel 13075 2005/3/8 23:42:39
可以把asm代码转为pas吗?这样容易看一D
第一页 上一页 下一页 最后页 有 21 条纪录 共2页 1 - 20
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表