能力值:
( LV6,RANK:90 )
|
-
-
2 楼
|
能力值:
( LV5,RANK:70 )
|
-
-
3 楼
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
int _cdecl cmp(int Bool,char** startaddr);
int pwd;
void *newaddr,*OKaddr,*ERRORaddr;
int main()
{
unsigned long usize;
char * StartCmp;
_asm{
lea eax,OK
mov OKaddr,eax
lea eax,ERROR
mov ERRORaddr,eax
}
usize = cmp(1,&StartCmp);
while(1)
{
newaddr = (char*)malloc(usize);
memcpy(newaddr,StartCmp,usize);
printf("Input PWD:");
scanf("%d",&pwd);
_asm{
jmp newaddr
}
OK:
printf("OK\n");
return 0;
ERROR:
printf("ERROR\n");
}
return 0;
}
int _cdecl cmp(int Bool,void** startaddr)
{
int len;
void * S;
if(Bool)
{
_asm{
lea eax,start
mov S,eax
lea ebx,end
sub ebx,eax
mov len,ebx
}
*startaddr = S;
return len;
}
start:
if((pwd+10) == 12)
{
printf("haha\n");
_asm{
jmp OKaddr
}
}
else
{
_asm{
jmp ERRORaddr
}
}
end:
return 0;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
不错,学习了。
|
能力值:
( LV5,RANK:70 )
|
-
-
5 楼
原因是原代码中是短Call,复制到堆中导致相对偏移改变,短Call到未知地址,应使用长Call。
Release方式编译,否则在print后会进行栈的检查,会出错
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
int _cdecl cmp(int Bool,void** startaddr);
int pwd;
void *newaddr,*OKaddr,*ERRORaddr;
int (_cdecl *print)(const char *, ...);
int main()
{
unsigned long usize;
void * StartCmp;
_asm{
lea eax,OK
mov OKaddr,eax
lea eax,ERROR
mov ERRORaddr,eax
}
usize = cmp(1,&StartCmp);
while(1)
{
newaddr = malloc(usize);
memcpy(newaddr,StartCmp,usize);
printf("Input PWD:");
scanf("%d",&pwd);
_asm{
jmp newaddr
}
OK:
printf("OK\n");
free(newaddr);
return 0;
ERROR:
printf("ERROR\n");
free(newaddr);
}
return 0;
}
int _cdecl cmp(int Bool,void** startaddr)
{
int len;
void * S;
if(Bool)
{
_asm{
lea eax,start
mov S,eax
lea ebx,end
sub ebx,eax
mov len,ebx
}
*startaddr = S;
return len;
}
start:
if((pwd+10) == 12)
{
print = printf;//
print("haha\n");
_asm{
jmp OKaddr
}
}
else
{
_asm{
jmp ERRORaddr
}
}
end:
return 0;
}
lz即使你把代码放到栈里,OD照样跟踪
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
int _cdecl cmp(int Bool,void** startaddr);
int pwd;
void *newaddr,*OKaddr,*ERRORaddr;
int (_cdecl *print)(const char *, ...);
int main()
{
unsigned long usize;
void * StartCmp;
_asm{
lea eax,OK
mov OKaddr,eax
lea eax,ERROR
mov ERRORaddr,eax
}
usize = cmp(1,&StartCmp);
while(1)
{
_asm{
sub esp,usize
mov newaddr,esp
}
memcpy(newaddr,StartCmp,usize);
printf("Input PWD:");
scanf("%d",&pwd);
_asm{
jmp newaddr
}
OK:
printf("OK\n");
_asm{
add esp,usize
}
return 0;
ERROR:
printf("ERROR\n");
_asm{
add esp,usize
}
}
return 0;
}
int _cdecl cmp(int Bool,void** startaddr)
{
int len;
void * S;
if(Bool)
{
_asm{
lea eax,start
mov S,eax
lea ebx,end
sub ebx,eax
mov len,ebx
}
*startaddr = S;
return len;
}
start:
if((pwd+10) == 12)
{
print = printf;//
print("haha\n");
_asm{
jmp OKaddr
}
}
else
{
_asm{
jmp ERRORaddr
}
}
end:
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
多谢了,我还是初学不久,想实践下。呵呵,我不是为了代码保护,只是乱写的一个想法
|
能力值:
( LV5,RANK:70 )
|
-
-
7 楼
这样子,你这一个乱写可害苦我了,光理解代码就费了好长时间。另外你的汇编代码写的不太合理,不应该加[]但加上也好使,所以说只能说是不合理,参考一下我的建议吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
非常感谢sierra耐心的帮助,看了你的代码,学习了
|