2016-07-03 6 views
-5

注入されたDLLの内部からchar *にアクセスしようとしています。 しかし、どういうわけかprintf()をしたくない... ポインタが正しいです、私はそれを今日早く(奇妙なフォーマットを使っていました)印刷しました。char *からのprintfが機能しませんVS2013 C++

作品(それはポインタで何か間違っている必要があり?):

char* TestStr = "dsds"; 
printf("%s \n", TestStr); 

は動作しません:

int ClientDll = (int)GetModuleHandleA("client.dll"); 
int RadarBase = *(int*)(ClientDll + 0x4E8395C); 
int Temp = *(int*)(RadarBase + 0x14); 
int LastText = *(int*)(Temp + 0x11C);//Getting the right pointer from memory 
printf("%s \n", (char*)LastText); 
+0

文字列はヌルで終了しますか?それが "%s"が期待しているものです。また、このキャスティングはすべて役に立ちません。文字列を整数で出力し、最後のTextFieldが簡単なループになっているかどうかを確認し、今は 'printf'をスクラップしてください。次に、あなたは印刷するためにナンセンスに 'printf'を渡しているかどうか、あるいは整数シーケンスは実際には印刷可能なASCII文字のシーケンスであるかどうかを知るでしょう。あなたのタイトルに関しては、 'printf'が常に動作するので、誤解を招きます。問題は、あなたがそれを扱うために与えるものです。 – PaulMcKenzie

+0

私のhexdumpによれば、これはそうであってはならない... '3C 00 66 00 6F 00 6E 00 74 00 20 00 63 00 6F 00 6C 00 6F 00 72 00 3D 00 22 00 23 00 66 00 66 00 64 00 66 00 39 00 33 00 22 00 3E 00' –

+0

その16進数ダンプは、文字列が8ビットASCII文字ではなく16ビット文字を使用していることを示します。 "%s"は最初の0バイト*で停止し、最初に見えるのは '0x3C'の後です。この文字列には、0でないバイトのたびに点在する0バイトのために、ワイド文字列であるというすべての鳴りがあります。つまり、 'L'です。 ' '%s'を使った出力は、完全な文字列の代わりに単一の' <'を表示するはずでした。あなたの投稿でそれを導いたならば、エラーは他の人に明らかであったでしょう。 – PaulMcKenzie

答えて

0

ワイド文字だった。私は%lsを使用しなければならなかった。

0

まず、あなたがた(0xを持っているものをオフセットすることを確認します。 ...) は正しい。整数ポインタへの追加のコンテキストでは、それらは適切なファクタ、すなわちでスケールアップされます。,4。リテラルバイトオフセットを表すハード定数であると想定されている場合、それらのそれぞれに4を(32ビットの整数を仮定して)掛け合わせることになります。

これに加えて、int * thisとint *とその無限の鋳造で、何がこのナンセンスとは何でしょうか?必要なものが特定のベースアドレスからの0xThisMany + 0xThatMany + 0xNextGapバイトの特定のアドレスである場合、それらを一緒に追加して1つの計算を行うだけです。

これはおそらく、あなたの困難の第一人者です。

+0

あなたは完全に間違っています!私は逆参照しています...またlasttextのアドレスは大丈夫です。私はollyにチェックインしました。 –

関連する問題