發表文章

目前顯示的是有「CBuilder」標籤的文章

[C++Builder]解決Firemonkey跨平台專案無法實機發佈軟體到iPhone設備上DEBUG

圖片
原先一開始我的專案需求 只專門測試了軟體可以跑在Android、Windows、OSX上面 所以PAServer什麼的都已經弄好了 因為ADR很窮...只有Android手機,後來跟朋友借到一隻iPhone5(有JB),發現選到iOS Device並且Macbook Pro已經正確跟iPhone連線上,PAServer也正確啟動服務可以遠端聯繫了,卻出現: 這問題很雷,特雷 因為這個問題去查Google有九成以上的台灣Blog介紹C++ Builder開發iOS App是沒有介紹這個問題該怎麼解決的...(應該直接了當的說台灣沒幾隻貓在寫C++ Builder開發的iOS App部落格的感覺...) 仔細看了一下編譯噴錯的原因: iphone developer no identity found(blablabla以下省略超多字)大略意思是在遠端調試的時候,一個叫做iPhoneDeveloper的程式無法正確被傳遞參數並且把App傳入iOS設備導致的 翻了一下PAServer目錄底下: 其實App還有簽章之類的內容PAServer早就幫你弄好了...只是app沒辦法放進去 這時候有兩種做法: 1.有JB狀況下 可選擇再新增一個"payload"的資料夾並且把.app放進去裡面,最後把payload資料夾與另外兩個檔案用壓縮的方式壓縮成一個解壓縮包,並且把副檔名改為.ipa 2.修正iPhonedeveloper無法被喚起的問題 後來爬了大概快四十幾篇文,後來在對岸論壇爬到問題應該出在權限不足沒有簽章權限問題,解決方法如下 首先開啟你的Laucher找到系統程式的“鑰匙圈存取” 在鑰匙圈存取》憑證輔助程式 找到“製作憑證”開啟它 接著名稱寫:iPhone Developer,身份類型:自簽根,憑證類型:代碼簽名 然後其他就預設值,一路按繼續繼續繼續繼續繼續繼續繼續繼續繼續繼續繼續 最後看到完成,再回你的C++ Builder做一次編譯就可以解決這個問題了 (參考: 盒子論壇 )

[C++Builder]Firemonkey下的多線程﹢跨線程控制UI物件(委派)

