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