Archive for 12月, 2006
-
动态内存补丁取血值 [代码]
星期六, 12月 30th, 2006
Cheat Engine 里了. TUTORIAL 这个程序
/*
第6关的密码:098712
Path Code:
Code:00456D3F
E9 CC 91 00 00 90 90
对应的asm
jmp 0045ff10
nop
nop
Code:0045FF10
89 15 40 FF 45 00 89 10 A1 2C CC 45 00 90 E9 23 6E FF FF
mov [0045ff40],edx
mov [eax],edx
mov eax,[0045cc2c]
nop
jmp 00456d46
EAX存放地址:[0045ff40]
*/
[code]
BYTE code1[100]=”\xE9\xCC\x91\x00\x00\x90\x90\x8B”;
BYTE code2[100]=”\x89\x15\x40\xFF\x45\x00\x89\x10\xA1\x2C\xCC\x45\x00\x90\xE9\x23\x6E\xFF\xFF”;
DWORD pid;
DWORD ret;
pid=getprocid(”Tutorial.exe”);
if(!pid)
{
printf(”Can’t Find pid!\n”);
return ;
}
handle =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|
PROCESS_VM_OPERATION|PROCESS_VM_READ|
[...] -
!!驱动级隐藏文件,注册表,进程!!
星期二, 12月 12th, 2006
!!驱动级隐藏文件,注册表,进程!!
驱动程序暂不提供源码!
提供接口方便调用!!!!!
点击下载 -
Ini 文件使用与读取
星期日, 12月 10th, 2006
/*
Config.ini
====================================================
[VirtualPrintconfig]
path=c:\windows\system32
number=100
*/
int main(int argc, char* argv[])
{
// printf(”Hello World!\n”);
char path[MAX_PATH]=”D:\\config.ini”;
char Buffer[500];
int num;
memset(Buffer,0,sizeof(Buffer));
//读取字符
GetPrivateProfileString(”VirtualPrintconfig”, //应用程序名也就是在ini文件中[ ]
“path”, //读取指定键
NULL,
Buffer, //保存
500, //Buffer大小
path); //ini所在路径
num=GetPrivateProfileInt(”VirtualPrintconfig”,”number”,NULL,path); //读取数字
printf(”%s\n”,Buffer);
printf(”%d\n”,num);
strcpy(Buffer,”c:\\windows\\system32″);
num=1000;
char strnum[10];
WritePrivateProfileString(”VirtualPrintconfig”,”path”,Buffer,path); //写入配置文件
//写入数值
sprintf(strnum,”%d”,num);
WritePrivateProfileString(”VirtualPrintconfig”,”number”,strnum,path);
return 0;
} -
堆和栈的一点区别
星期三, 12月 6th, 2006
内存管理向来是C/C++程序设计的一块雷区,大家都不怎么愿意去碰她,但是有时不得不碰它。虽然利用C++中的smart pointer已经可以完全避免使用指针,但是对于对于指针的进一步了解,有助于我们编写出更有效率的代码,也有助于我们读懂以前编写的程序。要明确区分堆和栈的分配方式也是理解程序运行的难点。
五大内存分区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)
明确区分堆与栈
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [...] -
在vc中如何用post方法提交表单!
星期日, 12月 3rd, 2006
我这里有一段程序,用来在一个对话框里显示出一次http request的原始信息,不过使用Inet API做的,希望能有帮助。
[code]
void CHTTPRequestDlg::OnButtonRequest()
{
updateData(TRUE);
HINTERNET hInternet = InternetOpen(”Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)”, INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, NULL);
HINTERNET hSession = InternetConnect(hInternet, m_strHost,
m_nPort, “username”, “password”,
INTERNET_SERVICE_HTTP, 0, 0);
char* szAccept[] = {”*/*”, NULL};
CString strVerb;
m_comboVerb.GetWindowText(strVerb);
HINTERNET hRequest = HttpOpenRequest(hSession, strVerb, m_strObject, NULL, NULL, (LPCSTR*)szAccept, 0, 0);
struct
{
char* Language;
char* Encoding;
char* ContentType;
}Headers = {”Accept-Language: zh-cn\r\n”,
“Accept-Encoding: gzip, deflate\r\n”,
“Content-Type: application/x-www-form-urlencoded\r\n”};
if(m_bLanguage)
HttpAddRequestHeaders(hRequest, Headers.Language, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
if(m_bEncoding)
HttpAddRequestHeaders(hRequest, Headers.Encoding, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
if(m_bContentType)
HttpAddRequestHeaders(hRequest, Headers.ContentType, [...]