為啥會有這篇...純粹因為最近用C++ Builder寫專案,想讓UI的Feedback可以Q彈滑順一點。不過因為是用Firemonkey的跨平台專案功能,意思是如果你想發揮Firemonkey的跨平台性去做多線程處理UI更新,勢必不可能用到系統API來處理(例如說Windows上用CreateThread來實做) 不過既然沒辦法直接用系統API來處理,去Google了大概三四十頁的搜尋結果,後來參考一個日本人的Blog才寫出來算是比較簡潔的解法...,用ECB官方自帶的類別庫還有用到了TThread類別來實做(話說小吐槽一下...馬的C++Builder跟Delphi在處理跨線程UI控制真的很麻煩...像在.NET內用委派甚至解除跨線程安全檢查就好了、在QT內也是委派投擲訊息就好...CB內要實做委派"不能投擲參數"這點超級麻煩...意思是如果你要委派的函數有參數,就得額外在開一個新的函數來收你的委派然後跑在UI Thread來處理事情,參數也要額外宣告變數來做存放..我靠) class CoreModuFunc : public TCppInterfacedObject { public: CoreModuFunc(TTabbedForm* Form) : FForm(Form) {} virtual void __fastcall Invoke(void) { while (1) { DirectNewItem("Hi"); Sleep(5000); } } void DirectNewItem(String Str) { TempStr = Str; TThread::Synchronize(TThread::CurrentThread, AddNewItem); } void __fastcall AddNewItem(void)//注意一定得用fastcall,才能用Synchronize委派 { if (TempStr == "") return; FForm->ListBox1->Items->Add(TempStr ); } private: TForm1 * FForm; //要控制的UI Form指針 String TempStr ; //存放參數的點 }; 然後如果你要...

[C++]DLL遠程注入(LoadLibraryA)

國中寫的東西現在翻一翻 然後整理一下XD 丟上來Blog當廢文發XD [VB.NET]DLL跨進程遠程注入(LoadLibraryA) C++ Source Code在GitHub: https://github.com/aaaddress1/Dll-Injector-In-CB bool EnablePrivilege() { //提權模組 //這個其實你用不用都沒差(在Win7以上) //不過這個模組如果不用,在XP之下會沒辦法正常寫入記憶體/跨進程存取 HANDLE hToken=NULL; //用OpenProcessToken確認自己的進程等級(非NULL則有權限) if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)) return true; LPCTSTR szPrivName = SE_DEBUG_NAME;//調整到DEBUG BOOL fEnable = true; TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL,szPrivName,&tp.Privileges[0].Luid); tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED:0; AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL); return((GetLastError() == ERROR_SUCCESS)); } bool RemoteInject(String DLLPath,DWORD process_id) { EnablePrivilege();//提權 //接著用OpenProcess取得遠端進程控制句柄 void* ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS,false,process_id); if(!ProcessHandle) return false; //接著把String轉Char Arra...

[VB.NET]DLL跨進程遠程注入(LoadLibraryA)

這份Code在我高二的時候好像就丟在某論壇惹吧 不過既然現在有Blog就一併更新發上來了 [C++]DLL遠程注入(LoadLibraryA) Source Code在GitHub: https://github.com/aaaddress1/DLL-Injector-In-VB.NET 核心Code: Dim DllPath As String = Application.StartupPath + "/MyDll.dll" '先宣告變數來存放你要注入的DLL Dim TargetHandle As IntPtr = Process.GetProcessesByName("ProcessName")(0).Handle '然後透過Process類別去取得Handle '特別注意一下這個Handle取到了就同等於用OpenProcess得到控制句柄了喔 If (TargetHandle.Equals(IntPtr.Zero)) Then MsgBox("對進程 " + ComboBox1.Text + " 進行打開進程行為失敗.") Exit Sub End If '獲取LoadLibraryA的地址(PS:不同進程但同API,地址相同). Dim GetAdrOfLLBA As IntPtr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA") If (GetAdrOfLLBA.Equals(IntPtr.Zero)) Then MsgBox("取得LoadLibraryA API函數基址失敗.") Exit Sub End If '將DLL路徑轉為Char()陣列. Dim OperaChar As Byte() = System.Text.Encoding.Default.GetBytes(DllPath) '在目標進程申請一塊空間存放路徑字串. Dim DllMemPathAdr = VirtualAllocEx(TargetHandle, 0...

[C++][PEB][ASM]硬幹取得指定函數的內存地址、透過PEB枚舉獲取指定內存地址之函數名稱

這篇是個人筆記啦XD 基本上就是因為網路上要找到寫這種奇怪的東西,實在找不到 所以就去網路上東抓西抓然後改一改弄出來的東西了 首先是 透過指定模組取得函數名稱的地址(其實就是GetProcAddress API的功能啦) DWORD GetFuncAddr(HMODULE hModule,char* FuncName) { PIMAGE_DOS_HEADER pDosHeader; PIMAGE_NT_HEADERS pNtHeader; PIMAGE_EXPORT_DIRECTORY pExportDirectory; HMODULE hModuleBase = hModule; pDosHeader = (PIMAGE_DOS_HEADER)hModuleBase; pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)hModuleBase + pDosHeader->e_lfanew); pExportDirectory = PIMAGE_EXPORT_DIRECTORY(pNtHeader->OptionalHeader.DataDirectory[0].VirtualAddress + (PBYTE)hModuleBase); PDWORD pAddressName = PDWORD((PBYTE)hModuleBase+pExportDirectory->AddressOfNames); //函数名称表指针 PWORD pAddressOfNameOrdinals = (PWORD)((PBYTE)hModuleBase+pExportDirectory->AddressOfNameOrdinals); //函数名称序号表指针 PDWORD pAddresOfFunction = (PDWORD)((PBYTE)hModuleBase+pExportDirectory->AddressOfFunctions); //函数地址表指针 for (int index = 0; index < (pExportDirectory->NumberOfNames); index++) { PCHAR pFunc = (PCHAR)((long)hModuleBase + *pA...

[C++Builder][VC++][DevC++]逆向分析for迴圈能否使用多重條件句

圖片
for迴圈標準寫法: for(int i = 0 ; (i < 10); i++); 或者可以用建構式初始化起始值 for(int i(0) ; (i < 10) ; i++); for迴圈在編譯器解釋上是把;;前中後三個拆解成三個block來處理 所以可以寫: for(int i(0),t(0),k(0), (i<10); i++); 這樣for迴圈"內"就可以一次使用三個變數 所以當然也可以在最後一個尾巴的block加上額外的運算方法: for(int i(0),t(0),k(0), (i<10); t = i+1, k = t*2; i++); 理論上既然for迴圈內以逗號隔開應該是會被解析的, 那麼for(; 條件句1,條件句2,條件句3;); 應該這麼寫編譯器應該也是會過的 編譯一下,過了 來分析一下記憶體上是怎麼跑的 用Cheat Engine動態跟蹤一下很快就能找到存取點了(那個k值的地址) :P 跟蹤回去,可以找到int main()架構在這裡 看來Dev C++ 在組合語言上只保留了k == 99這個條件句了 (對於 i < 10這個條件句已經被無視了Otz) 為了避免是Dev C++對於for迴圈解析的問題 另外拿了Visual C++做了測試: 用Cheat Engine跟蹤一下int main()的結果: VC++的解析狀況也是選擇只保留最後一個條件句,把 i < 10條件句給遺忘了T__T 不信邪的再拿CBuilder測一下 用Cheat Engine跟蹤: C++Builder編譯後的結果也是選擇把條件句 i < 10做遺忘,只取最後一個 看起來各個版本的C++IDE做解析都會把 for (int i = 0 ; i < 10 , i < 9, i < 8; i++); 只解析最後一個條件句(意思是如這個for迴圈i只會跑0~7) 查了一下國外討論串 Are multiple conditions allowed in a for loop? 結論也是這樣Otz.

[C++Builder][Delphi]讓IdHTTP可以正常Post出Big5漢字的參數

圖片
因為寫比賽作品需要,要對學校系統做POST封包, 設定指定email文字內容,像底下這樣 不過到了學校系統一看發現... 中文字的部分通通被設置為了問號...Otz. 於是用封包工具攔截一下看出了什麼狀況 原來Indy控件組內的IdHTTP在做POST的時候對漢字解析上有問題... 會自動把漢字變成了問號(找不到對應字詞做發送) 所以能知道的事情是,我們在POST前先做URL Encode, 把原本的文字轉%XX%XX的形式那麼IdHTTP做發送就不會有無法解析中文字的問題. 翻了一下,學校的asp網站採用的編碼為Big5. 所以我們得設計一個URL Encode去把當前UncodeString轉Big5編碼再做URL Encode. 做法上因為我對URL Encode整個機制處理上沒那麼清楚, 所以問了一下C++Builder前輩 蕭沖 大大 Big5編碼URL Encode的Delphi Code寫法在這 (原版) 我重新用C++Builder寫一份 String nURLEncode(String S,bool InQueryString){ String Ret = ""; TByteDynArray bys = TEncoding::GetEncoding(950)->GetBytes(S); //採用Big5(950)設置轉換用途編碼 for (int i = 0; i = 0x41)&&(bys[i] = 0x61)&&(bys[i] = 0x30)&&(bys[i] 針對可能有中文字的參數做了URL Encode ok,發送出去之後,攔截一下封包可以看到很乖的用URL Encode之後的資料送出去 然後回學校網站看一下 Ok,學校網站已經可以正常吃到漢字囉!